

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 了解如何在 Amazon SQS 中設定無效字母佇列再驅動
<a name="sqs-configure-dead-letter-queue-redrive"></a>

使用無效字母佇列再驅動，將未使用的訊息從無效字母佇列移至另一個目的地進行處理。根據預設，無效字母佇列再驅動會將訊息從無效字母佇列移至來源佇列。不過，如果兩種佇列類型相同，您也可以將任何其他佇列設定為再驅動目的地。例如，如果無效字母佇列是 FIFO 佇列，則再驅動目的地佇列也必須是 FIFO 佇列。此外，您可以設定再驅動速度，以設定 Amazon SQS 移動訊息的速率。

**注意**  
 將訊息從 FIFO 佇列移至 FIFO DLQ 時，原始訊息的重複資料刪除 ID 將會取代為原始訊息的 ID。這是為了確保 DLQ 重複資料刪除功能不會阻止儲存共用重複資料刪除 ID 的兩則獨立訊息。

 無效字母佇列會以收到訊息的順序重新驅動訊息，從最舊的訊息開始。但是，目的地佇列會根據接收的順序擷取重新推動的訊息，以及來自其他程序的新訊息。例如，如果生產者同時從無效字母佇列接收重新驅動的訊息時，將訊息傳送到來源 FIFO 佇列，則重新驅動的訊息會與生產者的新訊息交集。

**注意**  
再驅動任務會重設保留期間。所有再驅動訊息都會被視為具有新訊息的新訊息，`messageID`並`enqueueTime`指派給再驅動訊息。

## 使用 Amazon SQS API 為現有標準佇列設定無效字母佇列再驅動
<a name="sqs-configure-dead-letter-queue-redrive-API"></a>

 您可以使用 `StartMessageMoveTask`、 `ListMessageMoveTasks`和 `CancelMessageMoveTask` API 動作來設定無效字母佇列再驅動：


| API 動作 | Description | 
| --- | --- | 
| [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. 在 [https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/) 開啟 Amazon SQS 主控台。

1. 在導覽窗格中，選擇 **Queues** (佇列)。

1. 選擇您已設定為[無效字母](sqs-configure-dead-letter-queue.md)佇列的佇列名稱。

1. 選擇**啟動 DLQ 再驅動**。

1. 在**再驅動組態**下，針對**訊息目的地**，執行下列任一項作業：
   + 若要將訊息再驅動到其來源佇列，請選擇**再驅動至來源佇列**。
   + 若要將訊息再驅動到其他佇列，請選擇**再驅動至自訂目的地**。然後，輸入現有目的地佇列的 Amazon Resource Name (ARN)。

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/zh_tw/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-dead-letter-queue-redrive.html) | 
| 若要取消進行中的訊息再驅動 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-dead-letter-queue-redrive.html) | 
| 若要顯示訊息移動狀態 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-dead-letter-queue-redrive.html) | 

**若要設定加密佇列配對 (具有無效字母佇列的來源佇列) 的許可**

使用下列步驟來設定無效字母佇列 (DLQ) 再驅動的最低許可：

1. 前往 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選取 **Policies (政策)**。

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` ARNs：
         + 用來加密 **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. 前往 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選取 **Policies (政策)**。

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的佇列存取時，您需要對 AWS 服務進行例外處理，以啟用無效字母佇列 (DLQ) 再驅動功能。這是因為在移動訊息時，Amazon SQS 服務會在 VPC 外部運作。

 若要允許 DLQ 再驅動操作，請將 `aws:CalledViaLast`條件新增至佇列政策。這可讓 Amazon SQS 代表您進行 API 呼叫，同時維持直接存取的 VPC 限制。

 若要同時允許 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:ViaAWSService`而非 的範例政策`aws:CalledViaLast`：

------
#### [ 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 政策元素：條件。