CloudFormationで作ったSNSトピックのメール送信先が手動変更されてたので整理した話
CloudFormationで管理しているSNSトピックの通知メールアドレスが手動変更され、YAML管理と手動管理が混在していました。カオスです。 この状態を整理して、手動管理onlyにしてみました。
起こったこと
- とあるSNSトピック(メール送信用)をCloudFormationで管理している
- 宛先メールアドレスもCloudFormationで管理している
- Webコンソールによる手動変更を行った
- YAMLファイルにあるメールアドレスと実際のメールアドレスが異なる状態となった(★いまここ)
こうなったのは次の理由が考えられます。
- リリースが2週間ごとのため、それを待てなかった
- 環境毎(開発、ステージング、本番など)に宛先メールアドレスが異なる
- 開発チーム内で共有できていなかった
- 開発チーム以外も変更権限がある
状況を再現し、実験してみる
手動管理にすべきか、CloudFormation管理にすべきかを判断するため、まずは現状を再現しつつ実験を行いました。
SNSトピックをデプロイする
次のYAMLファイルを作成します。
AWSTemplateFormatVersion: "2010-09-09" Description: SNS Sample Stack Resources: NotifyMailSNSTopic: Type: AWS::SNS::Topic Properties: TopicName: notify-mail-sns-topic Subscription: - Endpoint: xxx+sample@hoge.jp Protocol: email
デプロイします。
aws cloudformation deploy \ --template-file sns.yaml \ --stack-name SNS-Sample-Stack \ --no-fail-on-empty-changeset
出来上がったものがこちらです。
Webコンソールで宛先メールアドレスを手動追加する
次の2つ追加しました。これでこのSNSトピックには、CloudFormation管理と手動管理の2つのメールアドレスが混在する状態です。
- xxx+sample2@hoge.jp
- xxx+sample3@hoge.jp
この状態で再デプロイしてみる
sns.yaml
自体は何も変更していないため、再デプロイしても何も起こりません。
Waiting for changeset to be created.. No changes to deploy. Stack SNS-Sample-Stack is up to date
sns.yamlを変更して再デプロイしてみる
sns.yaml
から既存の宛先を削除&新規の宛先を2つ追加してデプロイしてみました。
- 削除
- xxx+sample@hoge.jp
- 追加
- xxx+sample4@hoge.jp
- xxx+sample5@hoge.jp
AWSTemplateFormatVersion: "2010-09-09" Description: SNS Sample Stack Resources: NotifyMailSNSTopic: Type: AWS::SNS::Topic Properties: TopicName: notify-mail-sns-topic Subscription: - Endpoint: xxx+sample4@hoge.jp Protocol: email - Endpoint: xxx+sample5@hoge.jp Protocol: email
結果は下記です。
- sns.yamlから削除したメールアドレス:消える
- sns.yamlに追加したメールアドレス:追加される
- Webコンソールで手動追加したメールアドレス:残り続ける
手動管理に決めた
下記のため手動管理に決めました。
- いつでも好きなときに変更ができる(リリース日を待たなくて良い)
- 環境毎(開発、ステージング、本番など)の宛先メールアドレスを簡単に設定できる
- メールアドレスは多くても5つであり、手動管理が手間ではない
sns.ymlを変更する
Subscription
を削除してコメント記入しています。
AWSTemplateFormatVersion: "2010-09-09" Description: SNS Sample Stack Resources: # 宛先メールアドレスは、Web画面で編集すること NotifyMailSNSTopic: Type: AWS::SNS::Topic Properties: TopicName: notify-mail-sns-topic
続いてデプロイします。
aws cloudformation deploy \ --template-file sns.yaml \ --stack-name SNS-Sample-Stack \ --no-fail-on-empty-changeset
CloudFormationで管理していたメールアドレスが消え、手動追加したメールアドレスのみが残っています。 これ以降は手動でメールアドレスを追加・削除していけばOKですね。
さいごに
今担当しているプロジェクトでは手動管理を選びましたが、このあたりはプロジェクトの特性や環境によって異なると思います。 ついでに、CloudFormationの動作(手動変更してからデプロイした場合の動き)も分かったので良かったです。