

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

# 傳送 Amazon SNS 訊息至其他帳戶中的 Amazon SQS 佇列
<a name="sns-send-message-to-sqs-cross-account"></a>

本文件說明如何將通知發佈至其他帳戶中具有一個或多個 Amazon SQS 佇列訂閱的 Amazon SNS 主題。如果主題和佇列在相同帳戶中，您要以相同方式設定主題和佇列 (請參閱[向 Amazon SQS 佇列發出 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. 在導覽面板上，選擇 **Topics (主題)**。

1. 選取主題，然後選擇 **Edit (編輯)**。

1. 在**Edit *MyTopic* (編輯 MyTopic)**頁面上，展開**存取政策**區段。

1. 輸入下列政策：

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

   此政策授予帳戶 `111122223333` 呼叫帳戶 `123456789012` 中 `MyTopic` 上之 `sns:Subscribe` 的許可。

   擁有帳戶 `111122223333` 憑證的使用者可以訂閱 `MyTopic`。這項許可允許帳戶 ID 將許可委派給其 IAM 使用者/角色。唯有根帳戶或管理員使用者可以呼叫 `sns:Subscribe`。IAM 使用者/角色也必須擁有 `sns:subscribe` 才能允許其佇列訂閱。

1. 選擇**儲存變更**。

   擁有帳戶 `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. 選擇 **Enter Amazon SNS topic ARN (輸入 Amazon SNS 主題 ARN)**，然後輸入主題的 **Amazon Resource Name (ARN)**。

1. 選擇**儲存**。
**注意**  
若要能夠與服務進行通訊，佇列必須擁有 Amazon SNS 的許可。
如果您是該佇列的擁有者，則無須確認訂閱。

## 沒有擁有佇列的使用者建立訂閱
<a name="SendMessageToSQS.cross.account.notqueueowner"></a>

建立訂閱但不是佇列擁有者的任何使用者皆須確認訂閱。

當您使用 `Subscribe` 動作時，Amazon SNS 會傳送訂閱確認至佇列。訂閱會在 Amazon SNS 主控台中顯示，且其訂閱 ID 設為 **Pending Confirmation (訂閱確認)**。

若要確認訂閱，具備可讀取佇列中訊息之許可的使用者必須擷取訂閱確認 URL，且訂閱擁有者必須使用訂閱確認 URL 來確認訂閱。直到確認訂閱完成，都不會有發佈至主題的通知傳送至佇列。若要確認訂閱，您可以使用 Amazon SQS 主控台或 `[ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QueryReceiveMessage.html)` 動作。

**注意**  
讓端點訂閱主題之前，請設定佇列的 `sqs:SendMessage` 許可，以確定佇列可以接收主題的訊息。如需詳細資訊，請參閱[步驟 2：將許可提供給 Amazon SNS 主題，以將訊息傳送至 Amazon SQS 佇列。](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. 在導覽面板上，選擇 **Subscriptions (訂閱)**。

1. 在**訂閱**頁面，選擇**建立訂閱**。

1.  在**建立訂閱**頁面上，於**詳細資訊**區段中，執行以下作業：

   1. 在 **Topic ARN (主題 ARN)** 中，輸入主題的 ARN。

   1. 在 **Protocol** (通訊協定) 中，選擇**Amazon SQS**。

   1. 針對 **Endpoint (端點)**，輸入佇列的 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. 在 **Body (本文)** 欄位中，執行下列操作：

   1. 選擇 **More Details (更多詳細資訊)**。

   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. 選擇相關**主題**。

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 主控台中檢視主題訂閱，您現在將會看到該訂閱 ARN 取代 **Subscription ID** (訂閱 ID) 欄位中的 **Pending Confirmation** (待確認中) 訊息。

## 如何強制訂閱以要求對取消訂閱請求進行身分驗證？
<a name="sns-send-message-to-sqs-cross-account-AuthenticateOnUnsubscribe"></a>

訂閱擁有者必須在訂閱確認時將`AuthenticateOnUnsubscribe` 標記設定為 true。
+ 當佇列擁有者建立訂閱時，`AuthenticateOnUnsubscribe` 將自動設定為 True。
+ 當瀏覽至訂閱確認連結而不進行身分驗證時，無法將 `AuthenticateOnUnsubscribe` 設定為 True。