AWS CDKで作ったAmazon SNSのUnsubscribeリンクを無効化してみた
こんにちは!製造ビジネステクノロジー部の小林です。
SNSトピックからの通知メールには「Unsubscribe」リンク(購読解除リンク)が標準で含まれています。このリンクを誤ってクリックしてしまい、気づかないうちに重要な通知の購読を解除してしまったこと...
ありますよね!!!
今回はそんなUnsubscribeリンクを無効化する手順をご紹介します。
Unsubscribeリンクの無効化とは?
「Unsubscribeリンク無効化」と言っても、リンク自体を完全に削除/非表示にするわけではありません。具体的には、Unsubscribeリンクをクリックした際に認証を要求し、適切な認証情報がない限り購読解除ができないようにする仕組みを実装します。これにより、意図しない購読解除を防ぎます。
SNSトピックの実装
AWS CDKによるSNSトピックの実装です。
import { Construct } from 'constructs';
import * as sns from 'aws-cdk-lib/aws-sns';
import * as subscriptions from 'aws-cdk-lib/aws-sns-subscriptions';
/**
* SNSトピックとメール通知を設定するスタック
*/
export class SnsEmailNotificationStack extends Construct {
constructor(scope: Construct, id: string) {
super(scope, id);
// SNSトピックの作成
const topic = new sns.Topic(this, 'MyTopic', {
displayName: 'お知らせトピック', // 通知メールに表示される名前
});
/**
* メールアドレスをトピックにサブスクライブ
*
* このメールアドレスは、実際のメールアドレスに置き換えてください。
*/
topic.addSubscription(new subscriptions.EmailSubscription('メールアドレス'));
}
}
重要:購読確認プロセスの手順
上記のSNSトピックをデプロイすると、設定したメールアドレスに購読確認(Confirm)メールが届きます。
確認メール内の「Confirm subscription」ボタンを直接クリックしないでください!
Eメール内のリンクを直接クリックすると、内部的には --authenticate-on-unsubscribe false の状態でサブスクリプションが設定され、誰でも簡単に購読解除できる標準的なサブスクリプションが作成されてしまいます。
下記は公式ドキュメントから引用。
--authenticate-on-unsubscribe(string)
認証されていないサブスクリプションの解除を禁止します。このパラメータの値が true、リクエストにAmazon Web >Servicesの署名がある場合、トピック所有者とサブスクリプション所有者のみがエンドポイントのサブスクリプションを解除で>きます。サブスクリプション解除アクションにはAmazon Web Servicesの認証が必要です。
AWS CLIで無効化とサブスクリプションを有効にする
Unsubscribeリンクを無効化するには、以下の手順で進めます。
1. 確認メールからトークンを抽出する
購読確認メール内のリンクをコピーし、トークン部分を抽出します。
トークンの見つけ方は以下の通りです。
確認メール内のUnsubscribeリンクをコピーします。
リンク内の &Token= の後から &Endpoint= の前までの文字列がトークンです。
https://sns.ap-northeast-1.amazonaws.com/confirmation.html?TopicArn=arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:SnsEmailNotificationStack-MyTopic86869434-iip8grRdT796&Token=2336412f37fb687f5d51e6e2425a8a5875c3b7913713d484a7880a1f2a857822b9d93662ef02e0b77268fa37066c777505753b01e52cc749ab297c33288dca32f2055784266a7baea01bb872f5804223d393b5c5b33862a78f041086416a4c29c301a9833a8fa69a361f029b5fedbda79a93baf6a4606c48114dd79f233d4bb4bc89ee9856a63dbe8d78888a4b783d141320599a3609711edb6fd4c58952cfb3&Endpoint=メールアドレス@co.jp
2. AWS CLIコマンドを実行する
取得したトークンとSNSトピックのARN情報を使って、以下のコマンドを実行します。
aws sns confirm-subscription \
--token "抽出したトークン" \
--topic-arn "デプロイ時に出力されたTopicArn" \
--authenticate-on-unsubscribe true \
--region "トピックのリージョン"
出力例
{
"SubscriptionArn": "arn:aws:sns:ap-northeast-1:XXXXXXXXXXXXXX:SnsEmailNotificationStack-MyTopic86869434-iip8grRdT796:a3c81770-ac1c-4515-8b41-2bd62a10da54"
}
上記のコマンドを正常に実行できれば、確認メールの「Confirm subscription」ボタンを押す必要はありません。CLIコマンドによってサブスクリプションは既に有効化されており、購読も完了しています。
これでUnsubscribeリンクの無効化が完了しました!これにより、Unsubscribeリンクをクリックしても認証なしでは購読解除ができなくなります。
動作確認
設定が正しく機能しているか確認するため、テスト通知を送信してみましょう。
aws sns publish \
--topic-arn “SNSTopicのArn" \
--message "これはテスト通知です!" \
--subject "テスト通知"
出力例
{
"MessageId": "867f7940-0a32-5a28-aa96-19e7e088157d"
}
テスト通知が届いたら、Unsubscribeリンクをクリックしてみましょう。
すると、次のように購読解除がブロックされたことを示すメッセージが表示されます。
購読解除方法
以下のコマンドで、認証を要求するように設定したSNSトピックの購読を解除できます。
aws sns unsubscribe --subscription-arn "サブスクリプションのARN"
おわりに
今回はSNSの通知メール内にあるUnsubscribeリンクを無効化する手順をご紹介しました。これでUnsubscribeリンクを気にしなくてよくなりますね!SNSトピックのUnsubscribeリンクを無効化したい方の参考になれば幸いです。