

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

# Amazon SQS でデッドレターキューの再処理を設定する方法について説明します。
<a name="sqs-configure-dead-letter-queue-redrive"></a>

デッドレターキューリドライブを使用して、消費されていないメッセージをデッドレターキューから別の送信先に移動して処理します。デフォルトでは、デッドレターキューの再処理は、デッドレターキューからソースキューにメッセージを移動します。ただし、どちらのキューも同じタイプであれば、他の任意のキューを再処理の送信先として設定することもできます。例えば、デッドレターキューが FIFO キューの場合、再処理の送信先キューも FIFO キューでなければなりません。さらに、再処理の速度を設定して Amazon SQS がメッセージを移動するレートを設定することもできます。

**注記**  
 メッセージが FIFO キューから FIFO DLQ に移動されると、元のメッセージの重複排除 ID は元のメッセージの ID に置き換えられます。これは、重複排除 ID を共有している 2 つの独立したメッセージが DLQ 重複排除によって保存されなくなることがないようにするためです。

 デッドレターキューは、メッセージを受信順に、最も古いものから再処理します。ただし、送信先キューは、再処理されたメッセージと他のプロデューサーからの新しいメッセージを、受信順に取り込みます。例えば、プロデューサーがソース FIFO キューにメッセージを送信しているときに、デッドレターキューから再処理されたメッセージを同時に受信した場合、再処理されたメッセージはプロデューサーからの新しいメッセージと混在します。

**注記**  
再処理タスクにより、保持期間がリセットされます。すべての再処理されたメッセージは、新しい `messageID` を持つ新しいメッセージと見なされ、再処理されたメッセージに `enqueueTime` が割り当てられます。

## Amazon SQS API を使用して既存の標準キューにデッドレターキューの再処理を設定する
<a name="sqs-configure-dead-letter-queue-redrive-API"></a>

 デッドレターキューの再処理は、`StartMessageMoveTask`、`ListMessageMoveTasks`、`CancelMessageMoveTask` API アクションを使用して設定できます。


| API アクション | 説明 | 
| --- | --- | 
| [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_StartMessageMoveTask.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_StartMessageMoveTask.html) | 指定されたソースキューから指定された送信先キューにメッセージを移動する非同期タスクを開始します。 | 
| [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ListMessageMoveTasks.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ListMessageMoveTasks.html) | 特定のソースキューにある最新のメッセージ移動タスク (最大 10 個) を取得します。 | 
| [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CancelMessageMoveTask.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CancelMessageMoveTask.html) | 指定されたメッセージ移動タスクをキャンセルします。メッセージの移動は、現在のステータスが RUNNING の場合にのみキャンセルできます。 | 

## Amazon SQS コンソールを使用して既存の標準キューにデッドレターキューの再処理を設定する
<a name="sqs-configure-dead-letter-queue-redrive-console"></a>

1. Amazon SQSコンソール ([https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/)) を開きます。

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

1. [デッドレターキュー](sqs-configure-dead-letter-queue.md)として設定されたキューの名前を選択します。

1. **[DLQ 再処理の開始]** を選択します。

1. **[設定を再処理]** の **[メッセージの送信先]** で、次のいずれかを実行します。
   + 再処理のためにメッセージをソースキューに入れるには、**[再処理のためにソースキューに入れる]** を選択します。
   + 再処理のためにメッセージを別のキューに入れるには、**[再処理のためにカスタム送信先に移動]** を選択します。次に、既存の宛先キューのAmazonリソースネーム（ARNを入力します。

1. **Velocityコントロール設定**で、次のいずれかを選択します。
   + **システム最適化** - デッドレターキューメッセージを 1 秒あたり最大のメッセージ数で再処理します。
   + **カスタム最大速度** - 1 秒あたりカスタム最大レートのメッセージ数でデッドレターキューメッセージを再処理します。許可される最大レートは1秒に500 メッセージです。
     + カスタム最大速度を小さい値から始めて、ソースキューがメッセージでいっぱいにならないことを確認することをお勧めします。そこから、ソースキューの状態を引き続き監視しながら、カスタム最大速度の値を徐々に上げていきます。

1. デッドレターキューの再処理の設定が完了したら、**[メッセージをリドライブ]** を選択します。
**重要**  
Amazon SQS は、デッドレターキューからメッセージを再処理するときにメッセージのフィルタリングと変更をサポートしていません。  
デッドレターキューの再処理タスクは、最大 36 時間実行できます。Amazon SQS は、アカウントごとに最大 100 件のアクティブな再処理タスクをサポートしています。

1. メッセージの再処理タスクをキャンセルする場合は、キューの **[詳細]** ページで、**[DLQ 再処理をキャンセル]** を選択します。進行中のメッセージの再処理をキャンセルしても、移動先キューに正常に移動済みのメッセージは、移動先キューに残ります。

## デッドレターキューの再処理に対するキューのアクセス許可の設定
<a name="sqs-configure-dead-letter-queue-redrive-permissions"></a>

ポリシーにアクセス許可を追加することで、ユーザーに特定のデッドレターキューアクションへのアクセスを許可できます。デッドレターキューの再処理に最低限必要なアクセス許可は次のとおりです。


| 最小限必要なアクセス権限 | 必要な API メソッド | 
| --- | --- | 
| メッセージの再処理を開始するには | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-dead-letter-queue-redrive.html) | 
| 進行中のメッセージの再処理をキャンセルするには | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-dead-letter-queue-redrive.html) | 
| メッセージの移動状況を表示するには | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-dead-letter-queue-redrive.html) | 

**暗号化されたキューペア (デッドレターキューのあるソースキュー) のアクセス許可を設定するには**

次の手順を使用して、デッドレターキュー (DLQ) リドライブに対する最小限のアクセス許可を設定します。

1. IAM コンソール ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) を開きます。

1. ナビゲーションペインで [**ポリシー**] を選択します。

1. 新しい[https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)を作成し、次のアクセス許可を追加します。再処理オペレーションを実行する IAM [ユーザー](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)または[ロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)にポリシーをアタッチします。
   + DLQ のアクセス許可 (ソースキュー):
     + `sqs:StartMessageMoveTask`
     + `sqs:CancelMessageMoveTask`
     + `sqs:ListMessageMoveTasks`
     + `sqs:ReceiveMessage`
     + `sqs:DeleteMessage`
     + `sqs:GetQueueAttributes`
     + `sqs:ListDeadLetterSourceQueues`
     + DLQ (ソースキュー) の**リソース ARN** を指定します (例: "arn:aws:sqs:{{<DLQ\_region>}}:{{<DLQ\_accountId>}}:{{<DLQ\_name>}}")。
   + 送信先キューのアクセス許可:
     + `sqs:SendMessage`
     + 送信先キューの `Resource ARN` を指定します (例: "arn:aws:sqs:{{<DestQueue\_region>:<DestQueue\_accountId>:<DestQueue\_name>}}")。
   + KMS キーのアクセス許可:
     + `kms:Decrypt` (DLQ でメッセージを復号化するのに必要)。
     + `kms:GenerateDataKey` (送信先キュー内のメッセージを暗号化するのに必要)。
       + `Resource` ARN:
         + **DLQ** (ソースキュー) でのメッセージの暗号化に使用される KMS キーの ARN (例: "arn:aws:kms:{{<region>}}:{{<accountId>}}:key/{{<SourceQueueKeyId>}}")。
         + **送信先キュー**でのメッセージの暗号化に使用される KMS キーの ARN (例: "arn:aws:kms:{{<region>}}:{{<accountId>}}:key/{{<DestinationQueueKeyId>}}")。

   アクセスポリシーは以下のようになります。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "sqs:StartMessageMoveTask",
                   "sqs:CancelMessageMoveTask",
                   "sqs:ListMessageMoveTasks",
                   "sqs:ReceiveMessage",
                   "sqs:DeleteMessage",
                   "sqs:GetQueueAttributes",
                   "sqs:ListDeadLetterSourceQueues"
               ],
               "Resource": "arn:aws:sqs:us-west-1:123456789012:{{<DLQ_name>}}",
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceTag/QueueRole": "source"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Action": "sqs:SendMessage",
               "Resource": "arn:aws:sqs:us-west-1:123456789012:{{<DestQueue_name>}}",
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceTag/QueueRole": "destination"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Action": [
                   "kms:Decrypt",
                   "kms:GenerateDataKey"
               ],
               "Resource": [
                   "arn:aws:kms:us-west-1:123456789012:key/{{<SourceQueueKeyId>}}",
                   "arn:aws:kms:us-west-1:123456789012:key/{{<DestQueueKeyId>}}"
               ]
           }
       ]
   }
   ```

------

**暗号化されていないキューペア (デッドレターキューのあるソースキュー) を使用してアクセス許可を設定するには**

次の手順に従って、標準の**暗号化されていない**デッドレターキュー (DLQ) 処理に必要な最小限のアクセス許可を設定します。必要な最小限のアクセス許可は、デッドレターキューからの属性の*受信*、*削除*、*取得*、およびソースキューへの属性の*送信*です。

1. IAM コンソール ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) を開きます。

1. ナビゲーションペインで [**ポリシー**] を選択します。

1. 新しい[https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)を作成し、次のアクセス許可を追加します。再処理オペレーションを実行する IAM [ユーザー](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)または[ロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)にポリシーをアタッチします。
   + DLQ のアクセス許可 (ソースキュー):
     + `sqs:StartMessageMoveTask`
     + `sqs:CancelMessageMoveTask`
     + `sqs:ListMessageMoveTasks`
     + `sqs:ReceiveMessage`
     + `sqs:DeleteMessage`
     + `sqs:ListDeadLetterSourceQueues`
     + DLQ (ソースキュー) の**リソース ARN** を指定します (例: "arn:aws:sqs:{{<DLQ\_region>}}:{{<DLQ\_accountId>}}:{{<DLQ\_name>}}")。
   + 送信先キューのアクセス許可:
     + `sqs:SendMessage`
     + 送信先キューの `Resource ARN` を指定します (例: "arn:aws:sqs:{{<DestQueue\_region>:<DestQueue\_accountId>:<DestQueue\_name>}}")。

   アクセスポリシーは以下のようになります。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "sqs:StartMessageMoveTask",
                   "sqs:CancelMessageMoveTask",
                   "sqs:ListMessageMoveTasks",
                   "sqs:ReceiveMessage",
                   "sqs:DeleteMessage",
                   "sqs:GetQueueAttributes",
                   "sqs:ListDeadLetterSourceQueues"
               ],
               "Resource": "arn:aws:sqs:us-west-1:111122223333:{{<DLQ_name>}}",
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceTag/QueueRole": "source"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Action": "sqs:SendMessage",
               "Resource": "arn:aws:sqs:us-west-1:111122223333:{{<DestQueue_name>}}",
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceTag/QueueRole": "destination"
                   }
               }
           }
       ]
   }
   ```

------

## VPC エンドポイントアクセスコントロールでのデッドレターキューリドライブの使用
<a name="using-dlq-redrive-with-vpc-endpoint-access-control"></a>

 `aws:sourceVpc` 条件を使用して特定の VPCs へのキューアクセスを制限する場合、デッドレターキュー (DLQ) の再処理機能を有効にするには、 AWS サービスの例外を作成する必要があります。これは、メッセージの移動時に Amazon SQS サービスが VPC の外部で動作するためです。

 DLQ リドライブオペレーションを許可するには、キューポリシーに `aws:CalledViaLast` 条件を追加します。これにより、直接アクセスに対する VPC 制限を維持しながら、Amazon SQS はユーザーに代わって API コールを行うことができます。

 VPC 制限付きアクセスと DLQ リドライブの両方を許可するには: 

1. キューポリシーで `aws:CalledViaLast` 条件を使用します。

1. ソースキューと DLQ の両方にポリシーを適用します

1. 他のソースからの直接アクセスに対する VPC 制限を維持します

 次の例は、これらの要件を実装するポリシーを示しています。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "SQSRedriveWithVpcRestriction",
  "Statement": [
    {
      "Sid": "DenyOutsideVPCUnlessAWSService_DestQueue",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "sqs:*",
      "Resource": "arn:aws:sqs:*:111122223333:DestQueue",
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpc": "vpc-1234567890abcdef0"
        },
        "StringNotEqualsIfExists": { 
          "aws:CalledViaLast": "sqs.amazonaws.com"
        }
      }
    },
    {
      "Sid": "DenyOutsideVPCUnlessAWSService_DLQ",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "sqs:*",
      "Resource": "arn:aws:sqs:*:111122223333:Dlq",
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpc": "vpc-1234567890abcdef0"
        },
        "StringNotEqualsIfExists": { 
          "aws:CalledViaLast": "sqs.amazonaws.com"
        }
      }
    }
  ]
}
```

------
+ プレースホルダーの値を実際の値にそれぞれ置き換えます
+ このポリシーは、条件付きの「拒否」ステートメントを使用します。これは「許可」ステートメントを使用するよりも安全です。
+ `StringNotEqualsIfExists` 演算子は、リクエストコンテキストに条件キーが存在しない場合の処理を行います。

 または、`aws:ViaAWSService` 条件キーを使用して、VPC 制限を維持しながらサービスベースのアクセスを許可することもできます。この条件キーは、リクエストが AWS サービスからのものであるかどうかを示します。次の例は、`aws:CalledViaLast` の代わりに `aws:ViaAWSService` を使用するポリシーを示しています。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "SQSRedriveWithVpcRestriction",
  "Statement": [
    {
      "Sid": "DenyOutsideVPCUnlessAWSService_DestQueue",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "sqs:*",
      "Resource": "arn:aws:sqs:*:111122223333:DestQueue",
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpc": "vpc-1234567890abcdef0"
        },
        "BoolIfExists": {
          "aws:ViaAWSService": "false"
        }
      }
    },
    {
      "Sid": "DenyOutsideVPCUnlessAWSService_DLQ",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "sqs:*",
      "Resource": "arn:aws:sqs:*:111122223333:Dlq",
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpc": "vpc-1234567890abcdef0"
        },
        "BoolIfExists": {
          "aws:ViaAWSService": "false"
        }
      }
    }
  ]
}
```

------

`aws:ViaAWSService` 条件付きの BoolIfExists 演算子を使用すると、直接アクセスに対する VPC 制限を維持しながら、サービスからのリクエストが許可されます。これは、最後の呼び出しを行った AWS サービスをチェックするのではなく、 サービスによってリクエストが行われたかどうかを直接チェックするため、理解と保守が簡単になる場合があります。

 IAM ポリシーとリソースポリシーで使用される条件キーの詳細については、「IAM JSON ポリシー要素: 条件」を参照してください。