Amazon SNS メール通知の「unsubscribe」リンクを無効化する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon SNS のメール通知の本文には 通知を停止する「unsubscribe」リンク がありますが、この「unsubscribe」リンクをクリックしてもメール通知を停止できないように設定することができます。とても「今更」感があるのですが、度々説明することが多いので備忘録も兼ねてご紹介します。

Amazon SNS のメール通知の停止とは

Amazon SNS のメール通知は、登録したメールアドレスに対して通知メールを送るサービスですが、メール通知を停止したい場合は、「unsubscribe」リンクをクリックすることで通知を任意で停止することができます。

unsub-mail-2

そして、削除が成功するとウェブブラウザが起動して、以下の画面が表示されます。

unsub-subscription-removed

【問題】通知用メーリングリストが配信停止の事態に!

しかし、通知用メールアドレスにメーリングリストなどを登録している場合、メーリングリスト中の誰かが「unsubscribe」リンクをクリックしてしまうとメーリングリスト全員に通知されなくなります。例えば、アラートメールなどを通知停止されると大変です。そこで、この「unsubscribe」リンクをクリックしてもメール通知を停止できないようにする必要があります。

「unsubscribe」リンクを無効化する手順

Amazon SNS は「Topic」(題目)に対して、メッセージを「Publish」(発行)しますので、マネジメントコンソールから「Topic」ごとに「Subscription」(通知先)であるメールアドレスを登録します。 リンクを無効化リンクをする手順は以下のとおりです。

※ 補足:上記で登録したメールアドレスがメーリングリストの場合、手順1の後に2と3を手早く行ったほうが良いでしょう。理由はConfirm subscription メールの受信後にメーリングリスト内の誰かによって先に Confirm Subscription リンクをクリックされてしまうと、リンクが「有効」に設定されてしまうからです。この場合は、手順0からやり直すことで再登録できますのでご安心ください。

0. 登録済みメールアドレスを削除する

通知メール設定済みの場合は、登録済みメールアドレスを削除します。マネジメントコンソールからSubscription ID(通知メールアドレス)を選択して、[Other Subscription Actions]ボタンを押して、「Delete Subscriptions」を選択して削除します。通知メールが未設定の場合はこの操作は不要です。 unsub-delete-subscriptions

1. Subscriptionのメールアドレスの登録する

通知メールアドレスを登録します。マネジメントコンソールからTopicを選択して、[Create subscription]ボタンを押すとダイアログが表示されます。通知方法はEメールにするので「Protocol」に「Email」を指定し、通知先メールアドレスは「Endpoint」に通知先のメールアドレスを指定してください。 unsub-create-subscription

2. Confirm subscription メールの受信

登録したメールアドレスに受信した「AWS Notification - Subscription Confirmation」というサブジェクトのメールが届きます。 unsub-subscription-confirmation 「Confirm subscription」というリンクを右クリックして、「リンクのアドレスをコピー」を選んで、テキストエディタに貼り付けてください。

https://sns.ap-northeast-1.amazonaws.com/confirmation.html?TopicArn=arn:aws:sns:ap-northeast-1:111111111111:DevIO&Token=tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt&Endpoint=foo@gmail.com

3. AWS CLI で subscription の確認

テキストエディタに貼り付けた内容を基に AWS CLI で subscription の確認を行います。authenticate-on-unsubscribe オプションに「true」に設定することで、unsubscribe リンクを無効化されます。

aws sns confirm-subscription \
> --topic-arn arn:aws:sns:ap-northeast-1:111111111111:DevIO \
> --token tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt \
> --authenticate-on-unsubscribe true \
> --region ap-northeast-1
{
    "SubscriptionArn": "arn:aws:sns:ap-northeast-1:111111111111:DevIO:33333333-4444-5555-6666-777777777777"
}

4. 動作確認

受信したメール通知の本文には、相変わらず「unsubscribe」リンクがありますが、クリックするとウェブブラウザが起動して、「Subscription not removed」とメッセージが表示され、通知メールの削除に失敗します。unsub-subscription-not-removed

リンクをクリックして「Subscription removed!」とメッセージが表示されたら設定が有効になっていないので、通知は停止されてしまったようです。この場合は、手順1からやり直すことで再登録できます。

通知メールを停止したくなった場合はどうする?

通知メールを受信している人が通知メールを停止することはできませんので、「0. 登録済みメールアドレスを削除する」と同様に、マネジメントコンソールから Subscription ID(通知メールアドレス)を選択して、[Other Subscription Actions]ボタンを押して、「Delete Subscriptions」を選択して削除してください。

最後に

今回ご紹介した「unsubscribe」リンクを無効化する方法ですが、なぜAWSはマネジメントコンソールから無効化する設定を標準機能として提供しないのかという疑問を持つ方もいるかもしれません。その理由は、通知メールを安定して送信するには、スパムメールの送信者として扱いを受けないように、常に苦情(Complaint)の比率を低く保ち続ける運用が必要となります。これは、Amazon SNSに限られたことではなく、一般的な配信メールの最後にも、「メールの配信を停止するには...」のようにメール受信者が配信を停止する手段を提供していることからも明らかです。しかし、メーリングリストなどのユースケースでは、問題となる場合があるので、Amazon SNSでは例外的に「unsubscribe」リンクを無効化する方法を提供しているのではないかと私は理解しています。