

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

# 為 Amazon SQS 佇列訂閱 Amazon SNS 主題
<a name="subscribe-sqs-queue-to-sns-topic"></a>

若要啟用 Amazon SNS 主題將訊息傳送到 Amazon SQS 佇列，請選擇下列其中一項：
+ 使用 [Amazon SQS 主控台](https://console.aws.amazon.com/sqs/)，這簡化了這個過程。如需詳細資訊，請參閱 *Amazon Simple Queue Service 開發人員指南*中的[訂閱 Amazon SNS 主題的 Amazon SQS 佇列](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-subscribe-queue-sns-topic.html)。
+ 使用下列步驟：

  1. [取得您要傳送訊息的目標佇列的 Amazon Resource Name (ARN)，以及您要訂閱佇列的主題。](#SendMessageToSQS.arn)

  1. [將 `sqs:SendMessage` 許可提供給 Amazon SNS 主題，以便其可以將訊息傳送至佇列。](#SendMessageToSQS.sqs.permissions)

  1. [訂閱佇列至 Amazon SNS 主題](#SendMessageToSQS.subscribe)

  1. [提供 IAM 使用者或 AWS 帳戶 適當的許可，以發佈至 Amazon SNS 主題，並讀取來自 Amazon SQS 佇列的訊息。](#SendMessageToSQS.iam.permissions)

  1. [將訊息發佈至主題並讀取來自佇列的訊息以進行測試。](#SendMessageToSQS.test)

若要了解如何設定主題以傳送訊息至不同 AWS帳戶中的佇列，請參閱 [傳送 Amazon SNS 訊息至其他帳戶中的 Amazon SQS 佇列](sns-send-message-to-sqs-cross-account.md)。

若要查看建立主題以傳送訊息至兩個佇列的 CloudFormation 範本，請參閱 [使用 自動化 Amazon SNS 到 Amazon SQS 訊息 AWS CloudFormation](SendMessageToSQS.cloudformation.md)。

## 步驟 1：取得佇列和主題的 ARN
<a name="SendMessageToSQS.arn"></a>

訂閱佇列到您的主題時，您需要一份佇列的 ARN 副本。同樣地，提供許可給主題以傳送訊息至佇列時，您需要一份主題的 ARN 副本。

若要取得佇列 ARN，您可以使用 Amazon SQS 主控台或 [GetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QueryGetQueueAttributes.html) API 動作。

**從 Amazon SQS 主控台取得佇列 ARN**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/) 的 Amazon SQS 主控台。

1. 選取您要取得其 ARN 之佇列的方塊。

1. 從 **Details** (詳細資訊) 區段，複製 ARN 值，以便您可以用它訂閱到 Amazon SNS 主題。

若要取得主題 ARN，您可以使用 Amazon SNS 主控台、`[sns-get-topic-attributes](https://docs.aws.amazon.com/cli/latest/reference/sns/get-topic-attributes.html)` 命令或 `[GetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QueryGetQueueAttributes.html)` API 動作。

**從 Amazon SNS 主控台取得主題 ARN**

1. 登入 [Amazon SNS 主控台](https://console.aws.amazon.com/sns/home)。

1. 在導覽面板上，選擇您要取得 ARN 的主題。

1. 從 **Details** (詳細資訊) 區段，複製 **ARN** 值，以便您可以用它將許可提供給 Amazon SNS 主題以將訊息傳送至佇列。

## 步驟 2：將許可提供給 Amazon SNS 主題，以將訊息傳送至 Amazon SQS 佇列。
<a name="SendMessageToSQS.sqs.permissions"></a>

為了讓 Amazon SNS 主題能夠傳送訊息至佇列，您必須對佇列設定政策，允許 Amazon SNS 主題執行 `sqs:SendMessage` 動作。

在您訂閱佇列到主題之前，您需要主題和佇列。如果您尚未建立主題或佇列，請現在建立。如需詳細資訊，請參閱 [建立主題](sns-create-topic.md)，並參閱 *Amazon Queue Service 開發人員指南*中的[建立佇列](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/step-create-queue.html)。

若要取得有關佇列的政策，您可以使用 Amazon SQS 主控台或 [SetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QuerySetQueueAttributes.html) API 動作。開始之前，請確定您擁有您想要允許傳送訊息至佇列之主題的 ARN。如果您要訂閱佇列至多個主題，則政策必須為每個主題包含一個 `Statement` 元素。

**使用 Amazon SQS 主控台設定佇列的 SendMessage 政策**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/) 的 Amazon SQS 主控台。

1. 選取您要設定其政策之佇列的方塊，選擇 **Access policy** (存取政策) 索引標籤，然後選擇 **Edit** (編輯)。

1. 在**存取政策**區段中，定義誰可以存取您的佇列。
   + 新增條件以允許用於主題的動作。
   + 將 `Principal` 設定為 Amazon SNS 服務，如下列範例所示。
   + 使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 或者 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全域條件金鑰，以防止[混淆代理人](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)案例。如要使用這些條件金鑰，請將值設定為主題的 ARN。若您的佇列訂閱了多個主題，則可改用 `aws:SourceAccount`。

   例如，下列政策允許 MyTopic 傳送訊息至 MyQueue。

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

## 步驟 3：將佇列訂閱至 Amazon SNS 主題
<a name="SendMessageToSQS.subscribe"></a>

若要透過主題傳送訊息至佇列，您必須訂閱佇列至 Amazon SNS 主題。您按照其 ARN 指定佇列。若要訂閱主題，您可以使用 Amazon SNS 主控台、`[sns-subscribe](https://docs.aws.amazon.com/cli/latest/reference/sns/subscribe.html)` CLI 命令或 `[Subscribe](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html)` API 動作。開始之前，請確定您擁有想要訂閱佇列的 ARN。

1. 登入 [Amazon SNS 主控台](https://console.aws.amazon.com/sns/home)。

1. 在導覽面板上，選擇 **Topics (主題)**。

1. 在 **Topics** (主題) 頁面上，選擇主題。

1. 在 {{**MyTopic**}} (我的主題) 頁面上，於 **Subscriptions** (訂閱) 頁面中，選擇 **Create subscription** (建立訂閱)。

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

   1. 驗證 **Topic ARN** (主題 ARN)。

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

   1. 針對 **Endpoint** (端點)，輸入 Amazon SQS 佇列的 ARN。

   1. 選擇 **Create Subscription** (建立訂閱)。

   確認訂閱之後，您新訂閱的 **Subscription ID** (訂閱 ID) 就會顯示其訂閱 ID。如果佇列的擁有者建議訂閱，訂閱會自動確認並且訂閱應該立即啟用。

   通常，您會訂閱您自己的佇列到您帳戶中您自己的主題。不過，您也可以從不同帳戶訂閱佇列到您的主題。如果建立訂閱的使用者不是佇列的擁有者 (例如，帳戶 A 的使用者訂閱帳戶 B 的佇列到帳戶 A 中的主題)，訂閱必須經過確認。如需有關訂閱不同帳戶的佇列和確認訂閱的詳細資訊，請參閱 [傳送 Amazon SNS 訊息至其他帳戶中的 Amazon SQS 佇列](sns-send-message-to-sqs-cross-account.md)。

## 步驟 4：提供使用者適當主題和佇列動作的許可
<a name="SendMessageToSQS.iam.permissions"></a>

您應該使用 AWS Identity and Access Management (IAM) 只允許適當的使用者發佈至 Amazon SNS 主題，並從 Amazon SQS 佇列讀取/刪除訊息。如需控制 IAM 使用者之主題和佇列動作的詳細資訊，請參閱 [使用以身分為基礎的政策搭配 Amazon SNS](sns-using-identity-based-policies.md)，以及位於 Amazon Simple Queue Service 開發人員指南中[Amazon SQS 中的 Identity and Access Management](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/UsingIAM.html)。

控制對主題或佇列的存取有兩種方式：
+ [新增政策到 IAM 使用者或群組](#SendMessageToSQS.iam.permissions.user)。提供使用者主題或佇列的許可的最簡單方式，是建立群組和新增適當的政策到群組，然後新增使用者到該群組。從群組新增和移除使用者比起追蹤對個別使用者設定了哪些政策要來得簡單多。
+ [新增政策到主題或佇列](#SendMessageToSQS.iam.permissions.resource)。如果您想要將主題或佇列的許可授予另一個 AWS 帳戶，唯一的方法是新增 政策做為 AWS 帳戶 您想要授予許可的委託人。

對於大多數案例，您應使用第一個方式 (透過新增或移除適當使用者到群組，來套用政策到群組和管理許可)。如果您需要提供許可給其他帳戶中的使用者，您應使用第二個方式。

### 新增政策到 IAM 使用者或群組
<a name="SendMessageToSQS.iam.permissions.user"></a>

如果已新增下列政策到 IAM 使用者或群組，您要提供該使用者或該群組的成員許可，以對主題取得 MyTopic 執行 `sns:Publish` 動作。

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

如果您已新增下列政策到 IAM 使用者或群組，您要提供該使用者或該群組的成員許可，以對佇列 MyQueue1 和 MyQueue2 執行 `sqs:ReceiveMessage` 和 `sqs:DeleteMessage` 動作。

```
{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "sqs:ReceiveMessage",
        "sqs:DeleteMessage"
      ],
      "Resource": [
        "arn:aws:sqs:us-east-2:123456789012:MyQueue1",
        "arn:aws:sqs:us-east-2:123456789012:MyQueue2"
      ]
    }
  ]
}
```

### 新增政策到主題或佇列
<a name="SendMessageToSQS.iam.permissions.resource"></a>

下列範例政策顯示如何提供其他帳戶主題和佇列的許可。

**注意**  
當您授予帳戶中資源的另一個 AWS 帳戶 存取權時，您也會授予對該資源具有管理員層級存取 （萬用字元存取） 許可的 IAM 使用者。其他帳戶中的所有其他 IAM 使用者都會自動拒絕存取您的資源。如果您想要提供該 AWS 帳戶 中特定 IAM 使用者對您資源的存取權，具有管理員層級權限的帳戶或 使用者必須將資源的許可委派給那些 IAM 使用者。如需跨帳戶委派的詳細資訊，請參閱[使用 IAM 指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/Delegation.html)中的*啟用跨帳戶存取權*。

如果您已新增下列政策到帳戶 123456789012 中的主題「我的主題」，您要提供帳戶 111122223333 許可，以對該主題執行 `sns:Publish` 動作。

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

如果您已新增下列政策到帳戶 123456789012 中的佇列 MyQueue，您要提供帳戶 111122223333 許可，以對該佇列執行 `sqs:ReceiveMessage` 和 `sqs:DeleteMessage` 動作。

```
{
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "111122223333"
      },
      "Action": [
        "sqs:DeleteMessage",
        "sqs:ReceiveMessage"
      ],
      "Resource": [
        "arn:aws:sqs:us-east-2:123456789012:MyQueue"
      ]
    }
  ]
}
```

## 步驟 5：測試主題的佇列訂閱
<a name="SendMessageToSQS.test"></a>

您可以透過發佈至主題並檢視主題傳送至佇列的訊息，來測試主題的佇列。

**使用 Amazon SNS 主控台發佈至主題**

1. 使用具有發佈至 主題許可的 AWS 帳戶 或 IAM 使用者的登入資料，登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/sns/](https://console.aws.amazon.com/sns/home) 的 Amazon SNS 主控台。

1. 在導覽面板上，選擇主題並選擇 **Publish to Topic** (發佈至主題)。

1. 在 **Subject** (主旨) 方塊中，輸入主旨 (例如，**Testing publish to queue**)，在 **Message** (訊息) 方塊中，輸入一些文字 (例如，**Hello world\!**)，並選擇 **Publish Message** (發佈訊息)。下列訊息顯示：您的訊息已成功發佈。

**使用 Amazon SQS 主控台檢視來自主題的訊息**

1. 使用 AWS 帳戶 或 IAM 使用者的登入資料搭配檢視佇列中訊息的許可，登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/) 的 Amazon SQS 主控台。

1. 選擇已訂閱至主題的 **queue** (佇列)。

1. 選擇 **Send and receive messages** (傳送和接收訊息)，然後選擇 **Poll for messages** (訊息輪詢)。類型為 **Notification** (通知) 的訊息隨即出現。

1. 在 **Body** (內文) 欄位中，選擇 **More Details** (更多詳細資訊)。**Message Details** (更多詳細資訊) 方塊包含 JSON 文件，該文件包含您發佈至主題的主旨和訊息。訊息看起來類似以下 JSON 文件。

   ```
   {
     "Type" : "Notification",
     "MessageId" : "63a3f6b6-d533-4a47-aef9-fcf5cf758c76",
     "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
     "Subject" : "Testing publish to subscribed queues",
     "Message" : "Hello world!",
     "Timestamp" : "2012-03-29T05:12:16.901Z",
     "SignatureVersion" : "1",
     "Signature" : "EXAMPLEnTrFPa3...",
     "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem",
     "UnsubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:123456789012:MyTopic:c7fe3a54-ab0e-4ec2-88e0-db410a0f2bee"
   }
   ```

1. 選擇 **Close** (關閉)。您已成功發佈至主題，其會傳送通知訊息至佇列。