Amazon SNS のサブスクリプション解除リンクによる誤解除を防ぐ (既にサブスクリプション承認した後の上書きver.)

AWS

2025.5.23

Topics

はじめに

こんにちは。YUJIです。

本記事の前提として、下記のブログ記事でAmazon SNS サブスクリプションのメールに付いたリンクからの誤解除を防ぐための手段をお伝えいたしました。

関連記事
Amazon SNS のサブスクリプション解除リンクによる誤解除を防ぐ (新規サブスクリプションの設定時ver.)

本記事では、例えば

AWSエンジニア「上記の記事を参考に、承認メール文中のリンクはクリックしないで、リンクのアドレスだけください」
メール受信者「あ、もうリンクをクリックして承認してしまった…」

という場合でも、後からAWS CLIによる操作で設定を上書きするための手法を紹介します。

(※本記事の手順では、承認トークンが期限切れになっていない必要があります。はるか昔に設定したAmazon SNS サブスクリプションへの設定上書きが出来る訳ではありません。)

実際の作業

下記のような承認メール文中のリンクをクリックして、確認済みのステータスになっているAmazon SNSを用意します。

■承認メールの画面

■承認リンクをクリックして、承認済みとなったサブスクリプション

これで、先程の会話例のような状態になりました。
まずは、現時点のAmazon SNSのサブスクリプションの情報をAWS CLIで取りに行きます。

aws sns get-subscription-attributes --subscription-arn {サブスクリプションのARN}

ここで囲まれたConfirmationWasAuthenticated が、実質的にメールでの購読解除の可否を握っています。

  • "ConfirmationWasAuthenticated": "false" = メール中のリンクから購読解除が出来てしまう
  • "ConfirmationWasAuthenticated": "true" = メール中のリンクからは購読解除が出来ない。
※ある程度抽象化しているので、厳密な中身が知りたい方は
 本記事の おまけ の章を是非お読みください。

この段階で
・メールのリンクによる認証は通っている
・今後配信されるメールに添付されたリンクから、簡単に配信を停止出来てしまう
という状態です。

簡単にリンクから配信停止できなくなるよう、ここから設定を上書きしていきましょう。
まずは、先ほど承認に使ったメールのリンク中のトークンを取得します。

[h]ttps://sns.ap-northeast-1.amazonaws.com/confirmation.html?TopicArn=arn:aws:sns:ap-northeast-1:xxxxxxxxxxxxx:xxxx-xxxxt&Token={ここからここまでのトークンをコピーして、後のCLIで使用する}&Endpoint=hogefuga@gmail.com

↑ここで抽出したトークンの文字列を利用し、下記のAWS CLIコマンドを実行することで、設定を上書きすることができます。

aws sns confirm-subscription  --token {上でコピーしたトークン} \
--topic-arn {トピックARN} \
--authenticate-on-unsubscribe true

現状のサブスクリプションを確認してみましょう。

aws sns get-subscription-attributes --subscription-arn {サブスクリプションのARN}

↓実際に、メールのUnsubscribeリンクからは解除出来ないかどうかを試してみましょう


これで、メールのUnsubscribeリンクをクリックしても、サブスクリプションが解除されないという状態を実現できました!
もう誤クリックによる通知停止に怯える事はありません。

おまけ

このおまけパートでは、『そもそも何をもってサブスクリプション解除リンクを無効にできたのか』の裏側を解説します。

そもそもメールのリンクによる購読解除が出来ない/出来るは、AuthenticateOnUnsubscribeのTrue/Falseによって制御されています。
(※該当サブスクリプションにおけるこのパラメータを確認することは、マネジメントコンソール上からもAWS CLI上からも不可能です。)

ConfirmSubscription
https://docs.aws.amazon.com/ja_jp/sns/latest/api/API_ConfirmSubscription.html

リクエストにAWS署名がある場合 つまり、AWSの認証情報(IAM)をもって、サブスクリプションの承認が行われた場合に
自動的にAuthenticateOnUnsubscribeはTrueとなり、その結果として購読解除(Unsubscribe)にもAWSの認証情報を使うことが必須となります。

要するに
『そのAmazon SNS サブスクリプションのConfirmationWasAuthenticatedの値で、そのサブスクリプションはAWSの認証情報によって承認されたものか。』という事が確認できれば
該当のサブスクリプションは、メールで購読解除することが許されているのか、それとも許されていないのかを確認できる

という訳です。

GetSubscriptionAttributes
https://docs.aws.amazon.com/sns/latest/api/API_GetSubscriptionAttributes.html

以上、滅茶苦茶マニアックな内容でした。
(どこで使うんだ。この知識。)

おわりに

本記事では、承認用リンクをメールからクリックしてしまった後でもUnsubscribeリンクは無効化できることと、制御の裏側(おまけパート記載)をお伝えいたしました。
これらの情報を活用いただくことで、皆さんのAmazon SNSの活用が少しでも楽になれば幸いです。

最後まで読んでいただき、ありがとうございました。

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

YUJI

2025 AWS Community Builder / 2024 Japan AWS All Certifications Engineer

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら