CloudFormationで作ったSNSトピックのメール送信先が手動変更されてたので整理した話

CloudFormationで管理しているSNSトピックの通知先メールアドレスが手動変更され、YAML管理と手動管理が混在していました。 そのため、この状態を整理して、手動管理onlyにしてみました。
2020.02.05

CloudFormationで管理しているSNSトピックの通知メールアドレスが手動変更され、YAML管理と手動管理が混在していました。カオスです。 この状態を整理して、手動管理onlyにしてみました。

起こったこと

  1. とあるSNSトピック(メール送信用)をCloudFormationで管理している
  2. 宛先メールアドレスもCloudFormationで管理している
  3. Webコンソールによる手動変更を行った
  4. YAMLファイルにあるメールアドレスと実際のメールアドレスが異なる状態となった(★いまここ)

こうなったのは次の理由が考えられます。

  • リリースが2週間ごとのため、それを待てなかった
  • 環境毎(開発、ステージング、本番など)に宛先メールアドレスが異なる
  • 開発チーム内で共有できていなかった
  • 開発チーム以外も変更権限がある

状況を再現し、実験してみる

手動管理にすべきか、CloudFormation管理にすべきかを判断するため、まずは現状を再現しつつ実験を行いました。

SNSトピックをデプロイする

次のYAMLファイルを作成します。

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

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+sample4@hoge.jp
          Protocol: email
        - Endpoint: xxx+sample5@hoge.jp
          Protocol: email

結果は下記です。

  • sns.yamlから削除したメールアドレス:消える
  • sns.yamlに追加したメールアドレス:追加される
  • Webコンソールで手動追加したメールアドレス:残り続ける

手動管理に決めた

下記のため手動管理に決めました。

  • いつでも好きなときに変更ができる(リリース日を待たなくて良い)
  • 環境毎(開発、ステージング、本番など)の宛先メールアドレスを簡単に設定できる
  • メールアドレスは多くても5つであり、手動管理が手間ではない

sns.ymlを変更する

Subscriptionを削除してコメント記入しています。

sns.yaml

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の動作(手動変更してからデプロイした場合の動き)も分かったので良かったです。