はじめに
Amazon SNS で送信されるメールの本文にはサブスクリプション解除リンクが含まれており、
受信者はこのリンクにアクセスすることでメール通知を停止させることが出来ます。

実際は、誤ってリンクをクリックしてしまった場合などに備えて解除リンクの無効化を行うことが多いかと思います。
以下では、AWS CLI によるリンクの無効化が紹介されています。
~サブスクリプション解除されないようにするにはどうすればよいですか ?
しかし、SNS を設定する度に AWS CLI を使うのは個人的には億劫です。
IAM アクセスキーを利用してローカルで CLI を使うにしても、
IAM ロールをアタッチした EC2インスタンスから CLI を使うにしても、
本来不要なリソースを作成しなければいけないからです。
SSM Automation を利用すれば、作成するリソースを最小限に抑えて解除リンクの無効化が実施できます。
以下でその方法について説明します。
SSM Automation による SNS サブスクリプション解除リンクの無効化
Automation ドキュメントの作成
[Create automation] でドキュメント作成を開始します。
任意のドキュメント名を入力し、[コンテンツ] -> [Edit] と進みます。

以下のような画面になりますが、エラーではなく警告なので、そのまま進みます。

以下の内容を貼り付け、[Create automation] でドキュメントを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
description: Automation Document for SNS ConfirmSubscription schemaVersion: '0.3' assumeRole: "{{ AutomationAssumeRole }}" parameters: AutomationAssumeRole: type: String description: "(Optional) The ARN of the role that allows Automation to perform the actions on your behalf." default: "" TopicArn: type: String description: "(Required) Arn of SNS Topic." default: "" Token: type: String description: "(Required) Token in confirmation URL link." default: "" mainSteps: - name: ConfirmSubscription action: 'aws:executeAwsApi' inputs: Service: sns Api: ConfirmSubscription AuthenticateOnUnsubscribe: "true" Token: "{{ Token }}" TopicArn: "{{ TopicArn }}" |

SNS サブスクリプション解除リンクの無効化
SNS でトピック・サブスクリプション(Eメール)を作成しておきましょう。
サブスクリプション確認メールの本文、[Confirm subscription] のURLリンクをクリックせずにリンク内のトークンを控えておきます。

先ほど作成したドキュメントを [自己所有] タブから見つけ、クリックします。

[オートメーションを実行する] を選択します。

SNS トピックの ARN と、先ほど控えたトークンを入力して [実行] します。
これで、サブスクリプション解除リンクを無効化した状態でサブスクリプションが登録されているはずです。

Automation ドキュメントの共有
以上のように Automation ドキュメントを作成しておけば、
次に解除リンクを無効化する時は同じドキュメントを使いまわせばいいので楽です。
また、ドキュメントはAWSアカウント間での共有が可能なので、
あるアカウントでドキュメントを作成しておけば
その他のアカウントにはドキュメントさえ作らなくてよいことになります。
共有の方法には「プライベート」「パブリック」の2つがあります。

「プライベート」での共有
特定のAWSアカウントへドキュメントを共有できます。
共有された側のアカウントの [Shared with me] タブから当該ドキュメントを参照・利用可能です。

「パブリック」での共有
全てのAWSアカウントへドキュメントを公開できます。
他のアカウントからは [すべてのドキュメント] タブで [パブリックドキュメント] を選択することで参照・利用可能です。

投稿者プロフィール
- 2015年8月入社。弊社はインフラ屋ですが、アプリも作ってみたいです。