#背景・やりたいこと
何かある度に(例えば、ヘルスチェックのエラーだったり、負荷が高くなったり、オートスケールが走ったり)
管理用のメールアドレスに通知を飛ばしたかったりする。
もちろんそういう場合はCloudWatchなどで監視して、SNSに通知を飛ばし、そこからメールを飛ばす構成が一般である。
SNSにアクセスして、新しくトピックを作成し、更にそこに新しいサブスクリプションを追加し、
送信したいメールアドレスを追加して、認証メールを受け取って承認すれば、
このトピックあての通知は設定したメールに通知されるようになる。
後はCloudWatchのアラームが上がったときなどにこのトピックあてに通してあげればよいわけだ。
しかし、アカウントがひとつの場合は、ここまでの設定でやりたいことが解決するのだが
AWSアカウントを様々な事情で複数持っていると、特に2桁を超えてくると厄介である。
例えばメール通知したいアドレスが変わったり、増えたりしたら、すべてのアカウントに入って
その都度設定しなおさなければならない。
しかも受け取り側に、認証メールが何十通も届くことになる。
そこで、1つのAWSアカウントを代表アカウントとして、
その中で構築したSNSに対して、他のアカウントの通知を送り付けたくなる。
ということで、そんなことができるよう設定してみる。
#設定方法
トピックをAWSマネジメントコンソールにて新規作成する場合、
トピックお作成 > アクセスポリシー - オプション
より
設定項目 | 選択する値 |
---|---|
メソッドの選択 | 基本 |
トピックにメッセージを発行できるユーザーを定義します | 全員 |
このトピックにサブスクライブできるユーザーを定義します | トピック所有者のみ |
とすることで、他のAWSアカウントから通知を受け取れるようになる。
既存のトピックを共有したい場合は、アクセスポリシーを直接いじることになる。
初期のなにもいじっていないポリシーの場合
"Statement":[ {"Sid": "__default_statement_ID", "Effect": "Allow", ... }, ]
という値が入っているはずなので、このリストに以下の内容を追加する。
{
"Sid": "__console_pub_0",
"Effect": "Allow",
"Principal": { "AWS": "*" },
"Action": "SNS:Publish",
"Resource": "arn:aws:sns:<<使用リージョン名>>:<<AWSアカウントID>>:<<SNS名>>"
}
※<<使用リージョン名>> <<AWSアカウントID>> <<SNS名>>は適宜値を入れ替えてください
セキュリティ的にすべてのAWSアカウントより通知を受け取るのがまずいという場合は
{ "AWS": "*" }
を
{ "AWS": [ "111111111111", "22222222222222", ... , "777777777777" ] }
の様に書き換えると、リストに指定したAWSアカウント以外からの通知をはじくようになる。
後は他のAWSアカウントで、上記で設定したSNSを通知する先に設定してあげればよい。
設定する場合はARNを用いることになるので、確認をしておこう。
#まとめ
想像以上に簡単に設定できました。
boto3でCloudwatchのアラームを自動生成する(後日執筆予定)時に指定するSNSとしても最適ですね。