

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon SNS メッセージ配信
<a name="message-delivery"></a>

このトピックでは、Amazon SNS がさまざまなシナリオでメッセージ配信を処理する方法について説明します。Amazon SNS がメッセージを元の変更されていない形式でエンドポイントに配信する、raw メッセージの配信について説明します。また、Amazon SNS トピックから別の の Amazon SQS キューにメッセージを送信し AWS アカウント、クロスアカウントメッセージングに関するインサイトを提供する方法についても説明します。

このトピックでは、さまざまな の Amazon SQS キューまたは Lambda 関数への Amazon SNS Amazon SQS メッセージの配信 AWS リージョン、クロスリージョン配信の仕組み、および関連する考慮事項について説明します。

さらに、メッセージが正常に配信されたか、問題が発生したかに関する重要な情報を取得するため、メッセージ配信ステータスを監視して解釈する方法についても説明します。メッセージ配信が失敗した場合に、Amazon SNS がメッセージを自動的に再配信して目的の宛先に確実に届くようにする方法など、メッセージ配信の再試行プロセスを理解できます。このトピックでは、デッドレターキューを使用して、複数回の試行後に配信できなかったメッセージをキャプチャする方法について説明します。これらの障害を効果的に分析してトラブルシューティングできるようになります。

# Amazon SNS raw メッセージの配信
<a name="sns-large-payload-raw-message-delivery"></a>

[Firehose 配信ストリームへのファンアウト](sns-firehose-as-subscriber.md)、[Amazon SQS](sns-sqs-as-subscriber.md)、および [HTTP/S](sns-http-https-endpoint-as-subscriber.md) エンドポイントによるメッセージの JSON フォーマット処理を回避するために、Amazon SNS は raw メッセージの配信を許可します。
+ Amazon SQS エンドポイントに対して raw メッセージの配信を有効にすると、発行されたメッセージからすべての Amazon SNS メタデータが削除され、メッセージはそのまま送信されます。
+ HTTP/S エンドポイントに対して raw メッセージの配信を有効にすると、値が `true` に設定された HTTP ヘッダー `x-amz-sns-rawdelivery` がメッセージに追加されます。これは、メッセージが JSON フォーマットなしで発行されたことを示します。
+ HTTP/S エンドポイントに対して raw メッセージの配信を有効にすると、メッセージ本文、クライアント IP、および必要なヘッダーが配信されます。メッセージの属性を指定すると、そのメッセージは送信されません。
+ Firehose エンドポイントの raw メッセージ配信を有効にすると、メッセージ本文が配信されます。メッセージの属性を指定すると、そのメッセージは送信されません。

 AWS SDK を使用して raw メッセージ配信を有効にするには、 `SetSubscriptionAttribute` API アクションを使用し、 `RawMessageDelivery` 属性の値を に設定する必要があります`true`。

## を使用した raw メッセージ配信の有効化 AWS マネジメントコンソール
<a name="raw-message-console"></a>

1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/home)にサインインします。

1. ナビゲーションパネルで、[**トピック**] を選択します。

1. **[トピック]** ページで、Firehose、Amazon SQS、または HTTP/S エンドポイントにサブスクライブするトピックを選択します。

1. [***MyTopic***] ページの [**サブスクリプション**] セクションでサブスクリプションを選択したら、[**編集**] を選択します。

1. [**Edit *EXAMPLE1-23bc-4567-d890-ef12g3hij456***] ページの [**詳細**] セクションで、[**raw メッセージ配信の有効化**] を選択します。

1. [**変更を保存**] をクリックします。

## メッセージ形式の例
<a name="raw-message-examples"></a>

以下は、同じメッセージが同じ Amazon SQS キューに 2 回送信されている例です。唯一の違いは、最初のメッセージでは raw メッセージ配信が無効になり、2 番目のメッセージでは有効になっていることです。
+ raw メッセージの配信を**無効にします**。

  ```
  {
    "Type": "Notification",
    "MessageId": "dc1e94d9-56c5-5e96-808d-cc7f68faa162",
    "TopicArn": "arn:aws:sns:us-east-2:111122223333:ExampleTopic1",
    "Subject": "TestSubject",
    "Message": "This is a test message.",
    "Timestamp": "2021-02-16T21:41:19.978Z",
    "SignatureVersion": "1",
    "Signature": "FMG5tlZhJNHLHUXvZgtZzlk24FzVa7oX0T4P03neeXw8ZEXZx6z35j2FOTuNYShn2h0bKNC/zLTnMyIxEzmi2X1shOBWsJHkrW2xkR58ABZF+4uWHEE73yDVR4SyYAikP9jstZzDRm+bcVs8+T0yaLiEGLrIIIL4esi1llhIkgErCuy5btPcWXBdio2fpCRD5x9oR6gmE/rd5O7lX1c1uvnv4r1Lkk4pqP2/iUfxFZva1xLSRvgyfm6D9hNklVyPfy+7TalMD0lzmJuOrExtnSIbZew3foxgx8GT+lbZkLd0ZdtdRJlIyPRP44eyq78sU0Eo/LsDr0Iak4ZDpg8dXg==",
    "SigningCertURL": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-010a507c1833636cd94bdb98bd93083a.pem",
    "UnsubscribeURL": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:111122223333:ExampleTopic1:e1039402-24e7-40a3-a0d4-797da162b297"
  }
  ```
+ raw メッセージの配信を**有効にします**。

  ```
  This is a test message.
  ```

## Amazon SQS サブスクリプションのメッセージ属性と raw メッセージ配信
<a name="message-atttributes-raw-message-delivery-sqs"></a>

Amazon SNS では、メッセージに関する構造化メタデータ項目 (タイムスタンプ、地理空間データ、署名、識別子など) を指定できるメッセージ属性の配信をサポートしています。SQS サブスクリプションの場合、**raw メッセージの配信**を有効にすると、最大 10 個のメッセージ属性を送信できます。10 個を超えるメッセージ属性を送信するには、raw メッセージの配信を無効にする必要があります。raw メッセージ配信が有効になっている場合、10 個を超えるメッセージ属性を持つ Amazon SQS サブスクリプション宛てのメッセージは、クライアント側のエラーとして破棄されます。

# 別のアカウントの Amazon SQS キューへ Amazon SNS メッセージを送信する
<a name="sns-send-message-to-sqs-cross-account"></a>

このドキュメントでは、別のアカウントの Amazon SQS キューに 1 つ以上のサブスクリプションがある Amazon SNS トピックに通知を発行する方法について説明します。同じアカウント内にある場合と同じ方法でトピックとキューをセットアップします (「[Amazon SNS 通知の Amazon SQS キューへのファンアウトと非同期処理](sns-sqs-as-subscriber.md)」を参照)。主な相違点はサブスクリプションの確認の処理方法で、トピックへのキューのサブスクライブ方法によって異なります。

キューの所有者がサブスクリプションを作成すると確認が自動的に実行されるため、可能な場合は「[キューの所有者がサブスクリプションを作成する](#SendMessageToSQS.cross.account.queueowner)」セクションで参照されている手順に従うことがベストプラクティスです。

**注記**  
Amazon SQS キューに大量のメッセージがある場合は、キュー所有者がサブスクリプションを作成することをお勧めします。

## キューの所有者がサブスクリプションを作成する
<a name="SendMessageToSQS.cross.account.queueowner"></a>

Amazon SQS キューを作成したアカウントがキューの所有者です。キューの所有者がサブスクリプションを作成するとき、サブスクリプションを確認する必要はありません。`Subscribe` アクションが完了するとすぐに、キューはトピックからの通知の受信を開始します。キューの所有者がトピック所有者のトピックにサブスクライブできるようにするには、トピック所有者が、トピックに対して `Subscribe` アクションを呼び出す許可をキューの所有者のアカウントに付与する必要があります。

### ステップ 1: を使用してトピックポリシーを設定するには AWS マネジメントコンソール
<a name="sns-tutorial-set-topic-policy"></a>

1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/home)にサインインします。

1. ナビゲーションパネルで、[**トピック**] を選択します。

1. トピックを選択し、[**編集**] を選択します。

1. [**Edit *MyTopic***] ページで [**アクセスポリシー**] セクションを展開します。

1. 以下のポリシーを入力します。

   ```
   {
      "Statement": [
         {
            "Effect": "Allow",
            "Principal": {
               "AWS": "111122223333"
            },
            "Action": "sns:Subscribe",
            "Resource": "arn:aws:sns:us-east-2:123456789012:MyTopic"
         }
      ]
   }
   ```

   このポリシーは、`123456789012` アカウント内で `MyTopic` に `sns:Subscribe` を呼び出す許可を `111122223333` アカウントに付与します。

   `111122223333` のアカウントに対する認証情報が持っているユーザーは、`MyTopic` に登録できます。この許可によって、アカウント ID は、アクセス許可 を IAM ユーザー/ロールに委任できます。呼び出しは、ルートアカウントまたは管理者ユーザーのみに許可されます。また、IAM ユーザー/ロールは、キューにサブスクリプションを許可するために `sns:subscribe` を持つ必要があります。

1. **[Save changes]** (変更の保存) をクリックします。

   `111122223333` アカウントに対する認証情報があるユーザーは、MyTopic に登録できます。

### ステップ 2: AWS アカウント を使用して別の のトピックに Amazon SQS キューサブスクリプションを追加するには AWS マネジメントコンソール
<a name="sns-tutorial-add-sqs-subscription-to-sns-topic-another-account"></a>

開始する前に、トピックおよびキューの ARN を保持していて、[キューにメッセージを送信する許可がトピックに付与されている](subscribe-sqs-queue-to-sns-topic.md#SendMessageToSQS.sqs.permissions)ことを確認してください。

1. [Amazon SQSコンソール](https://console.aws.amazon.com/sqs/home)にサインインします。

1. ナビゲーションパネルで、**[Queues]**(キュー) を選択します。

1.  キューのリストから**キュー**を選択して、Amazon SNS トピックを購読します。

1. **[Subscribe to Amazon SNS topic]** (Amazon SNS トピックを購読する) を選択します。

1. **[Specify an Amazon SNS topic available for this queue menu]** (このキューメニューで使用できる Amazon SNS トピックを指定する) で、キューの **Amazon SNS topic** (Amazon SNS トピック) を選択します。

1. **[Amazon SNS トピックの ARN を入力する]**を選択してから、トピックの **Amazon リソースネーム (ARN)** を入力します。

1. **[保存]** を選択します。
**注記**  
サービスと通信できるようにするには、キューに Amazon SNS へのアクセス権限が必要です。
キューの所有者であるため、サブスクリプションを確認する必要はありません。

## キュー作成サブスクリプションを所有していないユーザー
<a name="SendMessageToSQS.cross.account.notqueueowner"></a>

サブスクリプションを作成するユーザーがキューの所有者ではない場合、そのサブスクリプションを確認する必要があります。

`Subscribe` アクションを使用すると、Amazon SNS はサブスクリプションの確認をキューに送信します。サブスクリプションが Amazon SNS コンソールに表示され、サブスクリプション ID が [**保留中の確認**] に設定されます。

サブスクリプションを確認するには、キューからメッセージを読み取る権限を持つユーザーがサブスクリプションの確認 URL を取得し、サブスクリプションの所有者がサブスクリプションの確認 URL を使用してサブスクリプションを確認する必要があります。サブスクリプションが確認されるまで、トピックに対して発行された通知はキューに送信されません。サブスクリプションを確認するには、Amazon SQS コンソールまたは `[ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QueryReceiveMessage.html)` アクションを使用できます。

**注記**  
トピックにエンドポイントをサブスクライブする前に、キューに `sqs:SendMessage` アクセス権限を設定してこのキューがトピックからメッセージを受信できるようにする必要があります。詳細については、「[ステップ 2: Amazon SQS キューにメッセージを送信する許可を Amazon SNS トピックに付与する](subscribe-sqs-queue-to-sns-topic.md#SendMessageToSQS.sqs.permissions)」を参照してください。

### ステップ 1: AWS アカウント を使用して別の のトピックに Amazon SQS キューサブスクリプションを追加するには AWS マネジメントコンソール
<a name="sns-tutorial-add-sqs-subscription-to-sns-topic-another-account"></a>

開始する前に、トピックおよびキューの ARN を保持していて、[キューにメッセージを送信する許可がトピックに付与されている](subscribe-sqs-queue-to-sns-topic.md#SendMessageToSQS.sqs.permissions)ことを確認してください。

1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/home)にサインインします。

1. ナビゲーションパネルで、[**サブスクリプション**] を選択します。

1. **[サブスクリプション]** ページで **[サブスクリプションの作成]** を選択します。

1.  **[サブスクリプションの作成]** ページの **[詳細]** セクションで、以下を実行します。

   1. [**トピック ARN**] にトピックの ARN を入力します。

   1. [**プロトコル**] で、[**Amazon SQS**] を選択します。

   1. [**エンドポイント**] にキューの ARN を入力します。

   1. [**サブスクリプションの作成**] を選択します。
**注記**  
サービスと通信できるようにするには、キューに Amazon SNS へのアクセス権限が必要です。

Amazon SNS トピックが Amazon SQS キューへメッセージを送信できるようにするポリシーステートメントの例を以下に示します。

```
{
   "Sid": "Stmt1234",
   "Effect": "Allow",
   "Principal": "*",
   "Action": "sqs:SendMessage",
   "Resource": "arn:aws:sqs:us-west-2:111111111111:QueueName",
   "Condition": {
      "ArnEquals": {
         "aws:SourceArn": "arn:aws:sns:us-west-2:555555555555:TopicName"
      }
   }
}
```

### ステップ 2: を使用してサブスクリプションを確認するには AWS マネジメントコンソール
<a name="sns-tutorial-confirm-subscription-console"></a>

1. [Amazon SQS コンソール](https://console.aws.amazon.com/sqs/)にサインインします。

1. トピックへのサブスクリプションが保留になっているキューを選択します。

1. **[Send and receive messages]** (メッセージの送受信) を選択し、**[Poll for messages]** (メッセージのポーリング) を選択します。

   サブスクリプションの確認を含むメッセージがキューで受信されます。

1. [**本文**] 列で、次の操作を行います。

   1. [**詳細**] を選択します。

   1. **[Message Details]** (メッセージの詳細) ダイアログボックスで、**[SubscribeURL]** の値を見つけてメモします。これはサブスクリプションリンクです (以下に例を示します)。API トークンの検証の詳細については、Amazon SNS API リファレンスの「[https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html)」を参照してください。

      ```
      https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-east-2:123456789012:MyTopic&Token=2336412f37fb...
      ```

   1. サブスクリプション確認リンクを書き留めます。URL は、キュー所有者からサブスクリプション所有者に渡す必要があります。サブスクリプションの所有者は、URL を [Amazon SNS コンソール](https://console.aws.amazon.com/sns/v3/home)に入力する必要があります。

1. **サブスクリプション所有者**として [Amazon SNS コンソール](https://console.aws.amazon.com/sns/v3/home)にログインします。サブスクリプション所有者が確認を実行します。

1. 関連する **[topic]** (トピック) を選択します。

1. トピックのサブスクリプション一覧表で、関連する**サブスクリプション**を選択します。「Pending confirmation (保留中の確認)」とラベル付けされています。

1. **[confirm subscription]** (サブスクリプションの確認) を選択します。

1. サブスクリプション確認リンクを求めるモーダルが表示されます。サブスクリプション確認リンクを**貼り付け**ます。

1. モーダルで **[Confirm subscription]** (サブスクリプションの確認) を選択します。

   XML 応答が表示されます。例えば、

   ```
   <ConfirmSubscriptionResponse>
      <ConfirmSubscriptionResult>
         <SubscriptionArn>arn:aws:sns:us-east-2:123456789012:MyTopic:1234a567-bc89-012d-3e45-6fg7h890123i</SubscriptionArn>
      </ConfirmSubscriptionResult>
      <ResponseMetadata>
         <RequestId>abcd1efg-23hi-jkl4-m5no-p67q8rstuvw9</RequestId>
      </ResponseMetadata>
   </ConfirmSubscriptionResponse>
   ```

   サブスクライブしたキューは、トピックからメッセージを受信する準備ができています。

1. (オプション) Amazon SNS コンソールでトピックのサブスクリプションを表示すると、[**保留中の確認**] メッセージが [**サブスクリプション ID**] 列でサブスクリプション ARN に置き換えられています。

## サブスクリプション解除リクエストでサブスクリプションに認証を要求させるにはどうすればよいですか。
<a name="sns-send-message-to-sqs-cross-account-AuthenticateOnUnsubscribe"></a>

サブスクリプションの所有者は、サブスクリプション確認時に `AuthenticateOnUnsubscribe` フラグを true に設定する必要があります。
+ キューの所有者がサブスクリプションを作成すると、`AuthenticateOnUnsubscribe` は自動的に true に設定されます。
+ 認証なしでサブスクリプション確認リンクに移動した場合、`AuthenticateOnUnsubscribe` を true に設定することはできません。

# 別のリージョンの Amazon SQS キューまたは関数に Amazon SNS Amazon SQS メッセージを送信する AWS Lambda
<a name="sns-cross-region-delivery"></a>

Amazon SNS はクロスリージョン配信をサポートしています。これは、デフォルトで有効になっているリージョンと[オプトインリージョン](#opt-in-regions)です。Amazon SNS がサポートする AWS リージョン (オプトインリージョンを含む) の最新のリストについては、「*Amazon Web Services 全般のリファレンス*」の「[Amazon Simple Notification Service エンドポイントとクォータ](https://docs.aws.amazon.com/general/latest/gr/sns.html)」を参照してください。

Amazon SNS は、Amazon SQS キューへの通知のクロスリージョン配信と AWS Lambda 関数をサポートしています。リージョンの 1 つがオプトインリージョンである場合は、サブスクライブされたリソースのポリシーで別の Amazon SNS サービスプリンシパルを指定する必要があります。

Amazon SNS サブスクリプションコマンドは、Amazon SNS がホストされている対応リージョンで実行する必要があります。例えば、Amazon SNS が us-east-1 リージョンのアカウント「A」にあり、Lambda 関数が us-east-2 リージョンのアカウント「B」にある場合、サブスクリプション CLI コマンドは us-east-1 リージョンのアカウント「A」で実行する必要があります。

## オプトインリージョン
<a name="opt-in-regions"></a>

Amazon SNS では、次のオプトインリージョンがサポートされています。


| リージョン名 | リージョン | 
| --- | --- | 
|  アフリカ (ケープタウン) リージョン  |  af-south-1  | 
|  アジアパシフィック (香港) リージョン  |  ap-east-1  | 
|  アジアパシフィック (ハイデラバード) リージョン  |  ap-south-2  | 
|  アジアパシフィック (ジャカルタ) リージョン  |  ap-southeast-3  | 
|  アジアパシフィック (メルボルン) リージョン  |  ap-southeast-4  | 
|  欧州 (ミラノ) リージョン  |  eu-south-1  | 
|  欧州 (スペイン) リージョン  |  eu-south-2  | 
|  欧州 (チューリッヒ) リージョン  |  eu-central-2  | 
|  イスラエル (テルアビブ) リージョン  |  il-central-1  | 
|  中東 (バーレーン) リージョン  |  me-south-1  | 
|  中東 (アラブ首長国連邦) リージョン  |  me-central-1  | 

オプトインリージョンを有効にする方法については、『』の[AWS 「リージョンの管理](https://docs.aws.amazon.com/general/latest/gr/rande-manage.html)」を参照してください*Amazon Web Services 全般のリファレンス。*

Amazon SNS を使用してオプトインリージョンからデフォルトで有効になっているリージョンにメッセージを配信する場合、キュー用に作成されたリソースポリシーを変更する必要があります。プリンシパル `sns.amazonaws.com` を `sns.<opt-in-region>.amazonaws.com` に置き換えます。例:
+  例えば、米国東部 (バージニア北部) の Amazon SQS キューをアジアパシフィック (香港) の Amazon SNS トピックにサブスクライブする場合は、キューポリシーのプリンシパルを `sns.ap-east-1.amazonaws.com` に変更します。オプトインリージョンには、2019 年 3 月 20 日以降に開始されたリージョンが含まれます。これには、アジアパシフィック (香港)、アジアパシフィック (ジャカルタ)、中東 (バーレーン)、欧州 (ミラノ)、アフリカ (ケープタウン) が含まれます。2019 年 3 月 20 日以前に開始されたリージョンは、デフォルトで有効になっています。  
**Amazon SQS へのリージョン間での配信サポート**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-cross-region-delivery.html)

  オプトインリージョン (af-south-1) の Amazon SNS トピックが、デフォルトで有効なリージョン (us-east-1) の Amazon SQS キューに配信できるようにするアクセスポリシーステートメントの例を次に示します。これには、パス (`Statement`/`Principal`/`Service`) の下に、必要なリージョン化されたサービスプリンシパル設定が含まれています。

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Id": "__default_policy_ID",
      "Statement": [
          {
              "Sid": "allow_sns_arn:aws:sns:af-south-1:111111111111:source_topic_name",
              "Effect": "Allow",
              "Principal": {
                  "Service": "sns.af-south-1.amazonaws.com"
              },
              "Action": "SQS:SendMessage",
              "Resource": "arn:aws:sqs:us-west-1:111111111111:destination_queue_name",
              "Condition": {
                  "ArnLike": {
                      "aws:SourceArn": "arn:aws:sns:af-south-1:111111111111:source_topic_name"
                  }
              }
          }
      ]
  }
  ```

------
+  米国東部 (バージニア北部) の AWS Lambda 関数をアジアパシフィック (香港) の Amazon SNS トピックにサブスクライブするには、 AWS Lambda 関数ポリシーのプリンシパルを に変更します`sns.ap-east-1.amazonaws.com`。オプトインリージョンには、2019 年 3 月 20 日以降に開始されたリージョンが含まれます。これには、アジアパシフィック (香港)、アジアパシフィック (ジャカルタ)、中東 (バーレーン)、欧州 (ミラノ)、アフリカ (ケープタウン) が含まれます。2019 年 3 月 20 日以前に開始されたリージョンは、デフォルトで有効になっています。  
**へのクロスリージョン配信のサポート AWS Lambda**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-cross-region-delivery.html)

# Amazon SNS メッセージ配信ステータス
<a name="sns-topic-attributes"></a>

Amazon SNS では、以下の Amazon SNS エンドポイントでトピックに送信された通知メッセージの配信ステータスをログに記録できます。
+ Amazon Data Firehose
+ Amazon Simple Queue Service
+ AWS Lambda
+ HTTPS
+ プラットフォームアプリケーションエンドポイント

配信ステータスログは Amazon CloudWatch Logs に送信され、メッセージ配信オペレーションに関するインサイトを提供します。これらのログは、次の目的に役立ちます。
+ メッセージがエンドポイントに正常に配信されたかどうかを確認する。
+ Amazon SNS へのエンドポイントから Amazon SNS に送信された応答を特定する。
+ メッセージのドウェル時間 (発行のタイムスタンプからエンドポイントへの配信までの時間) を測定する。

配信ステータスのログ記録は AWS マネジメントコンソール、、 AWS SDKs、クエリ API、または を使用して設定できます AWS CloudFormation。

# 配信ステータスのログ記録に関する前提条件
<a name="topics-attrib-prereq"></a>

このトピックでは、Amazon SNS による CloudWatch への配信ログの書き込みを有効にするために必要な IAM アクセス許可の概要と、デフォルトのロググループの命名規則について説明します。これにより、CloudWatch Logs でメッセージ配信ログをモニタリングおよび分析するための正しい設定とアクセスが可能になります。

**必要な IAM アクセス許可**

配信ステータスのログ記録用にアタッチされた IAM ロールには、Amazon SNS が CloudWatch Logs に書き込めるように、次のアクセス許可が含まれている必要があります。設定時に、これらのアクセス許可を持つ既存のロールを使用するか、新しいロールを作成できます。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    }
  ]
}
```

------

**ロググループの命名規則**

デフォルトでは、Amazon SNS は、次の命名規則を使用して、配信ステータスログ用の CloudWatch ロググループを作成します。このグループ内のログストリームは、エンドポイントプロトコル (Lambda、Amazon SQS など) に対応しています。CloudWatch Logs コンソールでこれらのログを表示するアクセス許可があることを確認してください。

```
sns/<region>/<account-id>/<topic-name>
```

# を使用した配信ステータスのログ記録の設定 AWS マネジメントコンソール
<a name="topics-attrib"></a>

このトピックでは、Amazon SNS トピックに関するメッセージ配信ステータスのログ記録を有効にする方法について説明します。ログ記録の設定、IAM ロールの割り当て、モニタリングとトラブルシューティングを目的とした CloudWatch Logs による配信ログのキャプチャの検証などを取り上げます。

1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/home)にサインインします。

1. ナビゲーションパネルで、[**トピック**] を選択します。

1. 目的の**トピック**を選択し、**[編集]** を選択します。

1. **[配信ステータスのログ記録]** セクションを展開します。

1. ログ記録を有効にする**プロトコル** (HTTP、Lambda、Amazon SQS など) を選択します。

1. **[成功サンプルレート]** (CloudWatch Logs を受信するための成功メッセージの割合) を入力します。

1. **[IAM ロール]** セクションでは、**成功**のログ記録と**失敗**のログ記録の両方のロールを設定する必要があります。
   + **既存のサービスロールを使用** – Amazon SNS が CloudWatch にログを書き込む際に必要となるアクセス許可を持つ既存の IAM ロールを選択します。
   + **新しいサービスロールを作成** – **[新しいロールの作成]** を選択して、IAM コンソールで成功および失敗した配信の IAM ロールを定義します。アクセス許可の詳細については、「[配信ステータスのログ記録に関する前提条件](topics-attrib-prereq.md)」を参照してください。

1. **[Save changes]** (変更の保存) をクリックします。

   ログ記録を有効にすると、メッセージ配信ステータスを含む CloudWatch Logs を表示して解析することができます。CloudWatch の使用方法の詳細については、「[CloudWatch のドキュメント](https://aws.amazon.com/documentation/cloudwatch)」を参照してください。

**ログの設定の確認**

1. CloudWatch Logs コンソールにサインインします。

1. `sns/<region>/<account-id>/<topic-name>` という名前のロググループを見つけます。

1. 設定したエンドポイントプロトコルのログストリームが存在することを確認します。

1. トピックにテストメッセージを送信して、配信の成功または失敗を示すログエントリが表示されることを確認します。

# AWS SDKs を使用した配信ステータスのログ記録の設定
<a name="msg-status-sdk"></a>

 AWS SDKs は、メッセージ配信ステータスのログ記録のトピック属性を設定するための APIs を複数の言語で提供します。例えば、[SetTopicAttributes](https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html) API を使用して以下を設定します。
+ `LambdaSuccessFeedbackRoleArn` – Lambda エンドポイントへのメッセージ配信が成功した場合の IAM ロール。
+ `LambdaSuccessFeedbackSampleRate` – Lambda エンドポイントへの配信が成功したメッセージのサンプリングレート。
+ `LambdaFailureFeedbackRoleArn` – Lambda エンドポイントへのメッセージ配信が失敗した場合の IAM ロール。

** AWS CLI コマンドの例**

```
aws sns set-topic-attributes \
    --topic-arn arn:aws:sns:us-west-2:123456789012:MyTopic \
    --attribute-name LambdaSuccessFeedbackRoleArn \
    --attribute-value arn:aws:iam::123456789012:role/MyFeedbackRole
```

## トピック属性
<a name="topic-attributes"></a>

メッセージ配信ステータスには、次のトピック属性名の値を使用してください。

**HTTP**
+ `HTTPSuccessFeedbackRoleArn` – HTTP エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が成功したことを示します。
+ `HTTPSuccessFeedbackSampleRate` – HTTP エンドポイントにサブスクライブされている Amazon SNS トピックについてサンプリングする、成功したメッセージの割合を示します。
+ `HTTPFailureFeedbackRoleArn` – HTTP エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が失敗したことを示します。

**Amazon Data Firehose**
+ `FirehoseSuccessFeedbackRoleArn` – Amazon Data Firehose エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が成功したことを示します。
+ `FirehoseSuccessFeedbackSampleRate` – Amazon Data Firehose エンドポイントにサブスクライブされている Amazon SNS トピックについてサンプリングする、成功したメッセージの割合を示します。
+ `FirehoseFailureFeedbackRoleArn` – Amazon Data Firehose エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が失敗したことを示します。

**AWS Lambda**
+ `LambdaSuccessFeedbackRoleArn` – Lambda エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が成功したことを示します。
+ `LambdaSuccessFeedbackSampleRate` – Lambda エンドポイントにサブスクライブされている Amazon SNS トピックについてサンプリングする、成功したメッセージの割合を示します。
+ `LambdaFailureFeedbackRoleArn` – Lambda エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が失敗したことを示します。

**プラットフォームアプリケーションエンドポイント**
+ `ApplicationSuccessFeedbackRoleArn` – AWS アプリケーションエンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信ステータスの成功。
+ `ApplicationSuccessFeedbackSampleRate` – AWS アプリケーションエンドポイントにサブスクライブされている Amazon SNS トピックについてサンプリングする、成功したメッセージの割合を示します。
+ `ApplicationFailureFeedbackRoleArn` – AWS アプリケーションエンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信ステータスが失敗しました。
**注記**  
配信ステータスをプッシュ通知サービスに直接ログ記録するように、アプリケーションの属性を設定することもできます。詳細については、「[メッセージの配信ステータスの Amazon SNS アプリケーション属性を使用する](https://docs.aws.amazon.com/sns/latest/dg/sns-msg-status.html)」を参照してください。

**Amazon SQS**
+ `SQSSuccessFeedbackRoleArn` – Amazon SQS エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が成功したことを示します。
+ `SQSSuccessFeedbackSampleRate` – Amazon SQS エンドポイントにサブスクライブされている Amazon SNS トピックについてサンプリングする、成功したメッセージの割合を示します。
+ `SQSFailureFeedbackRoleArn` – Amazon SQS エンドポイントにサブスクライブされている Amazon SNS トピックのメッセージ配信が失敗したことを示します。

プラットフォームアプリケーションエンドポイントのログは、他のエンドポイントと同じ CloudWatch Logs グループに書き込まれます。

**注記**  
 `<ENDPOINT>SuccessFeedbackRoleArn` および `<ENDPOINT>FailureFeedbackRoleArn` 属性は、お客様に代わって CloudWatch Logs を使用する書き込みアクセス許可を Amazon SNS に付与するために使用します。`<ENDPOINT>SuccessFeedbackSampleRate` 属性は、正常な配信メッセージのサンプルレートの割合 (0〜100) を指定するためのものです。`<ENDPOINT>FailureFeedbackRoleArn` 属性を設定した後は、メッセージの配信に失敗すると、必ず CloudWatch Logs が生成されます。

# AWS トピック属性を設定するための SDK の例
<a name="topic-attributes-sdks"></a>

次のサンプルコードは、`SetTopicAttributes` を使用する方法を説明しています。

------
#### [ CLI ]

**AWS CLI**  
**トピックの属性を設定するには**  
次の `set-topic-attributes` の例では、指定したトピックの `DisplayName` 属性を設定します。  

```
aws sns set-topic-attributes \
    --topic-arn arn:aws:sns:us-west-2:123456789012:MyTopic \
    --attribute-name DisplayName \
    --attribute-value MyTopicDisplayName
```
このコマンドでは何も出力されません。  
+  API の詳細については、「*AWS CLI コマンドリファレンス*」の「[SetTopicAttributes](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/set-topic-attributes.html)」を参照してください。

------
#### [ Java ]

**SDK for Java 2.x**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples)での設定と実行の方法を確認してください。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.SetTopicAttributesRequest;
import software.amazon.awssdk.services.sns.model.SetTopicAttributesResponse;
import software.amazon.awssdk.services.sns.model.SnsException;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class SetTopicAttributes {

    public static void main(String[] args) {
        final String usage = """

                Usage:    <attribute> <topicArn> <value>

                Where:
                   attribute - The attribute action to use. Valid parameters are: Policy | DisplayName | DeliveryPolicy .
                   topicArn - The ARN of the topic.\s
                   value - The value for the attribute.
                """;

        if (args.length < 3) {
            System.out.println(usage);
            System.exit(1);
        }

        String attribute = args[0];
        String topicArn = args[1];
        String value = args[2];

        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();

        setTopAttr(snsClient, attribute, topicArn, value);
        snsClient.close();
    }

    public static void setTopAttr(SnsClient snsClient, String attribute, String topicArn, String value) {
        try {
            SetTopicAttributesRequest request = SetTopicAttributesRequest.builder()
                    .attributeName(attribute)
                    .attributeValue(value)
                    .topicArn(topicArn)
                    .build();

            SetTopicAttributesResponse result = snsClient.setTopicAttributes(request);
            System.out.println(
                    "\n\nStatus was " + result.sdkHttpResponse().statusCode() + "\n\nTopic " + request.topicArn()
                            + " updated " + request.attributeName() + " to " + request.attributeValue());

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
+  API の詳細については、*AWS SDK for Java 2.x API リファレンス*の「[SetTopicAttributes](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/SetTopicAttributes)」を参照してください。

------
#### [ JavaScript ]

**SDK for JavaScript (v3)**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/sns#code-examples)での設定と実行の方法を確認してください。
別のモジュールでクライアントを作成し、エクスポートします。  

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```
SDK モジュールとクライアントモジュールをインポートし、API を呼び出します。  

```
import { SetTopicAttributesCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

export const setTopicAttributes = async (
  topicArn = "TOPIC_ARN",
  attributeName = "DisplayName",
  attributeValue = "Test Topic",
) => {
  const response = await snsClient.send(
    new SetTopicAttributesCommand({
      AttributeName: attributeName,
      AttributeValue: attributeValue,
      TopicArn: topicArn,
    }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: 'd1b08d0e-e9a4-54c3-b8b1-d03238d2b935',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   }
  // }
  return response;
};
```
+  詳細については、「[AWS SDK for JavaScript デベロッパーガイド](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/sns-examples-managing-topics.html#sns-examples-managing-topicsstttopicattributes)」を参照してください。
+  API の詳細については、**AWS SDK for JavaScript API リファレンスの「[SetTopicAttributes](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sns/command/SetTopicAttributesCommand)」を参照してください。

------
#### [ Kotlin ]

**SDK for Kotlin**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/kotlin/services/sns#code-examples)での設定と実行の方法を確認してください。

```
suspend fun setTopAttr(
    attribute: String?,
    topicArnVal: String?,
    value: String?,
) {
    val request =
        SetTopicAttributesRequest {
            attributeName = attribute
            attributeValue = value
            topicArn = topicArnVal
        }

    SnsClient.fromEnvironment { region = "us-east-1" }.use { snsClient ->
        snsClient.setTopicAttributes(request)
        println("Topic ${request.topicArn} was updated.")
    }
}
```
+  API の詳細については、*AWS SDK for Kotlin API リファレンス*の「[SetTopicAttributes](https://sdk.amazonaws.com/kotlin/api/latest/index.html)」を参照してください。

------
#### [ PHP ]

**SDK for PHP**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code/sns#code-examples)での設定と実行の方法を確認してください。

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;


/**
 * Configure the message delivery status attributes for an Amazon SNS Topic.
 *
 * This code expects that you have AWS credentials set up per:
 * https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html
 */

$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);
$attribute = 'Policy | DisplayName | DeliveryPolicy';
$value = 'First Topic';
$topic = 'arn:aws:sns:us-east-1:111122223333:MyTopic';

try {
    $result = $SnSclient->setTopicAttributes([
        'AttributeName' => $attribute,
        'AttributeValue' => $value,
        'TopicArn' => $topic,
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```
+  API の詳細については、*AWS SDK for PHP API リファレンス*の「[SetTopicAttributes](https://docs.aws.amazon.com/goto/SdkForPHPV3/sns-2010-03-31/SetTopicAttributes)」を参照してください。

------
#### [ Ruby ]

**SDK for Ruby**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/ruby/example_code/sns#code-examples)での設定と実行の方法を確認してください。

```
# Service class to enable an SNS resource with a specified policy
class SnsResourceEnabler
  # Initializes the SnsResourceEnabler with an SNS resource client
  #
  # @param sns_resource [Aws::SNS::Resource] The SNS resource client
  def initialize(sns_resource)
    @sns_resource = sns_resource
    @logger = Logger.new($stdout)
  end

  # Sets a policy on a specified SNS topic
  #
  # @param topic_arn [String] The ARN of the SNS topic
  # @param resource_arn [String] The ARN of the resource to include in the policy
  # @param policy_name [String] The name of the policy attribute to set
  def enable_resource(topic_arn, resource_arn, policy_name)
    policy = generate_policy(topic_arn, resource_arn)
    topic = @sns_resource.topic(topic_arn)

    topic.set_attributes({
                           attribute_name: policy_name,
                           attribute_value: policy
                         })
    @logger.info("Policy #{policy_name} set successfully for topic #{topic_arn}.")
  rescue Aws::SNS::Errors::ServiceError => e
    @logger.error("Failed to set policy: #{e.message}")
  end

  private

  # Generates a policy string with dynamic resource ARNs
  #
  # @param topic_arn [String] The ARN of the SNS topic
  # @param resource_arn [String] The ARN of the resource
  # @return [String] The policy as a JSON string
  def generate_policy(topic_arn, resource_arn)
    {
      Version: '2008-10-17',
      Id: '__default_policy_ID',
      Statement: [{
        Sid: '__default_statement_ID',
        Effect: 'Allow',
        Principal: { "AWS": '*' },
        Action: ['SNS:Publish'],
        Resource: topic_arn,
        Condition: {
          ArnEquals: {
            "AWS:SourceArn": resource_arn
          }
        }
      }]
    }.to_json
  end
end

# Example usage:
if $PROGRAM_NAME == __FILE__
  topic_arn = 'MY_TOPIC_ARN' # Should be replaced with a real topic ARN
  resource_arn = 'MY_RESOURCE_ARN' # Should be replaced with a real resource ARN
  policy_name = 'POLICY_NAME' # Typically, this is "Policy"

  sns_resource = Aws::SNS::Resource.new
  enabler = SnsResourceEnabler.new(sns_resource)

  enabler.enable_resource(topic_arn, resource_arn, policy_name)
end
```
+  詳細については、「[AWS SDK for Ruby デベロッパーガイド](https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/sns-example-enable-resource.html)」を参照してください。
+  API の詳細については、**AWS SDK for Ruby API リファレンスの「[SetTopicAttributes](https://docs.aws.amazon.com/goto/SdkForRubyV3/sns-2010-03-31/SetTopicAttributes)」を参照してください。

------
#### [ SAP ABAP ]

**SDK for SAP ABAP**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/sap-abap/services/sns#code-examples)での設定と実行の方法を確認してください。

```
    TRY.
        lo_sns->settopicattributes(
            iv_topicarn = iv_topic_arn
            iv_attributename  = iv_attribute_name
            iv_attributevalue = iv_attribute_value ).
        MESSAGE 'Set/updated SNS topic attributes.' TYPE 'I'.
      CATCH /aws1/cx_snsnotfoundexception.
        MESSAGE 'Topic does not exist.' TYPE 'E'.
    ENDTRY.
```
+  API の詳細については、*AWS SDK for SAP ABAP API リファレンス*の「[SetTopicAttributes](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)」を参照してください。

------

# を使用した配信ステータスのログ記録の設定 CloudFormation
<a name="msg-status-cloudformation"></a>

`DeliveryStatusLogging` を使用して を設定するには CloudFormation、JSON または YAML テンプレートを使用して CloudFormation スタックを作成します。詳細については、「 CloudFormation ユーザーガイド」の「 `AWS::SNS::Topic`リソースの `DeliveryStatusLogging`プロパティ」を参照してください。以下は、新しいトピックを作成したり、Amazon SQS プロトコルのすべての`DeliveryStatusLogging`属性で既存のトピックを更新したりするための JSON および YAML の CloudFormation テンプレートの例です。

`SuccessFeedbackRoleArn` および `FailureFeedbackRoleArn` で参照されている IAM ロールに、必要な CloudWatch Logs のアクセス許可があることを確認してください。

------
#### [ JSON ]

```
"Resources": {
    "MySNSTopic" : {
        "Type" : "AWS::SNS::Topic",
        "Properties" : {
            "TopicName" : "TestTopic",
            "DisplayName" : "TEST",
            "SignatureVersion" : "2",
            "DeliveryStatusLogging" : [{
                "Protocol": "sqs",
                "SuccessFeedbackSampleRate": "45",
                "SuccessFeedbackRoleArn": "arn:aws:iam::123456789012:role/SNSSuccessFeedback_test1",
                "FailureFeedbackRoleArn": "arn:aws:iam::123456789012:role/SNSFailureFeedback_test2"
            }]
        }
    }
}
```

------
#### [ YAML ]

```
Resources:
  MySNSTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName:TestTopic
      DisplayName:TEST
      SignatureVersion:2
      DeliveryStatusLogging:
       - Protocol: sqs
         SuccessFeedbackSampleRate: 45
         SuccessFeedbackRoleArn: arn:aws:iam::123456789012:role/SNSSuccessFeedback_test1
         FailureFeedbackRoleArn: arn:aws:iam::123456789012:role/SNSFailureFeedback_test2
```

------

# Amazon SNS メッセージ配信の再試行
<a name="sns-message-delivery-retries"></a>

Amazon SNS は、各配信プロトコルの*配信ポリシー*を定義します。配信ポリシーは、サーバー側のエラーが発生したとき (サブスクライブされたエンドポイントをホストするシステムが利用できなくなったとき) に Amazon SNS がメッセージの配信を再試行する方法を定義します。配信ポリシーが枯渇すると、Amazon SNS は配信の再試行を停止し、にデッドレターキューが添付されていない限り、メッセージを破棄します。詳細については、「[Amazon SNS デッドレターキュー](sns-dead-letter-queues.md)」を参照してください。

## 配信プロトコルとポリシー
<a name="delivery-policies-for-protocols"></a>

**注記**  
HTTP/S を除き、Amazon SNS で定義された配信ポリシーを変更することはできません。HTTP/S のみがカスタムポリシーをサポートしています。「[HTTP/S 配信ポリシーの作成](#creating-delivery-policy)」を参照してください。
Amazon SNS は、配信の再試行にジッタリングを適用します。詳細については、『*AWS アーキテクチャブログ*』の「[エクスポネンシャルバックオフとジッター](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/)」を参照してください。
**HTTP/S エンドポイントのポリシー再試行時間は、全体で 3,600 秒を超えることはできません。これはハード制限であり、時間を延長することはできません**。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-message-delivery-retries.html)

¹Firehose プロトコルのスロットリングエラーの場合、Amazon SNS はカスタマーマネージドエンドポイントと同じ配信ポリシーを使用します。

## 配信ポリシーの段階
<a name="delivery-policy-stages"></a>

次の図は、配信ポリシーの段階を示しています。

![\[X Y 軸図では、Time が X 軸、Initial Delivery Attempt が Y 軸として表示されています。配信ポリシーは、Y 軸の即時の再試行段階から始まり、X 軸上でバックオフ前段階、バックオフ段階、バックオフ後段階と続きます。\]](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/sns-delivery-policy-phases.png)


各配信ポリシーは、4 つの段階で構成されます。

1. **即時の再試行段階 (遅延なし)** – 最初の配信の試行の直後に発生します。この段階では再試行間の遅延時間はありません。

1. **バックオフ前段階** – この段階は即時の再試行段階の後に続きます。Amazon SNS は、バックオフ関数を適用する前に、この段階を使用して一連の再試行を試みます。この段階では、再試行回数と再試行間の遅延量を指定します。

1. **バックオフ段階** - この段階では、再試行バックオフ関数を使用して、再試行間の遅延を制御します。この段階では、最小遅延、最大遅延、および遅延が最小遅延から最大遅延までどれだけ速く増加するかを定義する再試行バックオフ関数を設定します。バックオフ関数は、数論的、指数、幾何学的、または一次です。

1. **バックオフ後段階** – この段階はバックオフ段階の後に続きます。再試行回数とその間の遅延量を指定します。これが最終段階です。

## HTTP/S 配信ポリシーの作成
<a name="creating-delivery-policy"></a>

Amazon SNS が HTTP/S エンドポイントへのメッセージ配信を再試行する方法を定義できます。そのためには、*遅延なし*、*バックオフ前*、*バックオフ*、*バックオフ後*の 4 つの段階を持つ配信ポリシーを使用します。このポリシーを使用すると、デフォルトの再試行設定を上書きし、HTTP サーバーの処理能力に合わせてカスタマイズできます。

HTTP/S 配信ポリシーは、**トピック**レベルまたは**サブスクリプション**レベルのいずれかで JSON オブジェクトとして設定できます。
+ **トピックレベルのポリシー** – トピックにリンクされたすべての HTTP/S サブスクリプションに適用されます。[https://docs.aws.amazon.com/sns/latest/api/API_CreateTopic.html](https://docs.aws.amazon.com/sns/latest/api/API_CreateTopic.html) または [https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html) API アクションを使用して、このポリシーを設定します。
+ **サブスクリプションレベルのポリシー** – 特定のサブスクリプションにのみ適用されます。[https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html) または [https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html) API アクションを使用して、このポリシーを設定します。

または、 CloudFormation テンプレートで [AWS::SNS::Subscription](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html) リソースを使用することもできます。

HTTP/S サーバーの処理能力に基づいて配信ポリシーをカスタマイズする必要があります。
+ **すべてのサブスクリプションで 1 つのサーバーを使用** – トピック内のすべての HTTP/S サブスクリプションが同じサーバーを使用している場合は、配信ポリシーをトピック属性として設定して、すべてのサブスクリプション間で一貫性を確保します。
+ **サブスクリプションごとに異なるサーバーを使用** – 各サブスクリプションが異なるサーバーをターゲットにしている場合は、特定のサーバーの処理能力に合わせて、サブスクリプションごとに固有の配信ポリシーを作成します。

リクエストポリシーに `Content-Type` ヘッダーを設定して、通知のメディアタイプを指定することもできます。デフォルトでは、Amazon SNS は、コンテンツタイプが `text/plain; charset=UTF-8` に設定された HTTP/S エンドポイントにすべての通知を送信します。ただし、リクエストポリシーの [`headerContentType`](#header-content-type) フィールドを使用して、このデフォルト設定を上書きできます。

次の JSON オブジェクトは、4 つの段階で構成された再試行を持つ配信ポリシーを定義します。

1. **遅延なし段階** – 直ちに 3 回再試行します。

1. **バックオフ前段階** – 1 秒間隔で 2 回再試行します。

1. **バックオフ段階** – 1～60 秒の範囲の指数関数的遅延で 10 回再試行します。

1. **バックオフ後段階** – 60 秒の一定間隔で 35 回再試行します。

Amazon SNS では、メッセージを配信するために合計 **50 回試行**し、その後でメッセージを破棄します。すべての再試行の終了後に配信できないメッセージを保持するには、配信できないメッセージをデッドレターキュー (DLQ) に移動するようにサブスクリプションを設定します。詳細については、「[Amazon SNS デッドレターキュー](sns-dead-letter-queues.md)」を参照してください。

Amazon SNS では、すべての 5XX エラーと 429 エラー (送信されたリクエストが多すぎます) を再試行可能なエラーとして扱います。これらのエラーには、配信ポリシーが適用されます。他のすべてのエラーは永続的なエラーとして扱われ、再試行は行われません。

**注記**  
この配信ポリシーは `maxReceivesPerSecond` プロパティを使用して、各サブスクリプションで 1 秒あたり平均 10 件のメッセージになるように配信トラフィックをスロットリングします。このメカニズムは、高トラフィックによって HTTP/S エンドポイントの負荷が高くなるのを防ぐ際に役立ちますが、平均配信レートを維持するように設計されており、厳密な上限を課すものではありません。特に発行レートがスロットリング制限よりも大幅に高い場合、配信トラフィックが指定された制限を超えることがあります。  
発行 (インバウンド) トラフィックが配信 (アウトバウンド) レートを超えると、メッセージバックログが発生し、配信レイテンシーが高くなる可能性があります。このような問題を回避するには、`maxReceivesPerSecond` の値が、HTTP/S サーバーの処理能力とワークロードの要件に合致していることを確認してください。

次の配信ポリシーの例では、HTTP/S 通知のデフォルトのコンテンツタイプを `application/json` に上書きします。

```
{
    "healthyRetryPolicy": {
        "minDelayTarget": 1,
        "maxDelayTarget": 60,
        "numRetries": 50,
        "numNoDelayRetries": 3,
        "numMinDelayRetries": 2,
        "numMaxDelayRetries": 35,
        "backoffFunction": "exponential"
    },
    "throttlePolicy": {
        "maxReceivesPerSecond": 10
    },
    "requestPolicy": {
        "headerContentType": "application/json"
    }
}
```

配信ポリシーは、**再試行ポリシー**、**スロットルポリシー**、**リクエストポリシー**で構成されます。配信ポリシーには、合計で **9 つの属性**があります。


| ポリシー  | 説明 | 制約 | 
| --- | --- | --- | 
| minDelayTarget | 再試行の最小遅延。**単位:** 秒 | 1 から最大遅延まで**デフォルト:** 20 | 
| maxDelayTarget | 再試行の最大遅延。**単位:** 秒 | 最小遅延から 3,600 まで**デフォルト:** 20 | 
| numRetries | 即時再試行、バックオフ前再試行、バックオフ再試行、ポストバックオフ再試行の合計数。 | 0～100**デフォルト:** 3 | 
| numNoDelayRetries | 即時に行う再試行の回数。再試行の間に遅延はありません。 | 0 以上**デフォルト:** 0 | 
| numMinDelayRetries | バックオフ前段階での再試行回数と、これらの間に指定された最小遅延時間。 | 0 以上**デフォルト:** 0 | 
| numMaxDelayRetries | バックオフ後段階での再試行回数と、その間の最大遅延。 | 0 以上**デフォルト:** 0 | 
| backoffFunction | 再試行間のバックオフのモデル。 |  次の 4 つのオプションのいずれか。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-message-delivery-retries.html) **デフォルト:** linear  | 
| maxReceivesPerSecond  | 各サブスクリプションにおける 1 秒あたりのメッセージ配信の最大平均数。 | 1 以上**デフォルト:** スロットリングなし (配信レートに制限なし) | 
| headerContentType  | HTTP/S エンドポイントに送信される通知のコンテンツタイプ。 |  リクエストポリシーが定義されていない場合、コンテンツタイプはデフォルトで `text/plain; charset=UTF-8` に設定されます。 サブスクリプションに対する raw メッセージ配信が無効になっている場合 (デフォルト)、または配信ポリシーがトピックレベルで定義されている場合、サポートされるヘッダーコンテンツタイプは `application/json` および `text/plain` です。 サブスクリプションに対する raw メッセージ配信を有効にすると、以下のコンテンツタイプがサポートされます。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-message-delivery-retries.html)  | 

Amazon SNS は、次の式を使用して、バックオフ段階での再試行回数を計算します。

```
numRetries - numNoDelayRetries - numMinDelayRetries - numMaxDelayRetries
```

次の 3 つのパラメータを使用して、バックオフ段階での再試行の頻度を制御できます。
+ **`minDelayTarget`** – バックオフ段階における最初の再試行の遅延を設定します。
+ **`maxDelayTarget`** – バックオフ段階における最後の再試行の遅延を設定します。
+ **`backoffFunction`** – 最初の再試行と最後の再試行の間に行われるすべての再試行について、遅延を計算するために Amazon SNS で使用されるアルゴリズムを決定します。利用可能な 4 つの再試行バックオフ関数から選択できます。

次の図は、さまざまな再試行バックオフ関数が、バックオフ段階における再試行間の遅延にどのように影響するかを示しています。この例で使用される配信ポリシーには、**合計再試行回数 10 回**、**最小遅延時間 5 秒**、**最大遅延時間 260 秒**の設定が含まれます。
+ **縦軸**は、再試行ごとの遅延 (秒単位) を示します。
+ **横軸**は、最初の試行から 10 回目の試行までの再試行シーケンスを示します。

![\[この図は、指数関数、数論的関数、一次関数、幾何学的関数の 4 つのバックオフ関数に基づいて 10 回の試行で再試行の遅延がどのように進行するかを示しています。各色付き線は関数の遅延パターンを表します。指数関数: 急激に増加し、最も速く最大遅延に達します。一次関数: 再試行するたびに着実に増加します。数論的関数および幾何学的関数: 中程度の増加を示します。指数関数よりも急激ですが、一次関数ほど急激ではありません。すべての線は最小遅延である 5 秒付近から始まり、10 回目の再試行までに最大遅延である 260 秒に達します。\]](http://docs.aws.amazon.com/ja_jp/sns/latest/dg/images/backoff-graph.png)


# Amazon SNS デッドレターキュー
<a name="sns-dead-letter-queues"></a>

デッドレターキューは、Amazon SNS サブスクリプションが受信者に正常に配信できないメッセージの送信先としての Amazon SQS キューです。クライアントエラーまたはサーバーエラーが原因で配信できないメッセージは、詳細な分析や再処理のためにデッドレターキューに保持されます。詳細については、「[サブスクリプションの Amazon SNS デッドレターキューを設定する](sns-configure-dead-letter-queue.md)」および「[Amazon SNS メッセージ配信の再試行](sns-message-delivery-retries.md)」を参照してください。

**注記**  
Amazon SNS サブスクリプションと Amazon SQS キューは、同じ AWS アカウントとリージョンにある必要があります。
[FIFO トピック](sns-fifo-topics.md)では、Amazon SNS サブスクリプションのデッドレターキューとして Amazon SQS キューを使用できます。FIFO トピックサブスクリプションでは FIFO キューを使用します。標準トピックサブスクリプションでは標準キューを使用します。
暗号化された Amazon SQS キューをデッドレターキューとして使用するには、Amazon SNS サービスプリンシパルに AWS KMS API アクションへのアクセスを許可するキーポリシーを持つカスタム KMS を使用する必要があります。詳細については、このガイドの「[サーバー側の暗号化を使用した Amazon SNS データの保護](sns-server-side-encryption.md)」と、『*Amazon Simple Queue Service デベロッパーガイド*』の「[サーバー側の暗号化 (SSE) と AWS KMSを使用した Amazon SQS データの保護](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html)」を参照してください。

## メッセージ配信が失敗する理由
<a name="why-do-message-deliveries-fail"></a>

一般に、Amazon SNS が*クライアント側*または*サーバー側のエラー*により、サブスクライブされたエンドポイントにアクセスできない場合、メッセージの配信は失敗します。Amazon SNS がクライアント側のエラーを受信した場合、または対応する再試行ポリシーで指定された再試行回数を超えるメッセージに対してサーバー側のエラーを受信し続ける場合、Amazon SNS はメッセージを廃棄します。ただし、デッドレターキューがサブスクリプションに添付されている場合を除きます。配信に失敗しても、サブスクリプションのステータスは変更されません。詳細については、「[Amazon SNS メッセージ配信の再試行](sns-message-delivery-retries.md)」を参照してください。

### クライアント側エラー
<a name="client-side-errors"></a>

Amazon SNS に古いサブスクリプションのメタデータがあると、クライアント側のエラーが発生する可能性があります。これらのエラーは、通常、所有者がエンドポイント (Amazon SNS トピックにサブスクライブされている Lambda 関数など) を削除した場合や、サブスクライブしているエンドポイントに添付されているポリシーを、Amazon SNS がエンドポイントにメッセージを配信できないように所有者が変更した場合に発生します。Amazon SNS は、クライアント側のエラーの結果として失敗したメッセージ配信を再試行しません。

### サーバー側のエラー
<a name="server-side-errors"></a>

サーバー側のエラーは、サブスクライブされたエンドポイントを担当するシステムが利用できなくなったり、Amazon SNS からの有効なリクエストを処理できないことを示す例外を返す場合に発生します。サーバー側のエラーが発生すると、Amazon SNS は一次バックオフ関数またはエクスポネンシャルバックオフ関数を使用して、失敗した配信を再試行します。Amazon SQS または によってバックアップされた AWS マネージドエンドポイントに起因するサーバー側のエラーの場合 AWS Lambda、Amazon SNS は 23 日間で最大 100,015 回配信を再試行します。

カスタマー管理のエンドポイント (HTTP、SMTP、SMS、モバイルプッシュなど) も、サーバー側のエラーを引き起こす可能性があります。Amazon SNS は、これらのタイプのエンドポイントへの配信も再試行します。HTTP エンドポイントはお客様定義の再試行ポリシーをサポートしますが、Amazon SNS は SMTP、SMS、およびモバイルプッシュエンドポイントに対して、内部配信再試行ポリシーを 6 時間にわたって 50 回に設定します。

## デッドレターキューのしくみ
<a name="how-do-dead-letter-queues-work"></a>

メッセージの配信はサブスクリプションレベルで行われるため、デッドレターキューは (トピックではなく) Amazon SNS サブスクリプションに添付されます。これにより、各メッセージの元のターゲットエンドポイントをより簡単に識別できます。

Amazon SNS サブスクリプションに関連付けられたデッドレターキューは、通常の Amazon SQS キューです。メッセージの保持期間の詳細については、『*Amazon Simple Queue Service デベロッパーガイド*』の「[メッセージに関連するクォータ](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-quotas.html#quotas-messages)」を参照してください。Amazon SQS `[SetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html)` API アクションを使用して、メッセージの保持期間を変更できます。アプリケーションの復元性を高めるために、デッドレターキューの最大保持期間を 14 日に設定することをお勧めします。

## メッセージがデッドレターキューに移動する仕組み
<a name="how-messages-moved-into-dead-letter-queue"></a>

メッセージは、*再処理ポリシー*を使用してデッドレターキューに移動されます。再処理ポリシーは、デッドレターキューの ARN を参照する JSON オブジェクトです。`deadLetterTargetArn` 属性は ARN を指定します。ARN は、Amazon SNS サブスクリプションと同じ およびリージョンにある Amazon SQS Amazon SNS キューを指す必要があります。 AWS アカウント 詳細については、「[サブスクリプションの Amazon SNS デッドレターキューを設定する](sns-configure-dead-letter-queue.md)」を参照してください。

次の JSON オブジェクトは、SNS サブスクリプションに添付された再処理ポリシーのサンプルです。

```
{
  "deadLetterTargetArn": "arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue"
}
```

## メッセージをデッドレターキューから移動する方法
<a name="how-to-move-messages-out-of-dead-letter-queue"></a>

メッセージをデッドレターキューから移動するには、次の 2 つの方法があります。
+ **Amazon SQS コンシューマロジックの作成を避ける** - デッドレターキューをイベントソースとして Lambda 関数に設定して、デッドレターキューを吸い出します。
+ **Amazon SQS コンシューマーロジック**の書き込み – Amazon SQS API、 AWS SDK、または を使用して、デッドレターキュー内のメッセージをポーリング、処理、削除するためのカスタムコンシューマーロジックを AWS CLI 書き込みます。

## デッドレターキューのモニタリングとログ記録方法
<a name="how-to-monitor-log-dead-letter-queues"></a>

Amazon CloudWatch メトリクスを使用して、Amazon SNS サブスクリプションに関連付けられたデッドレターキューをモニタリングできます。すべての Amazon SQS キューは 1 分間隔で CloudWatch メトリクスを送信します。詳細については、「*Amazon Simple Queue Service デベロッパーガイド*」の「[Amazon SQS で使用できる CloudWatch メトリクス](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-available-cloudwatch-metrics.html)」を参照してください。デッドレターキューを持つすべての Amazon SNS サブスクリプションも、CloudWatch メトリクスを出力します。詳細については、「[CloudWatch を使用した Amazon SNS のモニタリング](sns-monitoring-using-cloudwatch.md)」を参照してください。

デッドレターキューのアクティビティを通知するには、CloudWatch メトリクスとアラームを使用できます。`NumberOfMessagesSent` メトリクスのアラームを設定するのは適切ではありません。このメトリクスは、処理の試行が失敗した場合に DLQ に送信されるメッセージをキャプチャしないためです。ここでは、`ApproximateNumberOfMessagesVisible` メトリクスを使用します。このメトリクスは、処理の失敗のために移動されたメッセージも含め、DLQ で現在利用可能なすべてのメッセージをキャプチャします。

**CloudWatch アラーム設定の例**

1. `ApproximateNumberOfMessagesVisible` メトリクスの [CloudWatch アラーム](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ConsoleAlarms.html)を作成します。

1. アラームしきい値を **1** (または期待と DLQ トラフィックに基づく別の適切な値) に設定します。

1. アラームが作動したときに通知される Amazon SNS **トピック**を指定します。この Amazon SNS トピックは、任意のエンドポイントタイプ (E メールアドレス、電話番号、モバイルポケットベルアプリなど) にアラーム通知を配信できます。

CloudWatch Logs を使用して、Amazon SNS 配信が失敗する原因となる例外や、デッドレターキューに送信されるメッセージを調査できます。Amazon SNS は、配信の成功と失敗の両方を CloudWatch に記録できます。詳細については、「[Amazon SNS モバイルアプリの属性](sns-msg-status.md)」を参照してください。

# サブスクリプションの Amazon SNS デッドレターキューを設定する
<a name="sns-configure-dead-letter-queue"></a>

デッドレターキューは、Amazon SNS サブスクリプションが受信者に正常に配信できないメッセージの送信先としての Amazon SQS キューです。クライアントエラーまたはサーバーエラーが原因で配信できないメッセージは、詳細な分析や再処理のためにデッドレターキューに保持されます。詳細については、「[Amazon SNS デッドレターキュー](sns-dead-letter-queues.md)」および「[Amazon SNS メッセージ配信の再試行](sns-message-delivery-retries.md)」を参照してください。

このページでは AWS マネジメントコンソール、、 AWS SDK、 AWS CLI、および CloudFormation を使用して、Amazon SNS サブスクリプションのデッドレターキューを設定する方法を示します。

**注記**  
[FIFO トピック](sns-fifo-topics.md)では、Amazon SNS サブスクリプションのデッドレターキューとして Amazon SQS キューを使用できます。FIFO トピックサブスクリプションでは FIFO キューを使用し、標準トピックサブスクリプションでは標準キューを使用します。

## 前提条件
<a name="dead-letter-queue-prerequisites"></a>

デッドレターキューを設定するには、次の前提条件を満たしている必要があります。

1. `MyTopic` という名前で [Amazon SNS トピックを作成する](sns-create-topic.md)。

1. `MyEndpoint` という名前で [Amazon SQS キューを作成し](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-create-queue.html)、Amazon SNS サブスクリプションのエンドポイントとして使用します。

1. (スキップ CloudFormation) [キューをトピックにサブスクライブします](sns-sqs-as-subscriber.md)。

1. `MyDeadLetterQueue` という名前で [Amazon SQS キューを作成し](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-create-queue.html)、Amazon SNS サブスクリプションのデッドレターキューとして使用します。

1. Amazon SQS API アクションへのアクセスを Amazon SNS プリンシパルに付与するには、`MyDeadLetterQueue` に次のキューポリシーを設定します。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "sns.amazonaws.com"
         },
         "Action": "SQS:SendMessage",
         "Resource": "arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue",
         "Condition": {
           "ArnEquals": {
             "aws:SourceArn": "arn:aws:sns:us-east-2:123456789012:MyTopic"
           }
         }
       }
     ]
   }
   ```

------

## を使用して Amazon SNS サブスクリプションのデッドレターキューを設定するには AWS マネジメントコンソール
<a name="configure-dead-letter-queue-aws-console"></a>

このチュートリアルを開始する前に、次の[前提条件](#dead-letter-queue-prerequisites)を完了してください。

1. [Amazon SQS コンソール](https://console.aws.amazon.com/sqs/)にサインインします。

1. [Amazon SQS キューを作成する](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-create-queue.html)か、既存のキューを使用して、キューの [**詳細**] タブでキューの ARN を確認します。次に例を示します。

   ```
   arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue
   ```

1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/home)にサインインします。

1. ナビゲーションパネルで、[**サブスクリプション**] を選択します。

1. [**サブスクリプション**] ページで、既存のサブスクリプションを選択し、[**編集**] を選択します。

1. [**Edit *1234a567-bc89-012d-3e45-6fg7h890123i***] ページで、[**再処理ポリシー (デッドレターキュー)**] セクションを展開し、次の操作を行います。

   1. [**有効**] を選択します。

   1. Amazon SQS キューの ARN を指定します。

1. [**変更を保存**] をクリックします。

   デッドレターキューを使用するようにサブスクリプションが設定されます。

## AWS SDK を使用して Amazon SNS サブスクリプションのデッドレターキューを設定するには
<a name="configure-dead-letter-queue-aws-sdk"></a>

この例を実行する前に、必ず[の前提条件](#dead-letter-queue-prerequisites)を完了してください。

 AWS SDK を使用するには、認証情報を使用して設定する必要があります。詳細については、「*AWS SDK とツールのリファレンスガイド*」の「[共有設定ファイルと認証情報ファイル](https://docs.aws.amazon.com/sdkref/latest/guide/creds-config-files.html)」を参照してください。

次の例は、`SetSubscriptionAttributesRedrivePolicy` を使用する方法を説明しています。

------
#### [ Java ]

**SDK for Java 1.x**  
 GitHub には、その他のリソースもあります。用例一覧を検索し、[AWS コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/java/example_code/sns#code-examples)での設定と実行の方法を確認してください。

```
// Specify the ARN of the Amazon SNS subscription.
String subscriptionArn =
    "arn:aws:sns:us-east-2:123456789012:MyEndpoint:1234a567-bc89-012d-3e45-6fg7h890123i";

// Specify the ARN of the Amazon SQS queue to use as a dead-letter queue.
String redrivePolicy =
    "{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue\"}";

// Set the specified Amazon SQS queue as a dead-letter queue
// of the specified Amazon SNS subscription by setting the RedrivePolicy attribute.
SetSubscriptionAttributesRequest request = new SetSubscriptionAttributesRequest()
    .withSubscriptionArn(subscriptionArn)
    .withAttributeName("RedrivePolicy")
    .withAttributeValue(redrivePolicy);
sns.setSubscriptionAttributes(request);
```

------

## を使用して Amazon SNS サブスクリプションのデッドレターキューを設定するには AWS CLI
<a name="configure-dead-letter-queue-aws-cli"></a>

このチュートリアルを開始する前に、次の[前提条件](#dead-letter-queue-prerequisites)を完了してください。

1.  AWS CLIをインストールして設定します。詳細については、「[https://docs.aws.amazon.com/cli/latest/userguide/](https://docs.aws.amazon.com/cli/latest/userguide/)」を参照してください。

1. 次のコマンドを使用します。

   ```
   aws sns set-subscription-attributes \
   --subscription-arn arn:aws:sns:us-east-2:123456789012:MyEndpoint:1234a567-bc89-012d-3e45-6fg7h890123i
   --attribute-name RedrivePolicy
   --attribute-value "{\"deadLetterTargetArn\": \"arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue\"}"
   ```

## を使用して Amazon SNS サブスクリプションのデッドレターキューを設定するには CloudFormation
<a name="configure-dead-letter-queue-aws-cloudformation"></a>

このチュートリアルを開始する前に、次の[前提条件](#dead-letter-queue-prerequisites)を完了してください。

1. 次のJSON コードを`MyDeadLetterQueue.json`という名前のファイルにコピーします。

   ```
   {
     "Resources": {
       "mySubscription": {
         "Type" : "AWS::SNS::Subscription",
         "Properties" : {
           "Protocol": "sqs",
           "Endpoint": "arn:aws:sqs:us-east-2:123456789012:MyEndpoint",
           "TopicArn": "arn:aws:sns:us-east-2:123456789012:MyTopic",
           "RedrivePolicy": {
             "deadLetterTargetArn":
               "arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue"
           }
         }
       }
     }
   }
   ```

1. [CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/) にサインインします。

1. [**テンプレートの選択**] ページで、[**テンプレートを Amazon S3 にアップロード**] を選択した後、`MyDeadLetterQueue.json` ファイルを選択し、次に [**次へ**] を選びます。

1. [**詳細の指定**] ページで、[**スタック名**] に `MyDeadLetterQueue` を入力してから、[**次へ**] を選択します。

1. [**オプション**] ページで、[**次へ**] を選択します。

1. [**Review**] ページで、[**作成**] を選択します。

   CloudFormation は`MyDeadLetterQueue`スタックの作成を開始し、**CREATE\$1IN\$1PROGRESS** ステータスを表示します。プロセスが完了すると、 は **CREATE\$1COMPLETE** ステータス CloudFormation を表示します。