以下の図のように複数AWSアカウントの複数リージョンでCloudWatchのアラームを利用している。
何も考えずに各環境でSNSを設定してたら、サブスクライブやメールアドレス変更が大変になってしまったのでまとめられないか考えてみた。
AWSアカウント間でSNSを共通に利用する
別アカウントのSNSを利用する
上の図のように別アカウントで作成されたSNS アプリを利用することでがきる。
Management ConsoleだとSNS Topicを作成してTopic Policy編集でPublish Messagesを許可するユーザをAWSユーザにして利用したいAWSアカウントのIDを指定する感じでいける。
ただし、CloudWatchの利用では以下のことに注意する必要がある。
- 同じリージョンのSNS Topicを作成する必要がある。
- 別アカウントのSNS Topicを指定する場合はManagement Consoleからはできない(aws cliなどでは可能)。
別アカウントにSubscriptionだけ作成する
上の図のようにSNSのSubscriptionだけ別アカウントに作成できる。
Management ConsoleだとSNS Topicを作成してTopic Policy編集で利用するAWSアカウントIDに対してsubscribeを許可し、許可したアカウントでSubscriptionを作成する感じでいける。
同じアカウントにSubscriptionの設定はまとめられる。
ただし、SubscriptionはTopic毎に作成する必要があるため、あるアカウントのTopicと別のアカウントのTopicに対するSubscriptionの2つになる。
リージョン間でSNS通知をまとめる
SQSでまとめる
AWS - SNSから他のアカウントのSQSへメッセージを送るのをやってみる - Qii参照
ただし、SQSから取り出して通知するシステムがいりエコじゃない感じ。
Lambdaでまとめる
上の図のようにSNSから別のRegionのlambda Functionが利用できるので以下のようなFunctionで通知をまとめる。
console.log('Loading function');
var AWS = require ('aws-sdk')
exports.handler = function(event, context) {
console.log(JSON.stringify(event, null, 2));
console.log('From SNS:', event.Records[0]);
var sns = new AWS.SNS({region: 'Region指定'});
var params = {
TopicArn: 'SNS Topic ARN指定',
Subject: event.Records[0].Sns.Subject,
Message: event.Records[0].Sns.Message
};
sns.publish(params, function(err, data) {
if (err) console.log(err, err.stack);
else console.log(data);
});
context.succeed();
};