SNS通知メールのunsubscribeリンクを無効化してみた

AWSの様々な通知に使用されているSNSというサービスがありますが、メーリングリストなどで受信した誰かが通知のリンクをうっかり踏んでしまうと、

みたいな画面が表示されてしまったが最後、その後の通知は全く来なくなってしまって、障害アラートに気付かないなんて事が起こります。
こんな悲劇を繰り返さないために、SNSの通知を簡単にはunsubscribe出来なくする方法をご紹介します。

用意するもの

AWS CLI

何をどうするか

SNSAPIには、ConfirmSubscriptionアクションがあり、任意指定オプションにAuthenticateOnUnsubscribeという項目があります。

AuthenticateOnUnsubscribe
Disallows unauthenticated unsubscribes of the subscription. If the value of this parameter is true and the request has an AWS signature, then only the topic owner and the subscription owner can unsubscribe the endpoint. The unsubscribe action will require AWS authentication.

つまり、これをtrueとしてConfirmSubscribeすると、AWSの認証がないとunsubscribe出来なくなる、というオプションです。
これはsubscribe時にしか指定できないので、既にsubscribeしているendpoint(email)は、いったんunsubscribeしてから次に進んでください。

設定手順

■ emailアドレスを指定して、新たにsubscribeをします(AWS Management Consoleからが楽でしょう)。
■ 受信したメールアドレスに含まれるリンクを確認します(リンクを開けてはいけません)
■ リンクの中のTopicArnとTokenの値を使って、コマンドを実行します。

aws sns confirm-subscription
--token
--topic-arn
[--authenticate-on-unsubscribe ]

(実行例)

$ aws sns confirm-subscription --topic-arn arn:aws:sns:ap-northeast-1:083296890845:DoNotUnsubscribe --token 2336412f37fb687f5d51e6e241d164b14be0f8457647cab69bf930a5760a80260a1f84d084f873110e2ca36d7a909ece94b003cb7f06f1a218230787e1281683cd84f8331f19f699edddfb4952a60287c6319f0abc8e0d892253b6e381a95ea071af415502592c923bfe05b0bacab78fc3a2274037c54d046ed25ba81bfde6d7 --authenticate-on-unsubscribe true --region ap-northeast-1
arn:aws:sns:ap-northeast-1:083296890845:DoNotUnsubscribe:56958865-2e95-4916-adad-cce7856e7db2
RESPONSEMETADATA	7e18e28c-41b0-5e27-bd22-a89299e51887

■ 試験的にメッセージをpublishして、送られてきたメールのunsubscribeリンクをクリックしてみます。下記のように表示されればOKです。

unsubscribeするには?

APICLIからも可能ですが、AWS Management ConsoleからDelete Subscriptionするのが楽です。