AWS CDKでCloudWatchのアラームからクロスアカウントのSNSを呼び出す方法
AWS Organizationsを使って複数のAWSアカウントを管理する際に、異なるアカウント間でSNSを使った通知を簡単に設定する方法が紹介されます。アクセスキーの漏洩や出費のリスクを軽減し、AWS CDKを活用してSNSをCloudWatchのアラームに指定します。異なるリージョン間では設定ができず、必要であれば同一リージョンのSNSを経由して通知を行います。
目次
AWS Organizationsを使ってプロジェクトごとにAWSアカウントを分割して運用している場合などで、SNSを使った通知をシンプルにするための方法として紹介します。これは「AWS Lambda と Serverless Advent Calendar 2024」12日目の記事です。
なぜクロスアカウントSNSをやりたいか?
個人開発でAlexaスキルやWebサイト・アプリ開発などをいろいろやっています。その中で、アクセスキーの漏洩リスクや意図しない出費が発生した場合の原因調査を簡単にするため、AWS Organizationsを使って複数AWSアカウントを運用しています。
コストの調査などでは便利なのですが、AWS Chatbotを使ったSlack通知については、アカウントごとにSlack連携をセットアップすることになりそうでした。それは流石に面倒なので、設定ずみのAWSアカウントにあるSNSをクロスアカウントで呼び出す方向で進めます。
AWS CDKで、作成ずみのSNSをCloudWatchのアラームに指定する
AWS CDKを使ってアラームを設定します。fromTopicArn
を使ってARNを渡せば、別アカウントでもOKでした。
this.errorAlarm = new cloudwatch.Alarm(this, 'ErrorAlarm', {
metric: errorFilter.metric({
statistic: 'sum',
period: cdk.Duration.minutes(5),
}),
threshold: props.errorThreshold ?? 0,
evaluationPeriods: props.evaluationPeriods ?? 1,
alarmDescription: props.alarmDescription || `Alarm when an error occurs in ${props.function.functionName}`,
});
// 既存のSNSトピックの参照
const notificationTopic = sns.Topic.fromTopicArn(
this,
'NotificationTopic',
notificationTopicArn
);
// アラームにSNSアクションを追加
this.errorAlarm.addAlarmAction(new cw_actions.SnsAction(notificationTopic));
CloudWatchのアラームに指定するSNSは、同一リージョンに配置しよう
アカウントが別でも設定ができます。ただしリージョンは同一じゃないとエラーになる様子でした。
23:00:09 | CREATE_FAILED | AWS::CloudWatch::Alarm | ErrorAlarmC73DBEA2
Resource handler returned message: "Invalid region us-west-2 specified. Only ap-northeast-1 is supported. (Service: CloudWatch, Sta
tus Code: 400, Request ID: 77846da8-806d-461b-8ead-46e9b11f5d39)" (RequestToken: 8a3a55a8-8aed-d7bf-08c8-18cead9cecaa, HandlerError
Code: GeneralServiceException)
もしリージョンが別になる場合は、一旦同一リージョンにSNSを追加して、そこから目標のSNSへ通知を流しましょう。