本ページは、AWS に関する個人の勉強および勉強会で使用することを目的に、AWS ドキュメントなどを参照し作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報については、AWS 公式ドキュメントをご参照ください。
A2A および A2P メッセージング用のフルマネージド Pub/Sub サービスです。
【AWS Black Belt Online Seminar】Amazon Simple Notification Service (SNS)(YouTube)(48:02)

SQS は名前に Q (Queue) とあるように、キューイングサービスです。受け取り側はキューをある間隔でポーリングして監視したり、好きなタイミングで一気に取得したりすることができます。(プル式)
SNS はメッセージングサービスで、メッセージが配信されたら受信者へ送信するプッシュ式です。イベント駆動アーキテクチャを構築できます。
通信チャネルとして機能する論理アクセスポイントです。
メッセージをトピックに発行することです。
トピックに発行されたメッセージの受信者(サブスクライバー)を複数登録できます。 サブスクライバーへの配信はデフォルトで 3 回再試行されます。配信に失敗したメッセージは、後述のデッドレターキューが設定されていない場合は破棄されます。
サブスクライバーに指定できるものは以下となります。
HTTPS が利用されます。サブスクリプションに E メールを登録した場合、指定した E メールアドレスに [サブスクリプションの確認] メールが送信されます。

メール本文にある Confirm subscription の URL をクリックすることで、メッセージの受信を開始することができます。誤ってクリックしてしまった場合は、click here to unsubscribe をクリックします。

メール配信開始後に中止したい場合は、通知メール下部にある please click or visit the link below to unsubscribe: の URL をクリックすることで受信を解除できます。

このように簡単に受信の開始と解除ができるのですが、システム管理者用のメーリングリストなどを登録している場合、この手軽さが困るケースが出てきます。
例えば、
といったことが予想されます。 これを防ぐには、次の2つのうちいずれかで、受信開始操作を行うことで勝手に解除されないようにすることができます。
どちらの方法を選択する場合でもまずは、[サブスクリプションの確認] メールのConfirm subscription の URL をクリックではなく、右クリックして URL をコピーする必要があります。(ここでクリックしてしまった場合は、サブスクリプションの削除 → 作成からやり直しです。)

コピーした URL は次のような構造になっています。
https://sns.ap-northeast-1.amazonaws.com/confirmation.html?TopicArn=arn:aws:sns:ap-northeast-1:123456789012:トピック名&Token=トークン&Endpoint=メールアドレス

ConfirmationWasAuthenticated という属性が [true] になるので、サブスクリプションの解除ができなくなります。authenticate-on-unsubscribe true を付けるのがポイントです。aws sns confirm-subscription \
> --topic-arn <TopicArnのパラメータ値を指定します> \
> --token <Tokenのパラメータ値を指定します> \
> --authenticate-on-unsubscribe true \
> --region <Topicのリージョンを指定します>
{
    "SubscriptionArn": "arn:aws:sns:ap-northeast-1:123456789012:トピック名:12345678-1234-1234-1234-123456789012"
}
解除するには、登録時と同じように AWS マネジメントコンソールか AWS CLI を使います。
JSON で定義したポリシーでメッセージの配信を制御できます。
[https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-subscription-filter-policies.html]
ポリシーのスコープは次の2つのどちらかを選択できます。
メッセージ属性を選択する場合は、メッセージを SNS トピックに発行する際、MessageAttributes というフィールドを追加する必要があります。
MessageAttributes には 次のように Key-Value 形式で登録します。
"MessageAttributes": {
  "key1": {
      "Type": "String",
      "Value": "\"Value1\""
  },
  "key2": {
      "Type": "String",
      "Value": "[\"Value2\", \"Value3\"]"
  }
}
例えば、デベロッパーガイドにあるメッセージ属性を指定した場合にメッセージを拒否するサブスクリプションフィルターは以下のようになります。
   "MessageAttributes": {
      "customer_interests": {
         "Type": "String.Array",
         "Value": "[\"soccer\", \"rugby\", \"hockey\"]"
      },
      "store": {
         "Type": "String",
         "Value":"example_corp"
      },
      "event": {
         "Type": "String",
         "Value": "order_placed"
      },
      "price_usd": {
         "Type": "Number",
         "Value": "210.75"
      }
   }
{
  "store": ["example_corp"],
  "event": ["order_cancelled"],
  "encrypted": [false],
  "customer_interests": ["basketball", "baseball"]
}
この例の場合、"MessageAttributes" 内に "encrypted" プロパティが存在していないため、その他の値に関わらず拒否されるポリシーとなっています。 存在しないポリシーを指定して、一時的に配信を止める場合に利用することもできます。
メッセージの受信者に正常に配信できなかった場合に格納する SQS のキューを指定できます。 これにより、エラーの分析や、再処理などを行うことができます。
[https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-dead-letter-queues.html]
AWS KMS を利用して、トピック内のメッセージを暗号化することができます(サーバ側の暗号化(SSE)) 暗号化されたメッセージは、配信時に自動的に復号されて配信されます。
指定できるキーは、デフォルトの alias/aws/sns と 作成済みの CMK を指定できます。
ただし、暗号化を行う場合は使用する暗号化キーに対する「kms:Decrypt」と「kms:GenerateDataKey」を適切に許可することが必要です。 これを行わなかった場合に、次のように配信されないことがあります。
