

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

# 將 Amazon SNS application-to-application傳訊
<a name="sns-system-to-system-messaging"></a>

Amazon SNS 透過將發佈者與支援微服務、分散式系統和無伺服器應用程式的訂閱者分開來簡化application-to-application (A2A) 的訊息傳送。訊息會傳送到 Amazon SNS 主題，您可以在其中篩選並傳送給訂閱者，例如 Lambda、Amazon SQS 或 HTTP 端點。如果傳遞失敗，訊息會存放在無效字母佇列中，以供進一步分析或重新處理。

![\[Amazon SNS 透過使用主題將發佈者與訂閱者解耦，促進application-to-application傳訊。系統或服務的訊息會透過 Amazon SNS 主題路由，您可以在其中篩選並分發給訂閱者，例如 Lambda、Amazon SQS 或電子郵件系統。如果交付失敗，訊息會存放在無效字母佇列中，以供日後分析或重新處理。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-a2a-overview.png)


# 散發到 Firehose 交付串流
<a name="sns-firehose-as-subscriber"></a>

您可以訂閱 [ Amazon SNS 主題的交付串流](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html)，讓您將通知傳送至其他儲存和分析端點。 Amazon SNS 發佈至 Amazon SNS 主題的訊息會傳送至訂閱的 Firehose 交付串流，並依照 Firehose 中的設定交付至目的地。訂閱擁有者最多可將五個 Firehose 交付串流訂閱至 Amazon SNS 主題。每個 Firehose 交付串流都有請求和每秒輸送量[的預設配額](https://docs.aws.amazon.com/firehose/latest/dev/limits.html)。這項限制可能會導致發佈的訊息數 (輸入流量) 多於傳遞的訊息數 (輸出流量)。當輸入流量超過輸出流量時，您的訂閱可能會累積大量的訊息待處理項目，便會導致郵件傳遞延遲過高。您可以根據發布率請求[增加配額](https://support.console.aws.amazon.com/support/home#/case/create?issueType=service-limit-increase)，以避免對工作負載造成不利影響。

透過 Firehose 交付串流，您可以將 Amazon SNS 通知分發給 Amazon Simple Storage Service (Amazon S3)、Amazon Redshift、Amazon OpenSearch Service (OpenSearch Service)，以及第三方服務供應商，例如 Datadog、New Relic、MongoDB 和 Splunk。

例如，您可以使用此功能將傳送至某個主題的訊息永久存放在 Amazon S3 儲存貯體中，以進行合規、封存或其他用途。若要這樣做，請使用 Amazon S3 儲存貯體目的地建立 Firehose 交付串流，並將該交付串流訂閱 Amazon SNS 主題。另一個範例，若要對傳送至 Amazon SNS 主題的訊息執行分析，請使用 OpenSearch Service 索引目標建立交付串流。然後，您可以將 Firehose 交付串流訂閱 Amazon SNS 主題。

Amazon SNS 也支援傳送至 Firehose 端點之通知的訊息傳遞狀態記錄。如需詳細資訊，請參閱[Amazon SNS 訊息傳遞狀態](sns-topic-attributes.md)。

# 訂閱 Firehose 交付串流至 Amazon SNS 主題的先決條件
<a name="prereqs-kinesis-data-firehose"></a>

若要訂閱 SNS 主題的交付串流，您的 AWS 帳戶 必須具有：
+ 標準 SNS 主題。如需詳細資訊，請參閱[建立 Amazon SNS 主題](sns-create-topic.md)。
+ Firehose 交付串流。如需詳細資訊，請參閱《Amazon Data Firehose 開發人員指南》中的[建立交付串流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)並授予應用程式存取 Firehose 資源的權限。 [https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html#access-to-firehose](https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html#access-to-firehose) **
+ 信任 Amazon SNS 服務主體並具有寫入交付串流許可的 AWS Identity and Access Management (IAM) 角色。您將在建立訂閱時輸入此角色的 Amazon 資源名稱 (ARN) 做為 `SubscriptionRoleARN`。Amazon SNS 擔任此角色，允許 Amazon SNS 將記錄放入 Firehose 交付串流。

  以下範例政策顯示建議的許可：

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

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": [
          "firehose:DescribeDeliveryStream",
          "firehose:ListDeliveryStreams",
          "firehose:ListTagsForDeliveryStream",
          "firehose:PutRecord",
          "firehose:PutRecordBatch"
        ],
        "Resource": [
          "arn:aws:firehose:us-east-1:111111111111:deliverystream/firehose-sns-delivery-stream"
        ],
        "Effect": "Allow"
      }
    ]
  }
  ```

------

  若要提供使用 Firehose 的完整許可，您也可以使用 AWS 受管政策 `AmazonKinesisFirehoseFullAccess`。或者，若要提供更嚴格的 Firehose 使用許可，您可以建立自己的政策。至少，政策必須提供在特定的交付串流上執行 `PutRecord` 操作的許可。

  在所有情況下，您也必須編輯信任關係以包含 Amazon SNS 服務主體。例如：

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

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": "sns.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  }
  ```

------

  如需建立角色的詳細資訊，請參閱《*IAM 使用者指南*》中的[建立角色以將許可委派給 AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

完成這些需求後，您可以[將交付串流訂閱至 SNS 主題](firehose-endpoints-subscribe.md)。

# 訂閱 Firehose 交付串流至 Amazon SNS 主題
<a name="firehose-endpoints-subscribe"></a>

若要將 Amazon SNS 通知交付至[交付串流](sns-firehose-as-subscriber.md)，請先確定您已滿足所有[先決條件](prereqs-kinesis-data-firehose.md)。如需支援的端點清單，請參閱 中的[端點和配額](https://docs.aws.amazon.com/general/latest/gr/fh.html)*Amazon Web Services 一般參考*。

**訂閱 Firehose 交付串流至主題**

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

1. 在導覽窗格中，選擇**訂閱**。

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

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

   1. 針對 **Topic ARN** (ARN 主題)，選擇標準主題的 Amazon 資源名稱 (ARN)。

   1. 針對**通訊協定**，選擇 **Firehose**。

   1. 針對**端點**，選擇可從 Amazon SNS 接收通知的 Firehose 交付串流的 ARN。

   1. 針對**訂閱角色 ARN**，指定您為寫入 Firehose 交付串流所建立之 AWS Identity and Access Management (IAM) 角色的 ARN。如需詳細資訊，請參閱[訂閱 Firehose 交付串流至 Amazon SNS 主題的先決條件](prereqs-kinesis-data-firehose.md)。

   1. (選擇性) 若要從已發佈訊息中移除任何 Amazon SNS 中繼資料，請選擇**啟用原始訊息交付**。如需詳細資訊，請參閱[Amazon SNS 原始訊息交付](sns-large-payload-raw-message-delivery.md)。

1. (選用) 若要設定篩選政策，請展開 **Subscription filter policy** (訂閱篩選政策) 區段。如需詳細資訊，請參閱[Amazon SNS 訂閱篩選政策](sns-subscription-filter-policies.md)。

1. (選用) 若要設定訂閱的無效字母佇列，請展開 **Redrive policy (dead-letter queue)** (重新磁碟機政策 (無效字母佇列)) 區段。如需詳細資訊，請參閱[Amazon SNS 無效字母佇列](sns-dead-letter-queues.md)。

1. 選擇**建立訂閱**。

主控台會建立訂閱並開啟訂閱的 **Details** (詳細資訊) 頁面

# 跨多個交付串流目的地管理 Amazon SNS 訊息
<a name="firehose-working-with-destinations"></a>

[ 交付串流](sns-firehose-as-subscriber.md)可讓您跨多個目的地管理 Amazon SNS 訊息，啟用與 Amazon S3、Amazon OpenSearch Service、Amazon Redshift 和 HTTP 端點的整合，以進行儲存、索引和分析。透過正確設定訊息格式和交付，您可以將 Amazon SNS 通知儲存在 Amazon S3 中以供日後處理、使用 Amazon Athena 分析結構化訊息資料、在 OpenSearch 中為即時搜尋和視覺化編製索引訊息，以及在 Amazon Redshift 中為進階查詢建立結構封存。

# 在 Amazon S3 目的地中存放和分析 Amazon SNS 訊息 Amazon S3
<a name="firehose-s3-destinations"></a>

本主題說明交付串流如何將資料發佈至 Amazon Simple Storage Service (Amazon S3)。

![\[Amazon 服務用於訊息處理的整合和工作流程。它顯示發佈者如何傳送訊息至 Amazon SNS 主題，然後將訊息散播至多個 Amazon SQS 佇列和 Data Firehose 交付串流。從那裡，Lambda 函數可以處理訊息，或持續存放在 Amazon S3 儲存貯體中。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/firehose-architecture-s3.png)


**Topics**
+ [Amazon S3 目的地中儲存體的格式化通知](firehose-archived-message-format-S3.md)
+ [使用 Athena 分析存放在 Amazon S3 中的訊息](firehose-message-analysis-s3.md)

# 格式化 Amazon SNSAmazon S3 SNS 通知
<a name="firehose-archived-message-format-S3"></a>

下列範例顯示傳送至 Amazon Simple Storage Service (Amazon S3) 儲存貯體的 Amazon SNS 通知，其中包含可讀性縮排。Amazon S3

**注意**  
在此範例中，已針對已發佈的訊息停用原始訊息交付。停用原始訊息交付時，Amazon SNS 會將 JSON 中繼資料新增至訊息，包括下列屬性：  
`Type`
`MessageId`
`TopicArn`
`Subject`
`Timestamp`
`UnsubscribeURL`
`MessageAttributes`
如需原始交付的詳細資訊，請參閱 [Amazon SNS 原始訊息交付](sns-large-payload-raw-message-delivery.md)。

```
{
    "Type": "Notification",
    "MessageId": "719a6bbf-f51b-5320-920f-3385b5e9aa56",
    "TopicArn": "arn:aws:sns:us-east-1:333333333333:my-kinesis-test-topic",     
    "Subject": "My 1st subject",
    "Message": "My 1st body",
    "Timestamp": "2020-11-26T23:48:02.032Z",
    "UnsubscribeURL": "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:333333333333:my-kinesis-test-topic:0b410f3c-ee5e-49d8-b59b-3b4aa6d8fcf5",
    "MessageAttributes": {
        "myKey1": {
            "Type": "String",
            "Value": "myValue1"
        },
        "myKey2": {
            "Type": "String",
            "Value": "myValue2"
        }
    }
 }
```

下列範例顯示透過交付串流傳送至相同 Amazon S3 儲存貯體的三則 SNS 訊息。會套用緩衝，且折線會分隔每個訊息。

```
{"Type":"Notification","MessageId":"d7d2513e-6126-5d77-bbe2-09042bd0a03a","TopicArn":"arn:aws:sns:us-east-1:333333333333:my-kinesis-test-topic","Subject":"My 1st subject","Message":"My 1st body","Timestamp":"2020-11-27T00:30:46.100Z","UnsubscribeURL":"https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:313276652360:my-kinesis-test-topic:0b410f3c-ee5e-49d8-b59b-3b4aa6d8fcf5","MessageAttributes":{"myKey1":{"Type":"String","Value":"myValue1"},"myKey2":{"Type":"String","Value":"myValue2"}}}
{"Type":"Notification","MessageId":"0c0696ab-7733-5bfb-b6db-ce913c294d56","TopicArn":"arn:aws:sns:us-east-1:333333333333:my-kinesis-test-topic","Subject":"My 2nd subject","Message":"My 2nd body","Timestamp":"2020-11-27T00:31:22.151Z","UnsubscribeURL":"https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:313276652360:my-kinesis-test-topic:0b410f3c-ee5e-49d8-b59b-3b4aa6d8fcf5","MessageAttributes":{"myKey1":{"Type":"String","Value":"myValue1"}}}
{"Type":"Notification","MessageId":"816cd54d-8cfa-58ad-91c9-8d77c7d173aa","TopicArn":"arn:aws:sns:us-east-1:333333333333:my-kinesis-test-topic","Subject":"My 3rd subject","Message":"My 3rd body","Timestamp":"2020-11-27T00:31:39.755Z","UnsubscribeURL":"https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:313276652360:my-kinesis-test-topic:0b410f3c-ee5e-49d8-b59b-3b4aa6d8fcf5"}
```

# 使用 Athena 分析存放在 Amazon S3 中的 Amazon SNS 訊息 Amazon S3
<a name="firehose-message-analysis-s3"></a>

此頁面說明如何分析透過交付串流傳送至 Amazon Simple Storage Service (Amazon S3) 目的地的 Amazon SNS 訊息。Amazon S3

**分析透過 Firehose 交付串流傳送至 Amazon S3 目的地的 SNS 訊息**

1. 設定您的 Amazon S3 資源。如需指示，請參閱《*Amazon Simple Storage Service 使用者指南*》中的[建立儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html)和《*Amazon Simple Storage Service 使用者指南*》中的[使用 Amazon S3 儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html)。

1. 設定交付串流。如需說明，請參閱[《Amazon Data Firehose 開發人員指南》中的為您的目的地選擇 Amazon S3](https://docs.aws.amazon.com/firehose/latest/dev/create-destination.html#create-destination-s3)。 **

1. 使用 [Amazon Athena](https://console.aws.amazon.com/athena) 查詢使用標準 SQL 的 Amazon S3 物件。如需詳細資訊，請參閱 *Amazon Athena 使用者指南*中的[入門](https://docs.aws.amazon.com/athena/latest/ug/getting-started.html)。

## 查詢範例
<a name="example-s3-query"></a>

在本範例查詢中，假設下列情況：
+ 訊息會儲存在 `default` 結構描述的 `notifications` 表格。
+ 所以此 `notifications` 表格包含具有 `string` 類型的 `timestamp` 欄位。

下列查詢會傳回在指定日期範圍內收到的所有 SNS 訊息：

```
SELECT * 
FROM default.notifications
WHERE from_iso8601_timestamp(timestamp) BETWEEN TIMESTAMP '2020-12-01 00:00:00' AND TIMESTAMP '2020-12-02 00:00:00';
```

# 將 Amazon SNS 訊息與 Amazon OpenSearch Service 目的地整合
<a name="firehose-elasticsearch-destinations"></a>

本節說明交付串流如何將資料發佈至 Amazon OpenSearch Service (OpenSearch Service)。

![\[發佈者傳送訊息至 Amazon SNS 主題，然後將這些訊息分佈至多個 Amazon SQS 佇列。來自這些佇列的訊息可由 Lambda 函數處理，或透過 Data Firehose 交付串流傳送至 Amazon OpenSearch Service，以建立可搜尋的訊息索引。此設定示範使用 的進階訊息路由和處理案例 AWS 服務。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/firehose-architecture-es.png)


**Topics**
+ [封存的訊息格式](firehose-archived-message-format-elasticsearch.md)
+ [分析訊息](firehose-message-analysis-elasticsearch.md)

# 在 OpenSearch Service 索引中存放和格式化 Amazon SNS 通知
<a name="firehose-archived-message-format-elasticsearch"></a>

下列範例示範傳送至名為 的 Amazon OpenSearch Service (OpenSearch Service) 索引的 Amazon SNS 通知`my-index`。 OpenSearch 此索引在 `Timestamp` 欄位。SNS 通知會放在 `_source` 屬性的酬載。

**注意**  
在此範例中，已針對已發佈的訊息停用原始訊息交付。停用原始訊息交付時，Amazon SNS 會將 JSON 中繼資料新增至訊息，包括下列屬性：  
`Type`
`MessageId`
`TopicArn`
`Subject`
`Timestamp`
`UnsubscribeURL`
`MessageAttributes`
如需原始交付的詳細資訊，請參閱 [Amazon SNS 原始訊息交付](sns-large-payload-raw-message-delivery.md)。

```
{
  "_index": "my-index",
  "_type": "_doc",
  "_id": "49613100963111323203250405402193283794773886550985932802.0",
  "_version": 1,
  "_score": null,
  "_source": {
    "Type": "Notification",
    "MessageId": "bf32e294-46e3-5dd5-a6b3-bad65162e136",
    "TopicArn": "arn:aws:sns:us-east-1:111111111111:my-topic",
    "Subject": "Sample subject",
    "Message": "Sample message",
    "Timestamp": "2020-12-02T22:29:21.189Z",
    "UnsubscribeURL": "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:111111111111:my-topic:b5aa9bc1-9c3d-452b-b402-aca2cefc63c9",
    "MessageAttributes": {
      "my_attribute": {
        "Type": "String",
        "Value": "my_value"
      }
    }
  },
  "fields": {
    "Timestamp": [
      "2020-12-02T22:29:21.189Z"
    ]
  },
  "sort": [
    1606948161189
  ]
}
```

# 分析 OpenSearch Service 目的地的 Amazon SNS 訊息
<a name="firehose-message-analysis-elasticsearch"></a>

本主題說明如何分析透過交付串流傳送至 Amazon OpenSearch Service (OpenSearch Service) 目的地的 Amazon SNS 訊息。 OpenSearch 

**分析透過 Firehose 交付串流傳送至 OpenSearch Service 目的地的 SNS 訊息**

1. 設定您的 OpenSearch Service 資源。如需指示，請參閱 *Amazon OpenSearch Service 開發人員指南*中的 [Amazon OpenSearch Service 入門](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/es-gsg.html)。

1. 設定交付串流。如需說明，請參閱《*Amazon Data Firehose 開發人員指南*》中的[為您的目的地選擇 OpenSearch Service](https://docs.aws.amazon.com/firehose/latest/dev/create-destination.html#create-destination-elasticsearch)。

1. 執行使用 OpenSearch Service 查詢和 Kibana 的查詢。如需詳細資訊，請參閱 *Amazon OpenSearch Service 開發人員指南*中的[步驟 3：在 OpenSearch Service 網域中搜尋文件](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/es-gsg-search.html)和 [Kibana](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/es-kibana.html)。

## 查詢範例
<a name="example-es-query"></a>

以下範例會查詢指定日期範圍內接收之所有 SNS 訊息的 `my-index` 索引：

```
POST https://search-my-domain.us-east-1.es.amazonaws.com/my-index/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "Timestamp": {
              "gte": "2020-12-08T00:00:00.000Z",
              "lte": "2020-12-09T00:00:00.000Z",
              "format": "strict_date_optional_time"
            }
          }
        }
      ]
    }
  }
}
```

# 在 Amazon Redshift 目的地中設定 Amazon SNS 訊息傳遞和分析
<a name="firehose-redshift-destinations"></a>

本主題說明如何將 Amazon SNS 通知散發至交付串流，然後將資料發佈至 Amazon Redshift。透過此設定，您可以連線至 Amazon Redshift 資料庫，並使用 SQL 查詢工具擷取符合特定條件的 Amazon SNS 訊息。

![\[寄件者發佈至 Amazon SNS 主題的訊息會分發至多個 Amazon SQS 佇列以供 Lambda 函數處理，也會透過 Data Firehose 交付串流傳送至 Amazon Redshift 叢集，以便在訊息資料倉儲中進行儲存和分析。此設定示範使用 的強大訊息處理和資料倉儲架構 AWS 服務。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/firehose-architecture-rs.png)


**Topics**
+ [在 Amazon Redshift 資料表中結構化訊息封存](firehose-archive-table-structure-redshift.md)
+ [分析存放在 Amazon Redshift 目的地中的訊息](firehose-message-analysis-redshift.md)

# 在 Amazon Redshift 資料表中結構化 Amazon SNS 訊息封存
<a name="firehose-archive-table-structure-redshift"></a>

對於 Amazon Redshift 端點，Amazon SNS 訊息會封存為資料表中的資料列。以下是如何存放資料的範例：

**注意**  
在此範例中，已針對已發佈的訊息停用原始訊息交付。停用原始訊息交付時，Amazon SNS 會將 JSON 中繼資料新增至訊息，包括下列屬性：  
`Type`
`MessageId`
`TopicArn`
`Subject`
`Message`
`Timestamp`
`UnsubscribeURL`
`MessageAttributes`
如需原始交付的詳細資訊，請參閱 [Amazon SNS 原始訊息交付](sns-large-payload-raw-message-delivery.md)。  
雖然 Amazon SNS 會使用此清單中顯示的大小寫將屬性新增至訊息，但 Amazon Redshift 表格中的欄名稱會以全部小寫字元顯示。若要轉換 Amazon Redshift 端點的 JSON 中繼資料，您可以使用 SQL `COPY` 命令。如需詳細資訊，請參閱 *Amazon Redshift 資料庫開發人員指南*中的[從 JSON 範例複製](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html#r_COPY_command_examples-copy-from-json)和[使用「auto 忽略」選項從 JSON 資料載入](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html#copy-from-json-examples-using-auto-ignorecase)。


|  type  |  messageid  |  topicarn  |  subject  |  message  |  timestamp  |  unsubscribeurl  |  messageattributes  | 
| --- | --- | --- | --- | --- | --- | --- | --- | 
|  通知  |  ea544832-a0d8-581d-9275-108243c46103  |  arn:aws:sns:us-east-1:111111111111:my-topic  |  範例主旨  |  訊息範例  |  2020-12-02T00:33:32.272Z  |  https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:111111111111:my-topic:326deeeb-cbf4-45da-b92b-ca77a247813b  |  \$1\$1"my\$1attribute\$1":\$1\$1"Type\$1":\$1"String\$1",\$1"Value\$1":\$1"my\$1value\$1"\$1\$1  | 
|  通知  |  ab124832-a0d8-581d-9275-108243c46114  |  arn:aws:sns:us-east-1:111111111111:my-topic  |  範例主旨 2  |  範例訊息 2  |  2020-12-03T00:18:11.129Z  |  https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:111111111111:my-topic:326deeeb-cbf4-45da-b92b-ca77a247813b  |  \$1\$1"my\$1attribute2\$1":\$1\$1"Type\$1":\$1"String\$1",\$1"Value\$1":\$1"my\$1value\$1"\$1\$1  | 
|  通知  |  ce644832-a0d8-581d-9275-108243c46125  |  arn:aws:sns:us-east-1:111111111111:my-topic  |  範例主旨 3  |  範例訊息 3  |  2020-12-09T00:08:44.405Z  |  https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:111111111111:my-topic:326deeeb-cbf4-45da-b92b-ca77a247813b  |  \$1\$1"my\$1attribute3\$1":\$1\$1"Type\$1":\$1"String\$1",\$1"Value\$1":\$1"my\$1value\$1"\$1\$1  | 

如需將通知展開到 Amazon Redshift 端點的詳細資訊，請參閱 [在 Amazon Redshift 目的地中設定 Amazon SNS 訊息傳遞和分析](firehose-redshift-destinations.md)。

# 分析存放在 Amazon Redshift 目的地中的 Amazon SNS 訊息
<a name="firehose-message-analysis-redshift"></a>

本主題說明如何分析透過交付串流傳送至 Amazon Redshift 目的地的 Amazon SNS 訊息。

**分析透過 Firehose 交付串流傳送至 Amazon Redshift 目的地的 SNS 訊息**

1. 設定您的 Amazon Redshift 資源。如需說明，請參閱 *Amazon Redshift 入門指南*中的 [Amazon Redshift 入門](https://docs.aws.amazon.com/redshift/latest/gsg/getting-started.html)。

1. 設定交付串流。如需說明，請參閱[《Amazon Data Firehose 開發人員指南》中的為您的目的地選擇 Amazon Redshift](https://docs.aws.amazon.com/firehose/latest/dev/create-destination.html#create-destination-redshift)。 **

1. 執行查詢。如需詳細資訊，請參閱《Amazon Redshift 管理指南》**中的[使用查詢編輯器來查詢資料庫](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor.html)。

## 查詢範例
<a name="example-rs-query"></a>

在本範例查詢中，假設下列情況：
+ 訊息會儲存在預設 `public` 結構描述的 `notifications` 表格。
+ 來自 SNS 訊息的 `Timestamp` 屬性會儲存在表格欄位資料類型為 `timestamptz` 的 `timestamp` 欄。
**注意**  
若要轉換 Amazon Redshift 端點的 JSON 中繼資料，您可以使用 SQL `COPY` 命令。如需詳細資訊，請參閱 *Amazon Redshift 資料庫開發人員指南*中的[從 JSON 範例複製](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html#r_COPY_command_examples-copy-from-json)和[使用「auto 忽略」選項從 JSON 資料載入](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html#copy-from-json-examples-using-auto-ignorecase)。

下列查詢會傳回在指定日期範圍內收到的所有 SNS 訊息：

```
SELECT *
FROM public.notifications
WHERE timestamp > '2020-12-01T09:00:00.000Z' AND timestamp < '2020-12-02T09:00:00.000Z';
```

# 使用 設定 Amazon SNS 訊息傳遞至 HTTP 目的地
<a name="firehose-http-destinations"></a>

本主題說明交付串流如何將資料發佈至 HTTP 端點。

![\[Amazon SNS 主題的發佈者，然後將訊息分配至多個 Amazon SQS 佇列。這些訊息由 Lambda 函數處理，也會透過 Data Firehose 交付串流傳送至 HTTP 端點。此設定展示 如何 AWS 服務 協同運作，以促進訊息處理和與外部 HTTP 服務的整合。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/firehose-architecture-http.png)


**Topics**
+ [傳送到 HTTP 目的地的通知格式](firehose-delivered-message-format-http.md)

# 用於傳送至 HTTP 目的地的 Amazon SNS 通知格式
<a name="firehose-delivered-message-format-http"></a>

以下是透過交付串流傳送至 HTTP 端點的 Amazon SNS HTTP POST 請求內文範例。Amazon SNS 通知在記錄屬性中編碼為 base64 承載。

**注意**  
在此範例中，已針對已發佈的訊息停用原始訊息交付。如需原始交付的詳細資訊，請參閱 [Amazon SNS 原始訊息交付](sns-large-payload-raw-message-delivery.md)。

```
"body": {
    "requestId": "ebc9e8b2-fce3-4aef-a8f1-71698bf8175f",
    "timestamp": 1606255960435,
    "records": [
      {
        "data": "eyJUeXBlIjoiTm90aWZpY2F0aW9uIiwiTWVzc2FnZUlkIjoiMjFkMmUzOGQtMmNhYi01ZjYxLTliYTItYmJiYWFhYzg0MGY2IiwiVG9waWNBcm4iOiJhcm46YXdzOnNuczp1cy1lYXN0LTE6MTExMTExMTExMTExOm15LXRvcGljIiwiTWVzc2FnZSI6IlNhbXBsZSBtZXNzYWdlIGZvciBBbWF6b24gS2luZXNpcyBEYXRhIEZpcmVob3NlIGVuZHBvaW50cyIsIlRpbWVzdGFtcCI6IjIwMjAtMTEtMjRUMjI6MDc6MzEuNjY3WiIsIlVuc3Vic2NyaWJlVVJMIjoiaHR0cHM6Ly9zbnMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6MTExMTExMTExMTExOm15LXRvcGljOjAxYjY5MTJjLTAwNzAtNGQ4Yi04YjEzLTU1NWJmYjc2ZTdkNCJ9"
      }
    ]
  }
```

# Amazon SNS 訊息封存和分析：航空公司售票平台的範例使用案例
<a name="firehose-example-use-case"></a>

本主題提供封存和分析 Amazon SNS 訊息之常見使用案例的教學課程。

此使用案例的設定是在受規範的環境中運作的航空公司票務平台。

1. 該平台受到合規架構的規範，該架構要求公司將所有門票銷售封存至少五年。

1. 為了符合資料保留的合規目標，公司會訂閱現有 Amazon SNS 主題的交付串流。

1. 交付串流的目標是 Amazon Simple Storage Service (Amazon S3) 儲存貯體。透過此組態，發佈至 SNS 主題的所有事件都會封存在 Amazon S3 儲存貯體中。

以下圖表說明此組態的架構：

![\[航空公司售票平台的 AWS 架構，說明如何處理和存檔售票資料。它透過 Amazon SNS 主題顯示來自 Lambda 函數的資料流程，然後將訊息分發至 Amazon SQS 佇列以進行付款處理和詐騙偵測，並由個別的 Lambda 函數處理。資料也會透過 Data Firehose 串流到 Amazon S3 儲存貯體以進行長期封存，以支援資料保留要求的合規性。此設定可讓平台使用 Amazon Athena 等工具，對票證銷售資料執行詳細的分析。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-archiving-use-case.png)


為了執行分析並獲得門票銷售的見解，該公司使用 Amazon Athena 進行 SQL 查詢。例如，公司可以查詢以了解最受歡迎的目的地和最常旅客。

若要建立此使用案例 AWS 的資源，您可以使用 AWS 管理主控台 或 CloudFormation 範本。

**Topics**
+ [設定訊息封存和分析的初始 AWS 資源](firehose-example-initial-resources.md)
+ [設定 Firehose 交付串流以進行訊息封存](firehose-example-create-delivery-stream.md)
+ [訂閱主題的交付串流](firehose-example-subscribe-delivery-stream-to-topic.md)
+ [測試和查詢組態以進行有效的資料管理](firehose-example-test-and-query.md)
+ [使用 CloudFormation 範本自動化訊息封存](firehose-example-cfn.md)

# 設定 Amazon SNS 訊息封存和分析的初始 AWS 資源
<a name="firehose-example-initial-resources"></a>

本主題說明如何建立[訊息封存和分析範例使用案例](firehose-example-use-case.md)所需的資源：
+ 一個 Amazon Simple Storage Service (Amazon S3) 儲存貯體
+ 兩個 Amazon Simple Queue Service (Amazon SQS) 佇列
+ Amazon SNS 主題
+ 兩個 Amazon SQS 訂閱的 Amazon SNS 主題

**建立初始資源**

1. 建立 Amazon S3 儲存貯體：<a name="firehose-use-case-create-bucket"></a>

   1. 開啟 [Amazon S3 主控台](https://console.aws.amazon.com/s3/home)。

   1. 選擇 **建立儲存貯體** 。

   1. 對於 **Bucket name** (儲存貯體名稱)，輸入一個唯一名稱。將其他欄位保留為預設值。

   1. 選擇**建立儲存貯體**。

   如需 Amazon S3 儲存貯體的詳細資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的[建立儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html)和《*Amazon Simple Storage Service 使用者指南*》中的[使用 Amazon S3 儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html)。

1. 建立兩個 Amazon SQS 佇列：

   1. 開啟 [Amazon SQS 主控台](https://console.aws.amazon.com/sqs/home)。

   1. 選擇**建立佇列**。

   1. 針對**類型**，選擇**標準**。

   1. 對於**名稱**，輸入 **ticketPaymentQueue**。

   1. 在 **Access policy** (存取政策) 下方的 **Choose method** (選擇方法) 中，選擇 **Advanced** (進階)。

   1. 在 JSON 政策方塊中，貼上下列政策：

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

****  

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

------

      在此存取政策中，將 AWS 帳戶 號碼 (*123456789012*) 取代為您自己的號碼，並相應地變更 AWS 區域 (*us-east-1*)。

   1. 選擇**建立佇列**。

   1. 重複這些步驟，建立第二個名為 **ticketFraudQueue** 的 SQS 佇列。

   如需建立 SQS 佇列的詳細資訊，請參閱 *Amazon Simple Queue Data 開發人員指南*中的[建立 Amazon SQS 佇列 (主控台)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-create-queue.html)。

1. 建立 SNS 主題：

   1. 在 Amazon SNS 主控台開啟 [Topics](https://console.aws.amazon.com/sns/home#/topics) (主題) 頁面。

   1. 請選擇**建立主題**。

   1. 在 **Details** (詳細資訊) 下方的 **Type** (類型) 中，選擇 **Standard** (標準)。

   1. 對於**名稱**，輸入 **ticketTopic**。

   1. 請選擇**建立主題**。

   如需建立 SNS 主題的詳細資訊，請參閱 [建立 Amazon SNS 主題](sns-create-topic.md)。

1. 訂閱 SQS 佇列至 SNS 主題：

   1. 在 [Amazon SNS 主控台](https://console.aws.amazon.com/sns/home#/topics)中的 **ticketTopic** 主題的詳細資訊頁面，選擇 **Create subscription** (建立訂閱)。

   1. 在 **Details** (詳細資訊) 的 **Protocol** (通訊協定) 中，選擇 **Amazon SQS**。

   1. 針對 **Endpoint** (端點)，選擇 **ticketPaymentQueue**佇列的 Amazon 資源名稱 (ARN)。

   1. 選擇**建立訂閱**。

   1. 重複這些步驟來建立使用 **ticketFraudQueue** 佇列 的 ARN 的第二個訂閱。

      如需訂閱 SNS 主題的詳細資訊，請參閱 [建立 Amazon SNS 主題的訂閱](sns-create-subscribe-endpoint-to-topic.md)。您也可以從 Amazon SQS 主控台訂閱 SQS 佇列至 SNS 主題。如需詳細資訊，請參閱 *Amazon Simple Queue Service 開發人員指南*中的[訂閱 Amazon SNS 主題 (主控台) 的 Amazon SQS 佇列](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-subscribe-queue-sns-topic.html)。

您已為此範例使用案例建立初始資源。若要繼續，請參閱 [設定 Amazon Data Firehose 交付串流以進行 Amazon SNS 訊息封存](firehose-example-create-delivery-stream.md)。

# 設定 Amazon Data Firehose 交付串流以進行 Amazon SNS 訊息封存
<a name="firehose-example-create-delivery-stream"></a>

本主題說明如何為[訊息封存和分析範例使用案例](firehose-example-use-case.md)建立 Amazon Data Firehose 交付串流。

**建立 Amazon Data Firehose 交付串流**

1. 開啟 [Amazon Data Firehose 服務主控台](https://console.aws.amazon.com/kinesis/home)。

1. 選擇 **Firehose**，然後選擇**建立交付串流**。

1. 在 **New delivery stream** (新增交付串流) 頁面上的 **Delivery stream name** (交付串流名稱)，輸入 **ticketUploadStream**，然後選擇 **Next** (下一步)。

1. 在 **Process records** (處理記錄) 頁面上，選擇 **Next** (下一步)。

1. 在 **Choose a Destination** (選擇目的地) 頁面上，執行下列動作：

   1. 針對 **Destination** (目的地)，選擇 **Amazon S3**。

   1. 在 **S3 destination** (S3 目的地) 下方的 **S3 bucket** (S3 儲存貯體)，選擇您[最初建立](firehose-example-initial-resources.md)的 S3 儲存貯體。

   1. 選擇 **Next** (下一步)。

1. 在 **Configure settings** (組態設定) 頁面的 **S3 buffer conditions** (S3 緩衝區條件)，請執行下列動作：
   + 對於 **Buffer size** (緩衝大小)，輸入 **1**。
   + 對於 **Buffer interval** (緩衝區間隔)，輸入 **60**。

   將這些值用於 Amazon S3 緩衝區可讓您快速測試組態。第一個滿足的緩衝區條件會觸發 S3 儲存貯體的交付資料。

1. 在**設定設定**頁面上，針對**許可**，選擇使用自動指派的必要許可建立 AWS Identity and Access Management (IAM) 角色。然後選擇**下一步**。

1. 在 **Review** (檢閱) 頁面上，選擇 **Create delivery stream** (建立交付串流)。

1. 從 **Amazon Data Firehose 交付串流頁面，**選擇您剛建立的交付串流 (**ticketUploadStream**)。在 **Details** (詳細資訊) 索引標籤上，記下串流的 Amazon 資源名稱 (ARN) 以供日後使用。

如需建立交付串流的詳細資訊，請參閱[《Amazon Data Firehose 開發人員指南》中的建立 Amazon Data Firehose 交付串流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)。 **如需建立 IAM 角色的詳細資訊，請參閱《*IAM 使用者指南*》中的[建立角色以將許可委派給 AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

您已使用所需的許可建立 Firehose 交付串流。若要繼續，請參閱 [訂閱 Firehose 交付串流至 Amazon SNS 主題](firehose-example-subscribe-delivery-stream-to-topic.md)。

# 訂閱 Firehose 交付串流至 Amazon SNS 主題
<a name="firehose-example-subscribe-delivery-stream-to-topic"></a>

本主題說明如何為[訊息封存和分析範例使用案例](firehose-example-use-case.md)建立下列資源：
+ 允許 Amazon SNS 訂閱將記錄放置在交付串流上的 AWS Identity and Access Management (IAM) 角色。
+ Amazon SNS 主題的 Firehose 交付串流訂閱。

**為 Amazon SNS 訂閱建立 IAM 角色**

1. 開啟 IAM 主控台中的 [Roles page](https://console.aws.amazon.com/iam/home?#/roles) (角色頁面)。

1. 選擇 **建立角色**。

1. 對於 **Select type of trusted entity** (選取信任的實體類型)，選擇 **AWS service** (AWS 服務)。

1. 對於 **Choose a use case** (選擇使用案例)，選擇 **SNS**。然後選擇**下一步：許可**。

1. 選擇 **Next: Tags** (下一步：標籤)。

1. 選擇 **Next:Review (下一步：檢閱)**。

1. 在 **Review** (檢閱) 頁面，針對 **Role name** (角色名稱) 輸入 **ticketUploadStreamSubscriptionRole**。然後選擇 **Create role** (建立角色)。

1. 建立角色時，請選擇其名稱 (**ticketUploadStreamSubscriptionRole**)。

1. 在角色的 **Summary** (摘要) 頁面上，選擇 **Add inline policy** (新增內嵌政策)。

1. 在 **Create policy** (建立政策) 頁面上，選擇 **JSON** 索引標籤，然後張貼以下政策至文字方塊中：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Action": [
                   "firehose:DescribeDeliveryStream",
                   "firehose:ListDeliveryStreams",
                   "firehose:ListTagsForDeliveryStream",
                   "firehose:PutRecord",
                   "firehose:PutRecordBatch"
               ],
               "Resource": [
                   "arn:aws:firehose:us-east-1:123456789012:deliverystream/ticketUploadStream"
               ],
               "Effect": "Allow"
           }
       ]
   }
   ```

------

   在此政策中，將 AWS 帳戶 數字 (*123456789012*) 取代為您自己的數字，並相應地變更 AWS 區域 (*us-east-1*)。

1. 選擇 **Review policy** (檢閱政策)。

1. 在 **Review policy** (檢閱政策) 頁面的 **Name** (名稱) 中，輸入 **FirehoseSnsPolicy**。然後選擇 **Create policy** (建立政策)。

1. 在角色的 **Summary** (摘要) 頁面上，注意**角色 ARN** 供日後使用。

如需建立 IAM 角色的詳細資訊，請參閱《*IAM 使用者指南*》中的[建立角色以將許可委派給 AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

**將 Firehose 交付串流訂閱 SNS 主題**

1. 在 Amazon SNS 主控台開啟 [Topics](https://console.aws.amazon.com/sns/home#/topics) (主題) 頁面。

1. 在 **Subscriptions** (訂閱) 索引標籤上，選擇 **Create subscription** (建立訂閱)。

1. 在**詳細資訊**下，針對**通訊協定**，選擇 ****。

1. 對於 **Endpoint** (端點)，輸入 **ticketUploadStream** 的 Amazon 資源名稱 (ARN)，您先前建立的交付串流。例如，​輸入 **arn:aws:firehose:us-east-1:123456789012:deliverystream/ticketUploadStream**。

1. 對於 **Subscription role ARN** (訂閱角色 ARN)，輸入**ticketUploadStreamSubscriptionRole** 的 ARN，您先前建立的 IAM 角色。例如，​輸入 **arn:aws:iam::123456789012:role/ticketUploadStreamSubscriptionRole**。

1. 選取 **Enable raw message delivery** (啟用原始訊息交付) 核取方塊。

1. 選擇**建立訂閱**。

您已建立 IAM 角色和 SNS 主題訂閱。若要繼續，請參閱 [測試和查詢 Amazon SNS 組態以進行有效的資料管理](firehose-example-test-and-query.md)。

# 測試和查詢 Amazon SNS 組態以進行有效的資料管理
<a name="firehose-example-test-and-query"></a>

本主題說明如何透過將[訊息發佈至 Amazon SNS 主題來測試訊息封存和分析範例使用案例](firehose-example-use-case.md)。 Amazon SNS 這些指示包括一個範例查詢，您可以執行並適應自己的需求。

**若要測試組態**

1. 在 Amazon SNS 主控台開啟 [Topics](https://console.aws.amazon.com/sns/home#/topics) (主題) 頁面。

1. 選擇 **ticketTopic** 主題。

1. 選擇 **Publish message** (發佈訊息)。

1. 在 **Publish message to topic** (將訊息發佈至主題) 頁面上，輸入訊息內文的下列資訊。在訊息的結尾新增換行字元。

   ```
   {"BookingDate":"2020-12-15","BookingTime":"2020-12-15 04:15:05","Destination":"Miami","FlyingFrom":"Vancouver","TicketNumber":"abcd1234"}
   ```

   所有其他選項保持為預設值。

1. 選擇 **Publish message** (發佈訊息)。

   如需發佈郵件的詳細資訊，請參閱 [發佈 Amazon SNS 訊息](sns-publishing.md)。

1. 在 60 秒的交付串流間隔之後，開啟 [Amazon Simple Storage Service (Amazon S3) 主控台](https://console.aws.amazon.com/s3/home)並選擇您[最初建立](firehose-example-initial-resources.md)的 Amazon S3 儲存貯體。

   發佈的訊息會出現在儲存貯體中。

**查詢資料**

1. 開啟 [Amazon Athena 主控台](https://console.aws.amazon.com/athena/home)。

1. 執行查詢。

   例如，假設 `default` 架構中的 `notifications` 表格包含下列資料：

   ```
   {"BookingDate":"2020-12-15","BookingTime":"2020-12-15 04:15:05","Destination":"Miami","FlyingFrom":"Vancouver","TicketNumber":"abcd1234"}
   {"BookingDate":"2020-12-15","BookingTime":"2020-12-15 11:30:15","Destination":"Miami","FlyingFrom":"Omaha","TicketNumber":"efgh5678"}
   {"BookingDate":"2020-12-15","BookingTime":"2020-12-15 3:30:10","Destination":"Miami","FlyingFrom":"NewYork","TicketNumber":"ijkl9012"}
   {"BookingDate":"2020-12-15","BookingTime":"2020-12-15 12:30:05","Destination":"Delhi","FlyingFrom":"Omaha","TicketNumber":"mnop3456"}
   ```

   若要尋找第一目的地，執行下列查詢：

   ```
   SELECT destination
   FROM default.notifications
   GROUP BY destination
   ORDER BY count(*) desc
   LIMIT 1;
   ```

   若要查詢特定日期和時間範圍內銷售的票證，請執行類似下列的查詢：

   ```
   SELECT * 
   FROM default.notifications 
   WHERE bookingtime 
     BETWEEN TIMESTAMP '2020-12-15 10:00:00' 
     AND TIMESTAMP '2020-12-15 12:00:00';
   ```

   您可以根據自己的需求調整這兩個範例查詢。如需使用 Athena 執行查詢的詳細資訊，請參閱 *Amazon Athena 使用者指南*中的[入門](https://docs.aws.amazon.com/athena/latest/ug/getting-started.html)。

## 清除
<a name="firehose-example-cleanup"></a>

若要避免在完成測試後產生使用費用，請刪除您在教學課程期間建立的下列資源：
+ Amazon SNS 訂閱
+ Amazon SNS 主題
+ Amazon Simple Queue Service (Amazon SQS) 佇列
+ Amazon S3 儲存貯體
+  交付串流
+ AWS Identity and Access Management (IAM) 角色和政策

# 使用 CloudFormation 範本自動化 Amazon SNS 訊息封存
<a name="firehose-example-cfn"></a>

若要自動部署 Amazon SNS[訊息封存和分析範例使用案例](firehose-example-use-case.md)，您可以使用以下 YAML 範本：

```
---
AWSTemplateFormatVersion: '2010-09-09'
Description: Template for creating an SNS archiving use case
Resources:
  ticketUploadStream:
    DependsOn:
    - ticketUploadStreamRolePolicy
    Type: AWS::KinesisFirehose::DeliveryStream
    Properties:
      S3DestinationConfiguration:
        BucketARN: !Sub 'arn:${AWS::Partition}:s3:::${ticketArchiveBucket}'
        BufferingHints:
          IntervalInSeconds: 60
          SizeInMBs: 1
        CompressionFormat: UNCOMPRESSED
        RoleARN: !GetAtt ticketUploadStreamRole.Arn
  ticketArchiveBucket:
    Type: AWS::S3::Bucket
  ticketTopic:
    Type: AWS::SNS::Topic
  ticketPaymentQueue:
    Type: AWS::SQS::Queue
  ticketFraudQueue:
    Type: AWS::SQS::Queue
  ticketQueuePolicy:
    Type: AWS::SQS::QueuePolicy
    Properties:
      PolicyDocument:
        Statement:
          Effect: Allow
          Principal:
            Service: sns.amazonaws.com
          Action:
            - sqs:SendMessage
          Resource: '*'
          Condition:
            ArnEquals:
              aws:SourceArn: !Ref ticketTopic
      Queues:
        - !Ref ticketPaymentQueue
        - !Ref ticketFraudQueue
  ticketUploadStreamSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      TopicArn: !Ref ticketTopic
      Endpoint: !GetAtt ticketUploadStream.Arn
      Protocol: firehose
      SubscriptionRoleArn: !GetAtt ticketUploadStreamSubscriptionRole.Arn
  ticketPaymentQueueSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      TopicArn: !Ref ticketTopic
      Endpoint: !GetAtt ticketPaymentQueue.Arn
      Protocol: sqs
  ticketFraudQueueSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      TopicArn: !Ref ticketTopic
      Endpoint: !GetAtt ticketFraudQueue.Arn
      Protocol: sqs
  ticketUploadStreamRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17		 	 	 '
        Statement:
        - Sid: ''
          Effect: Allow
          Principal:
            Service: firehose.amazonaws.com
          Action: sts:AssumeRole
  ticketUploadStreamRolePolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: FirehoseticketUploadStreamRolePolicy
      PolicyDocument:
        Version: '2012-10-17		 	 	 '
        Statement:
        - Effect: Allow
          Action:
          - s3:AbortMultipartUpload
          - s3:GetBucketLocation
          - s3:GetObject
          - s3:ListBucket
          - s3:ListBucketMultipartUploads
          - s3:PutObject
          Resource:
          - !Sub 'arn:aws:s3:::${ticketArchiveBucket}'
          - !Sub 'arn:aws:s3:::${ticketArchiveBucket}/*'
      Roles:
      - !Ref ticketUploadStreamRole
  ticketUploadStreamSubscriptionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17		 	 	 '
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - sns.amazonaws.com
          Action:
          - sts:AssumeRole
      Policies:
      - PolicyName: SNSKinesisFirehoseAccessPolicy
        PolicyDocument:
          Version: '2012-10-17		 	 	 '
          Statement:
          - Action:
            - firehose:DescribeDeliveryStream
            - firehose:ListDeliveryStreams
            - firehose:ListTagsForDeliveryStream
            - firehose:PutRecord
            - firehose:PutRecordBatch
            Effect: Allow
            Resource:
            - !GetAtt ticketUploadStream.Arn
```

# 向 Lambda 函數發出 Amazon SNS 通知以進行自動化處理
<a name="sns-lambda-as-subscriber"></a>

Amazon SNS 與 整合 AWS Lambda，可讓您觸發 Lambda 函數以回應 Amazon SNS 通知。當訊息發佈到 Lambda 函數訂閱的 SNS 主題時，將使用已發佈訊息的酬載來叫用 Lambda 函數。Lambda 函數會以輸入參數的形式接收訊息承載，並可操作訊息中的資訊、將訊息發佈至其他 SNS 主題，或將訊息傳送至其他 AWS 服務。

此外，Amazon SNS 也針對傳送到 Lambda 端點的訊息通知，支援其訊息傳遞狀態屬性。如需詳細資訊，請參閱[Amazon SNS 訊息傳遞狀態](sns-topic-attributes.md)。

**Topics**
+ [先決條件](lambda-prereq.md)
+ [使用函數訂閱主題](lambda-console.md)

# 跨區域整合 Amazon SNS 與 Lambda 函數的先決條件
<a name="lambda-prereq"></a>

若要使用 Amazon SNS 通知叫用 Lambda 函數，您需要下列項目：
+ Lambda 函式
+ Amazon SNS 主題

如需建立 Lambda 函數以搭配使用的相 Amazon SNS 資訊，請參閱[搭配使用 Lambda 與 Amazon SNS](https://docs.aws.amazon.com/lambda/latest/dg/with-sns-example.html)。如需關於建立 Amazon SNS 主題的詳細資訊，請參閱[建立 SNS 主題](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html)。

 當您使用 Amazon SNS 將訊息從選擇加入區域傳遞至預設啟用的區域時，必須將委託人 `sns.amazonaws.com` 取代為 `sns.<opt-in-region>.amazonaws.com`，以變更在 AWS Lambda 函數中建立的政策。

 例如，如果您想要讓美國東部 (維吉尼亞北部) 的 Lambda 函數訂閱亞太區域 (香港) 的 SNS 主題，請將 AWS Lambda 函數政策中的委託人變更為 `sns.ap-east-1.amazonaws.com`。選擇加入區域包括 2019 年 3 月 20 日後推出的任何區域，其中包括亞太區域 (香港)、中東 (巴林)、歐洲 (米蘭) 和非洲 (開普敦)。2019 年 3 月 20 日之前推出的區域為預設啟用。

**注意**  
AWS 不支援從預設為選擇加入區域啟用的區域跨區域交付至 Lambda。此外，也不支援從選擇加入區域到其他選擇加入區域的跨區域轉送 SNS 訊息。

# 訂閱 Lambda 函數至 Amazon SNS 主題
<a name="lambda-console"></a>

本主題說明如何將 Lambda 函數訂閱 Amazon SNS 主題，讓發佈的訊息觸發函數。

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

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

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

1. 在 **Subscription** (訂閱) 區段中，選擇 **Create subscription** (建立訂閱)。

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

   1. 驗證所選擇的 **Topic ARN** (主題 ARN)。

   1. 針對**通訊協定**選擇 AWS Lambda。

   1. 針對 **Endpoint** (端點)，輸入函數的 ARN。

   1. 選擇**建立訂閱**。

當訊息發佈到 Lambda 函數訂閱的 SNS 主題時，將使用已發佈訊息的酬載來叫用 Lambda 函數。如需如何 AWS Lambda 搭配 Amazon SNS 使用 的資訊，包括教學課程，請參閱[AWS Lambda 搭配 Amazon SNS 使用](https://docs.aws.amazon.com/lambda/latest/dg/with-sns.html)。

# 向 Amazon SQS 佇列發出 Amazon SNS 通知以進行非同步處理 Amazon SQS
<a name="sns-sqs-as-subscriber"></a>

[Amazon SNS](https://aws.amazon.com/sns/) 與 Amazon Simple Queue Service (Amazon SQS) 緊密合作。這些服務提供開發人員不同優勢。Amazon SNS 可透過「推播」機制讓應用程式傳送分秒必爭的訊息給多個訂閱者，免除定期檢查或「輪詢」更新的需要。Amazon SQS 是一項訊息佇列服務，由所發佈的應用程式用來透過輪詢模式來交換訊息，並且可用來斷開傳送元件和接收元件的連結，而無需每個元件都同時可供使用。透過一起使用 Amazon SNS 和 Amazon SQS，訊息即可交付到需要立即事件通知的應用程式，並且也會保存在 Amazon SQS 佇列中以便稍後供其他應用程式處理使用。

當您訂閱 Amazon SQS 佇列到 Amazon SNS 主題時，您可以發佈訊息到主題，而 Amazon SNS 會傳送 Amazon SQS 訊息到訂閱的佇列。Amazon SQS 訊息包含已發佈至主題的主旨和訊息，同時包含有關 JSON 文件中訊息的中繼資料。Amazon SQS 訊息將看起來類似以下 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"
}
```

# 為 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\$1**)，並選擇 **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** (關閉)。您已成功發佈至主題，其會傳送通知訊息至佇列。

# 使用 自動化 Amazon SNS 到 Amazon SQS 訊息 AWS CloudFormation
<a name="SendMessageToSQS.cloudformation"></a>

CloudFormation 可讓您使用範本檔案，將資源集合 AWS 建立並設定為單一單位。本節含有可輕鬆部署發佈至佇列之主題的範例範本。範本為您執行所有設定步驟，建立兩個佇列，建立訂閱佇列的主題，新增政策至佇列，以便主題可以傳送訊息至佇列，以及建立 IAM 使用者和群組，以控制對那些資源的存取。

如需使用 CloudFormation 範本部署 AWS 資源的詳細資訊，請參閱*CloudFormation 《 使用者指南*[》中的入門](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/GettingStarted.Walkthrough.html)。

## 使用 CloudFormation 範本在 中設定主題和佇列 AWS 帳戶
<a name="SendMessageToSQS.cloudformation.iam"></a>

範例範本使用適當的許可，為一個 IAM 群組的成員，建立可將訊息傳送至兩個 Amazon SQS 佇列的 Amazon SNS 主題，以發佈至主題而另一個讀取來自佇列的訊息。範本也建立新增至各個群組的 IAM 使用者。

您可以將範本內容複製到檔案中。您也可以從 [AWS CloudFormation 範本頁面](https://aws.amazon.com/cloudformation/aws-cloudformation-templates/)下載範本。在範本頁面上，選擇**依 AWS 服務瀏覽範例範本**，然後選擇 **Amazon Simple Queue Service**。

MySNSTopic 是設定為發佈兩個已訂閱的端點，其為兩個 Amazon SQS 佇列 (MyQueue1 和 MyQueue2)。MyPublishTopicGroup 是 IAM 群組，其成員具有使用 [Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html) (發佈) API 動作或 [sns-publish](https://docs.aws.amazon.com/cli/latest/reference/sns/publish.html) 命令發佈至 MySNSTopic 的許可。範本建立 IAM 使用者 MyPublishUser 和 MyQueueUser，並提供他們登入設定檔和存取金鑰。使用此範本建立堆疊的使用者，指定登入設定檔的密碼做為輸入參數。範本建立兩個 IAM 使用者的存取金鑰，分別為 MyPublishUserKey 和 MyQueueUserKey。AddUserToMyPublishTopicGroup 將 MyPublishUser 新增至 MyPublishTopicGroup，以便使用者將擁有指派至群組的許可。

MyRDMessageQueueGroup 是 IAM 群組，其成員具有使用 [ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QueryReceiveMessage.html) 和 [DeleteMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QueryDeleteMessage.html) API 動作讀取和刪除來自兩個 Amazon SQS 佇列之訊息的許可。AddUserToMyQueueGroup 將 MyQueueUser 新增至 MyRDMessageQueueGroup，以便使用者將擁有指派至群組的許可。MyQueuePolicy 指派 MySNSTopic 的許可，以發佈其通知至兩個佇列。

下列清單顯示 CloudFormation 範本內容。

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  
  "Description" : "AWS CloudFormation Sample Template SNSToSQS: This Template creates an SNS topic that can send messages to 
  two SQS queues with appropriate permissions for one IAM user to publish to the topic and another to read messages from the queues. 
  MySNSTopic is set up to publish to two subscribed endpoints, which are two SQS queues (MyQueue1 and MyQueue2). MyPublishUser is an IAM user 
  that can publish to MySNSTopic using the Publish API. MyTopicPolicy assigns that permission to MyPublishUser. MyQueueUser is an IAM user 
  that can read messages from the two SQS queues. MyQueuePolicy assigns those permissions to MyQueueUser. It also assigns permission for 
  MySNSTopic to publish its notifications to the two queues. The template creates access keys for the two IAM users with MyPublishUserKey 
  and MyQueueUserKey. ***Warning*** you will be billed for the AWS resources used if you create a stack from this template.",

  "Parameters": {
    "MyPublishUserPassword": {
      "NoEcho": "true",
      "Type": "String",
      "Description": "Password for the IAM user MyPublishUser",
      "MinLength": "1",
      "MaxLength": "41",
      "AllowedPattern": "[a-zA-Z0-9]*",
      "ConstraintDescription": "must contain only alphanumeric characters."
    },
    "MyQueueUserPassword": {
      "NoEcho": "true",
      "Type": "String",
      "Description": "Password for the IAM user MyQueueUser",
      "MinLength": "1",
      "MaxLength": "41",
      "AllowedPattern": "[a-zA-Z0-9]*",
      "ConstraintDescription": "must contain only alphanumeric characters."
    }
  },


  "Resources": {
    "MySNSTopic": {
      "Type": "AWS::SNS::Topic",
      "Properties": {
        "Subscription": [{
            "Endpoint": {
              "Fn::GetAtt": ["MyQueue1", "Arn"]
            },
            "Protocol": "sqs"
          },
          {
            "Endpoint": {
              "Fn::GetAtt": ["MyQueue2", "Arn"]
            },
            "Protocol": "sqs"
          }
        ]
      }
    },
    "MyQueue1": {
      "Type": "AWS::SQS::Queue"
    },
    "MyQueue2": {
      "Type": "AWS::SQS::Queue"
    },
    "MyPublishUser": {
      "Type": "AWS::IAM::User",
      "Properties": {
        "LoginProfile": {
          "Password": {
            "Ref": "MyPublishUserPassword"
          }
        }
      }
    },
    "MyPublishUserKey": {
      "Type": "AWS::IAM::AccessKey",
      "Properties": {
        "UserName": {
          "Ref": "MyPublishUser"
        }
      }
    },
    "MyPublishTopicGroup": {
      "Type": "AWS::IAM::Group",
      "Properties": {
        "Policies": [{
          "PolicyName": "MyTopicGroupPolicy",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": [
                "sns:Publish"
              ],
              "Resource": {
                "Ref": "MySNSTopic"
              }
            }]
          }
        }]
      }
    },
    "AddUserToMyPublishTopicGroup": {
      "Type": "AWS::IAM::UserToGroupAddition",
      "Properties": {
        "GroupName": {
          "Ref": "MyPublishTopicGroup"
        },
        "Users": [{
          "Ref": "MyPublishUser"
        }]
      }
    },
    "MyQueueUser": {
      "Type": "AWS::IAM::User",
      "Properties": {
        "LoginProfile": {
          "Password": {
            "Ref": "MyQueueUserPassword"
          }
        }
      }
    },
    "MyQueueUserKey": {
      "Type": "AWS::IAM::AccessKey",
      "Properties": {
        "UserName": {
          "Ref": "MyQueueUser"
        }
      }
    },
    "MyRDMessageQueueGroup": {
      "Type": "AWS::IAM::Group",
      "Properties": {
        "Policies": [{
          "PolicyName": "MyQueueGroupPolicy",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": [
                "sqs:DeleteMessage",
                "sqs:ReceiveMessage"
              ],
              "Resource": [{
                  "Fn::GetAtt": ["MyQueue1", "Arn"]
                },
                {
                  "Fn::GetAtt": ["MyQueue2", "Arn"]
                }
              ]
            }]
          }
        }]
      }
    },
    "AddUserToMyQueueGroup": {
      "Type": "AWS::IAM::UserToGroupAddition",
      "Properties": {
        "GroupName": {
          "Ref": "MyRDMessageQueueGroup"
        },
        "Users": [{
          "Ref": "MyQueueUser"
        }]
      }
    },
    "MyQueuePolicy": {
      "Type": "AWS::SQS::QueuePolicy",
      "Properties": {
        "PolicyDocument": {
          "Statement": [{
            "Effect": "Allow",
            "Principal": {
              "Service": "sns.amazonaws.com"
            },
            "Action": ["sqs:SendMessage"],
            "Resource": "*",
            "Condition": {
              "ArnEquals": {
                "aws:SourceArn": {
                  "Ref": "MySNSTopic"
                }
              }
            }
          }]
        },
        "Queues": [{
          "Ref": "MyQueue1"
        }, {
          "Ref": "MyQueue2"
        }]
      }
    }
  },
  "Outputs": {
    "MySNSTopicTopicARN": {
      "Value": {
        "Ref": "MySNSTopic"
      }
    },
    "MyQueue1Info": {
      "Value": {
        "Fn::Join": [
          " ",
          [
            "ARN:",
            {
              "Fn::GetAtt": ["MyQueue1", "Arn"]
            },
            "URL:",
            {
              "Ref": "MyQueue1"
            }
          ]
        ]
      }
    },
    "MyQueue2Info": {
      "Value": {
        "Fn::Join": [
          " ",
          [
            "ARN:",
            {
              "Fn::GetAtt": ["MyQueue2", "Arn"]
            },
            "URL:",
            {
              "Ref": "MyQueue2"
            }
          ]
        ]
      }
    },
    "MyPublishUserInfo": {
      "Value": {
        "Fn::Join": [
          " ",
          [
            "ARN:",
            {
              "Fn::GetAtt": ["MyPublishUser", "Arn"]
            },
            "Access Key:",
            {
              "Ref": "MyPublishUserKey"
            },
            "Secret Key:",
            {
              "Fn::GetAtt": ["MyPublishUserKey", "SecretAccessKey"]
            }
          ]
        ]
      }
    },
    "MyQueueUserInfo": {
      "Value": {
        "Fn::Join": [
          " ",
          [
            "ARN:",
            {
              "Fn::GetAtt": ["MyQueueUser", "Arn"]
            },
            "Access Key:",
            {
              "Ref": "MyQueueUserKey"
            },
            "Secret Key:",
            {
              "Fn::GetAtt": ["MyQueueUserKey", "SecretAccessKey"]
            }
          ]
        ]
      }
    }
  }
}
```

# 向 HTTPS 端點散發 Amazon SNS 通知
<a name="sns-http-https-endpoint-as-subscriber"></a>

您可使用 Amazon SNS 將通知訊息傳送至一個或多個 HTTP 或 HTTPS 端點。當您訂閱端點到主題時，您可以發佈通知到主題，而 Amazon SNS 會傳送 HTTP POST 請求以傳遞通知內容到訂閱的端點。當您訂閱端點時，您選擇 Amazon SNS 是否使用 HTTP 或 HTTPS 傳送 POST 請求到端點。如果您使用 HTTPS，則您可以善用下列項目在 Amazon SNS 中的支援：
+ **伺服器名稱指示 (SNI)** - 這可讓 Amazon SNS 支援需要 SNI 的 HTTPS 端點，例如需要多個憑證以代管多個網域的伺服器。如需 SNI 的詳細資訊，請參閱[伺服器名稱指示](http://en.wikipedia.org/wiki/Server_Name_Indication)。
+ **基本和摘要存取身分驗證** - 這可讓您在 HTTP POST 請求的 HTTPS URL 中指定使用者名稱和密碼，例如 `https://user:password@domain.com` 或 `https://user@domain.com`。系統會透過使用 HTTPS 時建立的 SSL 連線對使用者名稱和密碼進行加密。只有網域名稱是以純文字傳送。如需有關基本和摘要存取身分驗證的詳細資訊，請參閱 [RFC-2617](http://www.rfc-editor.org/info/rfc2617)。
**重要**  
Amazon SNS 目前不支援私有 HTTP (S) 端點。  
HTTPS URL 只能從 Amazon SNS `GetSubscriptionAttributes` API 動作中檢索，適用於您已授予 API 存取權的委託人。
**注意**  
 用戶端服務必須能夠支援 `HTTP/1.1 401 Unauthorized` 標頭回應

請求包含已發佈至主題的主旨和訊息，同時包含有關 JSON 文件中通知的中繼資料。請求將看起來類似以下 HTTP POST 請求。如需 HTTP 標頭和 JSON 格式的請求內文的詳細資訊，請參閱 [HTTP/HTTPS 標頭](http-header.md) 和 [HTTP/HTTPS 通知 JSON 格式](http-notification-json.md)。

**注意**  
Amazon SNS 會將所有 5XX 錯誤和 429 （傳送的請求太多） 錯誤視為可重試。這些錯誤受交付政策約束。所有其他錯誤都視為永久失敗，不會嘗試重試。

```
POST / HTTP/1.1
    x-amz-sns-message-type: Notification
    x-amz-sns-message-id: da41e39f-ea4d-435a-b922-c6aae3915ebe
    x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
    x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55
    Content-Length: 761
    Content-Type: text/plain; charset=UTF-8
    Host: ec2-50-17-44-49.compute-1.amazonaws.com
    Connection: Keep-Alive
    User-Agent: Amazon Simple Notification Service Agent
    
{
  "Type" : "Notification",
  "MessageId" : "da41e39f-ea4d-435a-b922-c6aae3915ebe",
  "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
  "Subject" : "test",
  "Message" : "test message",
  "Timestamp" : "2012-04-25T21:49:25.719Z",
  "SignatureVersion" : "1",
  "Signature" : "EXAMPLElDMXvB8r9R83tGoNn0ecwd5UjllzsvSvbItzfaMpN2nk5HVSw7XnOn/49IkxDKz8YrlH2qJXj2iZB0Zo2O71c4qQk1fMUDi3LGpij7RCW7AW9vYYsSqIKRnFS94ilu7NFhUzLiieYr4BKHpdTmdD6c0esKEYBpabxDSc=",
  "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:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55"
}
```

# 訂閱 HTTPS 端點至 Amazon SNS 主題
<a name="sns-subscribe-https-s-endpoints-to-topic"></a>

本主題說明如何將 HTTP/S 端點訂閱至 Amazon SNS 主題。

**Topics**
+ [步驟 1：確保您的端點已就緒可處理 Amazon SNS 訊息](SendMessageToHttp.prepare.md)
+ [步驟 2：訂閱 HTTP/HTTPS 端點至 Amazon SNS 主題](SendMessageToHttp.subscribe.md)
+ [步驟 3：確認您的 Amazon SNS 訂閱](SendMessageToHttp.confirm.md)
+ [步驟 4：選用 - 設定 Amazon SNS 訂閱的交付政策](SendMessageToHttp.retry.md)
+ [步驟 5：選用 - 授予使用者發佈至 Amazon SNS 主題的許可](SendMessageToHttp.iam.permissions.md)
+ [步驟 6：將 Amazon SNS 訊息傳送至 HTTP/HTTPS 端點](SendMessageToHttp.publish.md)

# 步驟 1：確保您的端點已就緒可處理 Amazon SNS 訊息
<a name="SendMessageToHttp.prepare"></a>

在您訂閱您的 HTTP 或 HTTPS 端點到主題之前，您必須確保 HTTP 或 HTTPS 端點擁有處理 HTTP POST 請求 (Amazon SNS 用來傳送訂閱確認和通知訊息) 的能力。通常，這表示建立和部署處理來自 Amazon SNS 之 HTTP 請求的 Web 應用程式 (例如，如果您的端點主機執行 Linux 搭配 Apache 和 Tomcat)，則為 Java servlet。在您訂閱 HTTP 端點時，Amazon SNS 會傳送確認請求至該端點。您的端點必須在您建立訂閱時準備好接收和處理此請求，因為 Amazon SNS 會在那時候傳送此請求。Amazon SNS 不會傳送通知至端點，除非您已確認訂閱。一旦您確認訂閱，Amazon SNS 將在訂閱的主題上執行發佈動作時，傳送通知到端點。

**設定您的端點以處理訂閱確認和通知訊息**

1. 您的程式碼應會讀取 Amazon SNS 傳送至您端點的 HTTP POST 請求的 HTTP 標頭。您的程式碼應會尋找標頭欄位 `x-amz-sns-message-type`，此欄位告訴您 Amazon SNS 所傳送給您的訊息類型。透過查看標頭，您可以判定訊息類型，而無須剖析 HTTP 訊息內文。有兩種類型您需要處理：`SubscriptionConfirmation` 和 `Notification`。`UnsubscribeConfirmation` 訊息唯有從主題刪除訂閱時才使用。

   如需有關 HTTP 標頭的詳細資訊，請參閱 [HTTP/HTTPS 標頭](http-header.md)。以下 HTTP POST 請求是訂閱確認訊息的範例。

   ```
   POST / HTTP/1.1
       x-amz-sns-message-type: SubscriptionConfirmation
       x-amz-sns-message-id: 165545c9-2a5c-472c-8df2-7ff2be2b3b1b
       x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
       Content-Length: 1336
       Content-Type: text/plain; charset=UTF-8
       Host: example.com
       Connection: Keep-Alive
       User-Agent: Amazon Simple Notification Service Agent
       
   {
     "Type" : "SubscriptionConfirmation",
     "MessageId" : "165545c9-2a5c-472c-8df2-7ff2be2b3b1b",
     "Token" : "2336412f37f...",
     "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
     "Message" : "You have chosen to subscribe to the topic arn:aws:sns:us-west-2:123456789012:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.",
     "SubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:MyTopic&Token=2336412f37...",
     "Timestamp" : "2012-04-26T20:45:04.751Z",
     "SignatureVersion" : "1",
     "Signature" : "EXAMPLEpH+...",
     "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
   }
   ```

1. 您的程式碼應該剖析 HTTP POST 請求和內文類型文字/純文字，和內文中的 JSON 文件，以讀取組成 Amazon SNS 訊息的名稱值組。使用 JSON 剖析器，處理將逸出表示法的控制字元轉換回其 ASCII 字元值 (例如，將 \$1n 轉換為新行字元)。您可以使用現有的 JSON 剖析器，例如 [Jackson JSON Processor](https://github.com/FasterXML/jackson) 或者您自己撰寫。為傳送主旨和訊息欄位中的文字做為有效的 JSON，Amazon SNS 必須轉換一些控制字元為可包含在 JSON 文件中的逸出表示法。當您接收傳送至您端點的 POST 請求內文中的 JSON 文件時，如果您想要確切呈現發佈至主題的原始主旨和訊息，您必須將逸出的字元轉換回其原始字元值。如果您想要驗證通知的簽章，這很重要，因為簽章使用其原始形式的訊息和主旨做為要簽署之字串的一部分。

1. 您的程式碼應該驗證 Amazon SNS 所傳送之通知、訂閱確認或取消訂閱確認訊息的真偽。使用包含在 Amazon SNS 訊息中的資訊，您的端點可以重新建立簽章，以便您能夠透過比對簽章與 Amazon SNS 隨訊息傳送的簽章，來驗證訊息的內容。如需有關驗證訊息之簽章的詳細資訊，請參閱 [驗證 Amazon SNS 訊息的簽章](sns-verify-signature-of-message.md)。

1. 根據標頭欄位 `x-amz-sns-message-type` 所指定的類型，您的程式碼應該讀取 HTTP 請求內文中所包含的 JSON 文件並處理訊息。以下是處理兩個主要類型的訊息的準則：  
**SubscriptionConfirmation**  
讀取 `SubscribeURL` 的值並造訪該 URL。若要確認訂閱並開始在端點接收通知，您必須造訪 `SubscribeURL`URL (例如，透過傳送 HTTP GET 請求至 URL)。請查看上一個步驟中的範例 HTTP 請求，以得知 `SubscribeURL` 看起來像什麼。如需有關 `SubscriptionConfirmation` 訊息之格式的詳細資訊，請參閱 [HTTP/HTTPS 訂閱確認 JSON 格式](http-subscription-confirmation-json.md)。當您造訪 URL，您將得到類似下列 XML 文件的回應。文件會傳回 `ConfirmSubscriptionResult` 元素內端點的訂閱 ARN。  

   ```
   <ConfirmSubscriptionResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
      <ConfirmSubscriptionResult>
         <SubscriptionArn>arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55</SubscriptionArn>
      </ConfirmSubscriptionResult>
      <ResponseMetadata>
         <RequestId>075ecce8-8dac-11e1-bf80-f781d96e9307</RequestId>
      </ResponseMetadata>
   </ConfirmSubscriptionResponse>
   ```
做為造訪 `SubscribeURL` 的替代方案，您可以使用 [ConfirmSubscription](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 動作且 `Token` 設定為其 `SubscriptionConfirmation` 訊息中的對應值，來確認訂閱。如果您想要僅允許主題擁有者和訂閱擁有者可以取消訂閱端點，您使用 AWS 簽章呼叫 `ConfirmSubscription` 動作。  
**Notification**  
讀取 `Subject` 和 `Message` 的值來取得已發佈至主題的通知資訊。  
如需有關 `Notification` 訊息之格式的詳細資訊，請參閱 [HTTP/HTTPS 標頭](http-header.md)。以下 HTTP POST 請求是傳送至端點 example.com 之通知訊息的範例。  

   ```
   POST / HTTP/1.1
       x-amz-sns-message-type: Notification
       x-amz-sns-message-id: 22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324
       x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
       x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:c9135db0-26c4-47ec-8998-413945fb5a96
       Content-Length: 773
       Content-Type: text/plain; charset=UTF-8
       Host: example.com
       Connection: Keep-Alive
       User-Agent: Amazon Simple Notification Service Agent
       
   {
     "Type" : "Notification",
     "MessageId" : "22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324",
     "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
     "Subject" : "My First Message",
     "Message" : "Hello world!",
     "Timestamp" : "2012-05-02T00:54:06.655Z",
     "SignatureVersion" : "1",
     "Signature" : "EXAMPLEw6JRN...",
     "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:c9135db0-26c4-47ec-8998-413945fb5a96"
   }
   ```

1. 確保您的端點從具適當狀態碼的 Amazon SNS 對應至 HTTP POST 訊息。連線會在大約 15 秒內逾時。如果您的端點未在連線逾時之前回應，或您的端點傳回 200–4*xx* 範圍以外的狀態碼，Amazon SNS 會將訊息交付視為失敗嘗試。

1. 確保您的程式碼可以處理來自 Amazon SNS 的訊息傳遞重試。如果 Amazon SNS 未從您的端點收到成功回應，它會再次嘗試傳遞訊息。這會套用到所有訊息，包括訂閱確認訊息。根據預設，如果初始的訊息傳遞失敗，Amazon SNS 最多嘗試重試三次，各次失敗的重試之間的延遲設定在 20 秒。
**注意**  
訊息請求會在大約 15 秒後逾時。這表示如果訊息傳遞失敗是因為逾時所導致，Amazon SNS 會在之前的傳遞重試後大約 35 秒進行重試。您可以為端點設定不同的傳遞政策。

   Amazon SNS 使用 `x-amz-sns-message-id` 標頭欄位對發布到 Amazon SNS 主題的每則訊息進行唯一識別。透過比較您已處理傳入之訊息的 ID，您可以判斷訊息是否為重試的嘗試。

1. 如果您將訂閱 HTTPS 端點，請確保您的端點具有來自信任的憑證授權機構 (CA) 的伺服器憑證。Amazon SNS 將僅傳送訊息至具有 Amazon SNS 所信任之 CA 簽署的伺服器憑證的 HTTPS 端點。

1. 部署您所建立以接收 Amazon SNS 訊息的程式碼。當您訂閱端點時，端點必須就緒以至少接收訂閱確認訊息。

# 步驟 2：訂閱 HTTP/HTTPS 端點至 Amazon SNS 主題
<a name="SendMessageToHttp.subscribe"></a>

若要透過主題傳送訊息至 HTTP 或 HTTPS 端點，您必須訂閱端點至 Amazon SNS 主題。您使用其 URL 來指定端點。若要訂閱主題，您可以使用 Amazon SNS 主控台、[sns-subscribe](https://docs.aws.amazon.com/cli/latest/reference/sns/subscribe.html) 命令，或 [Subscribe](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html) (訂閱) API 動作。在您開始前，請確保您擁有像要訂閱之端點的 URL，並且您的端點已如步驟 1 所述準備好接收確認和通知訊息。

**使用 Amazon SNS 主控台訂閱 HTTP 或 HTTPS 端點至主題**

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

1. 在導覽面板上，選擇 **Subscriptions (訂閱)**。

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

1. 在 **Protocol** (協定) 下拉式清單中，選擇 **HTTP** 或 **HTTPS**。

1. 在 **Endpoint** (端點) 方塊中，貼上您想要主題傳送訊息之目的地端點的 URL，然後選擇 **Create subscription** (建立訂閱)。

1. 會顯示確認訊息。選擇**關閉**。

   您的新訂閱的 **Subscription ID** (訂閱 ID) 就會顯示 PendingConfirmation。在您確認訂閱時，**Subscription ID** (訂閱 ID) 將會顯示訂閱 ID。

# 步驟 3：確認您的 Amazon SNS 訂閱
<a name="SendMessageToHttp.confirm"></a>

若要確認您的 Amazon SNS 訂閱，請依照下列步驟確保您的端點可以成功接收訊息。此程序涉及設定您的端點來處理傳入的確認訊息、擷取確認 URL，以及確認訂閱。您可以自動或手動確認訂閱，視您的設定而定。

1. 訂閱 Amazon SNS 主題後，Amazon SNS 會傳送確認訊息到您的端點。此訊息包含`SubscribeURL`您必須用來確認訂閱的 。

1. 必須設定您的端點，以接聽來自 Amazon SNS 的傳入訊息。當確認訊息送達時，**`SubscribeURL`**請從訊息中擷取 。

1. 擁有 後`SubscribeURL`，您可以透過下列兩種方式之一確認訂閱：
   + **自動確認** – 您的端點可以透過傳送 **HTTP GET 請求**到 來自動確認訂閱`SubscribeURL`。

     此方法不需要手動介入。
   + **手動確認** – 如果未設定自動確認，**`SubscribeURL`**請從確認訊息**複製** ，並將其**貼**到瀏覽器的地址列。

     這將手動確認訂閱。

1. 您也可以使用 Amazon SNS 主控台驗證**訂閱狀態**：

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

   1. 在導覽窗格中，選擇**訂閱**。

   1. 在清單中尋找您的**訂閱**。
      + 如果確認，`SubscriptionArn`則會顯示 。
      + 如果仍然未確認，則會顯示為 `PendingConfirmation`。

# 步驟 4：選用 - 設定 Amazon SNS 訂閱的交付政策
<a name="SendMessageToHttp.retry"></a>

根據預設，如果初始的訊息傳遞失敗，Amazon SNS 最多嘗試重試三次，各次失敗的重試之間的延遲設定在 20 秒。如[步驟 1](SendMessageToHttp.prepare.md) 中所討論，您的端點應具有可處理重試訊息的程式碼。透過設定主題或訂閱的傳遞政策，您可以控制 Amazon SNS 將重試失敗的訊息的頻率和間隔。您也可以在 `DeliveryPolicy` 中指定 HTTP/S 通知的內容類型。如需詳細資訊，請參閱[建立 HTTP/S 傳遞政策](sns-message-delivery-retries.md#creating-delivery-policy)。

# 步驟 5：選用 - 授予使用者發佈至 Amazon SNS 主題的許可
<a name="SendMessageToHttp.iam.permissions"></a>

根據預設，主題擁有者擁有發佈至主題的許可。若要讓其他使用者或應用程式發佈至主題，您應該使用 AWS Identity and Access Management (IAM) 授予主題的發佈許可。如需將 Amazon SNS 動作的許可授予 IAM 使用者的詳細資訊，請參閱 [使用以身分為基礎的政策搭配 Amazon SNS](sns-using-identity-based-policies.md)。

控制對主題的存取有兩種方式：
+ 新增政策到 IAM 使用者或群組。提供使用者主題的許可的最簡單方式，是建立群組和新增適當的政策到群組，然後新增使用者到該群組。從群組新增和移除使用者比起追蹤對個別使用者設定了哪些政策要來得簡單多。
+ 新增政策到主題。如果您想要提供主題的許可給其他 AWS 帳戶，您可以做的唯一方式是透過加入已經有的政策，做為您想要提供許可的 AWS 帳戶 帳戶的委託人。

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

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

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

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

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

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

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

# 步驟 6：將 Amazon SNS 訊息傳送至 HTTP/HTTPS 端點
<a name="SendMessageToHttp.publish"></a>

您可以透過發佈至主題，來傳送訊息到主題的訂閱。若要發佈主題，您可以使用 Amazon SNS 主控台、`[sns-publish](https://docs.aws.amazon.com/cli/latest/reference/sns/publish.html)` CLI 命令或 `[Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)` API。

如果您已遵照[步驟 1](SendMessageToHttp.prepare.md)，您在端點已部署的程式碼應處理通知。

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

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

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

1. 選擇 **Publish message** (發佈訊息) 按鈕。

1. 在 **Subject** (主題) 方塊中，輸入主題 (例如，**Testing publish to my endpoint**)。

1. 在 **Message** (訊息) 方塊中，輸入一些文字 (例如，**Hello world\$1**)，並選擇 **Publish message** (發佈訊息)。

    下列訊息顯示：您的訊息已成功發佈。

# 驗證 Amazon SNS 訊息的簽章
<a name="sns-verify-signature-of-message"></a>

Amazon SNS 使用訊息簽章來確認傳送至 HTTP 端點的訊息真實性。為了確保訊息完整性並防止詐騙，**您必須在**處理任何 Amazon SNS 訊息之前驗證簽章。

**何時應驗證 Amazon SNS 簽章？**

在下列案例中，您應該驗證 Amazon SNS 訊息簽章：
+ 當 Amazon SNS 傳送通知訊息到您的 HTTP(S) 端點時。
+ 當 Amazon SNS 在 [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_Unsubscribe.html](https://docs.aws.amazon.com/sns/latest/api/API_Unsubscribe.html) API 呼叫後傳送確認訊息到您的端點時。

**Amazon SNS 支援兩個簽章版本：**
+ SignatureVersion1 – 使用訊息的SHA1雜湊。
+ SignatureVersion2 – 使用訊息的SHA256雜湊。這可提供更強大的安全性，並且是建議的選項。

**若要正確驗證 SNS 訊息簽章，請遵循下列最佳實務：**
+ 一律使用 HTTPS 擷取簽署憑證，以防止未經授權的攔截攻擊。
+ 檢查憑證是否由 Amazon SNS 發行。
+ 確認憑證的信任鏈有效。
+ 憑證應該來自 SNS 簽署的 URL。
+ 未經驗證，請勿信任訊息中提供的任何憑證。
+ 拒絕任何具有非預期的訊息`TopicArn`，以防止詐騙。
+ Amazon SNS AWS SDKs 提供內建驗證邏輯，可降低實作錯誤的風險。

# 在 Amazon SNS 主題上設定訊息簽章版本
<a name="sns-verify-signature-of-message-configure-message-signature"></a>

在 Amazon SNS 主題上設定訊息簽章版本，可讓您增強訊息驗證程序的安全性和相容性。

在 `SignatureVersion`**1** (SHA1) 和 `SignatureVersion`**2** (SHA256) 之間選取，以控制用於簽署訊息的雜湊演算法。Amazon SNS 主題預設為 `SignatureVersion`**1**。您可以使用 [https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html) API 動作來設定此設定。

使用以下範例，`SignatureVersion`使用 設定主題屬性 AWS CLI：

```
aws sns set-topic-attributes \
    --topic-arn arn:aws:sns:us-east-2:123456789012:MyTopic \
    --attribute-name SignatureVersion \
    --attribute-value 2
```

# 在使用 HTTP 查詢型請求時，驗證 Amazon SNS 訊息的簽章
<a name="sns-verify-signature-of-message-verify-message-signature"></a>

在使用 HTTP 查詢型請求時，驗證 Amazon SNS 訊息的簽章可確保訊息的真實性和完整性。此程序會確認訊息來自 Amazon SNS，且未在傳輸期間遭到竄改。透過剖析訊息、建構正確的簽署字串，以及針對信任的公有金鑰驗證簽章，您可以保護您的系統免於詐騙和未經授權的訊息變更。

1. 從 Amazon SNS 傳送的 HTTP POST 請求內文中的 JSON 文件擷取**金鑰/值對**。這些欄位是建構**要簽署的字串**的必要欄位。
   + `Message`
   + `Subject` （如果有）
   + `MessageId`
   + `Timestamp`
   + `TopicArn`
   + `Type`

   例如：

   ```
   MESSAGE_FILE="message.json"
   FIELDS=("Message" "MessageId" "Subject" "Timestamp" "TopicArn" "Type")
   ```
**注意**  
如果任何欄位包含逸出字元 （例如 `\n`)，請將它們轉換為**原始格式**，以確保完全相符。

1. 在 Amazon SNS 訊息中尋找 `SigningCertURL` 欄位。此憑證包含驗證訊息簽章所需的公有金鑰。例如：

   ```
   SIGNING_CERT_URL=$(jq -r '.SigningCertURL' "$MESSAGE_FILE")
   ```

1. 確定 `SigningCertURL` 來自信任的 AWS 網域 （例如 https://sns.us-east-1.amazonaws.com)。基於安全考量，拒絕** AWS 網域外**的任何 URLs。

1. 從提供的 URL 下載 **X.509 憑證**。例如：

   ```
   curl -s "$SIGNING_CERT_URL" -o signing_cert.pem
   ```

1. 從下載的 X.509 憑證中擷取**公有金鑰**。公有金鑰可讓您解密訊息的簽章並驗證其完整性。例如：

   ```
   openssl x509 -pubkey -noout -in signing_cert.pem > public_key.pem
   ```

1. 不同的訊息類型需要字串中不同的鍵值對才能簽署。識別**訊息類型** (`Type`Amazon SNS 訊息中的 欄位），以決定要包含哪些**鍵值對**：
   + **通知訊息** – 包括 `Message`、`MessageId`、 `Subject`（如果有）`TopicArn`、、 `Timestamp`和 `Type`。
   + **SubscriptionConfirmation** 或 **UnsubscribeConfirmation 訊息** – 包括 `Message`、`MessageId`、`SubscribeURL`、`Token`、`Timestamp`、 `TopicArn`和 `Type`。

1. Amazon SNS 需要字串簽署，以遵循嚴格的固定欄位順序進行驗證。**僅必須包含明確的必要欄位**，無法新增任何額外的欄位。只有在訊息中存在時`Subject`，才會包含選用欄位，例如 ，且必須出現在必要欄位順序所定義的確切位置。例如：

   ```
   KeyNameOne\nValueOne\nKeyNameTwo\nValueTwo
   ```
**重要**  
請勿在字串結尾新增換行字元。

1. 依位元組排序順序排列**索引鍵/值對** （按索引鍵名稱的字母）。

1. 使用下列格式範例建構**字串以簽署**：

   ```
   STRING_TO_SIGN=""
   for FIELD in "${FIELDS[@]}"; do
       VALUE=$(jq -r --arg field "$FIELD" '.[$field]' "$MESSAGE_FILE")
       STRING_TO_SIGN+="$FIELD\n$VALUE"
       # Append a newline after each field except the last one
       if [[ "$FIELD" != "Type" ]]; then
           STRING_TO_SIGN+="\n"
       fi
   done
   ```

   **通知訊息範例：**

   ```
   Message
   My Test Message
   MessageId
   4d4dc071-ddbf-465d-bba8-08f81c89da64
   Subject
   My subject
   Timestamp
   2019-01-31T04:37:04.321Z
   TopicArn
   arn:aws:sns:us-east-2:123456789012:s4-MySNSTopic-1G1WEFCOXTC0P
   Type
   Notification
   ```

   **SubscriptionConfirmation 範例：**

   ```
   Message
   Please confirm your subscription
   MessageId
   3d891288-136d-417f-bc05-901c108273ee
   SubscribeURL
   https://sns.us-east-2.amazonaws.com/...
   Timestamp
   2024-01-01T00:00:00.000Z
   Token
   abc123...
   TopicArn
   arn:aws:sns:us-east-2:123456789012:MyTopic
   Type
   SubscriptionConfirmation
   ```

1. 訊息中的 `Signature` 欄位以 Base64-encoded。您需要**解碼**它，將其**原始二進位格式**與**衍生的雜湊**進行比較。例如：

   ```
   SIGNATURE=$(jq -r '.Signature' "$MESSAGE_FILE")
   echo "$SIGNATURE" | base64 -d > signature.bin
   ```

1. 使用 `SignatureVersion` 欄位來選取雜湊演算法：
   + 對於 `SignatureVersion`**1**，請使用 **SHA1** （例如，`-sha1`)。
   + 對於 `SignatureVersion`**2**，請使用 **SHA256** （例如 `-sha256`)。

1. 若要確認 Amazon SNS 訊息的真實性，請產生建構字串的**雜湊**，並使用**公有金鑰**驗證簽章。

   ```
   openssl dgst -sha256 -verify public_key.pem -signature signature.bin <<< "$STRING_TO_SIGN"
   ```

   如果簽章有效，則輸出為 `Verified OK`。否則，輸出為 `Verification Failure`。

## 具有錯誤處理的範例指令碼
<a name="sns-verify-signature-of-message-example"></a>

下列範例指令碼會自動執行驗證程序：

```
#!/bin/bash

# Path to the local message file
MESSAGE_FILE="message.json"

# Extract the SigningCertURL and Signature from the message
SIGNING_CERT_URL=$(jq -r '.SigningCertURL' "$MESSAGE_FILE")
SIGNATURE=$(jq -r '.Signature' "$MESSAGE_FILE")

# Fetch the X.509 certificate
curl -s "$SIGNING_CERT_URL" -o signing_cert.pem

# Extract the public key from the certificate
openssl x509 -pubkey -noout -in signing_cert.pem > public_key.pem

# Define the fields to include in the string to sign
FIELDS=("Message" "MessageId" "Subject" "Timestamp" "TopicArn" "Type")

# Initialize the string to sign
STRING_TO_SIGN=""

# Iterate over the fields to construct the string to sign
for FIELD in "${FIELDS[@]}"; do
    VALUE=$(jq -r --arg field "$FIELD" '.[$field]' "$MESSAGE_FILE")
    STRING_TO_SIGN+="$FIELD\n$VALUE"
    # Append a newline after each field except the last one
    if [[ "$FIELD" != "Type" ]]; then
        STRING_TO_SIGN+="\n"
    fi
done

# Verify the signature
echo -e "$STRING_TO_SIGN" | openssl dgst -sha256 -verify public_key.pem -signature <(echo "$SIGNATURE" | base64 -d)
```

# 剖析 Amazon SNS 訊息格式
<a name="sns-message-and-json-formats"></a>

當 Amazon SNS 傳送訊息至 HTTP/HTTPS 端點時，它們同時包含 HTTP 標頭和 JSON 訊息內文。這些訊息遵循結構化格式，其中包含中繼資料，例如訊息類型、主題 ARN、時間戳記和數位簽章。透過正確剖析 Amazon SNS 訊息，您可以判斷訊息是訂閱確認、通知還是取消訂閱確認、擷取相關資料，以及使用簽章驗證來驗證真實性。

# HTTP/HTTPS 標頭
<a name="http-header"></a>

當 Amazon SNS 傳送訂閱確認、通知或取消訂閱 HTTP/HTTPS 端點的確認訊息時，會傳送含有數個 Amazon SNS 特定標頭值的 POST 訊息。您可以將這些標頭值使用於識別訊息類型等任務，而無需剖析 JSON 訊息內文以讀取 `Type` 值。根據預設，Amazon SNS 會將所有通知傳送至 `Content-Type` 設定為 `text/plain; charset=UTF-8` 的 HTTP/S 端點。若要選擇文字/純文字 (預設值) 以外的 `Content-Type`，請參閱 [建立 HTTP/S 傳遞政策](sns-message-delivery-retries.md#creating-delivery-policy) 中的 `headerContentType`。

**`x-amz-sns-message-type`**  
訊息的類型。可能的值為 `SubscriptionConfirmation`、`Notification` 和 `UnsubscribeConfirmation`。

**`x-amz-sns-message-id`**  
全域唯一識別符 (UUID)，對於每個發布的訊息均為唯一。若是 Amazon SNS 在重試期間重送的通知，會使用原始訊息的訊息 ID。

**`x-amz-sns-topic-arn`**  
發佈此訊息之主題的 Amazon 資源名稱 (ARN)。

**`x-amz-sns-subscription-arn`**  
訂閱此端點的 ARN。

以下 HTTP POST 標頭是發至 HTTP 端點的 `Notification` 訊息的範例。

```
POST / HTTP/1.1
x-amz-sns-message-type: Notification
x-amz-sns-message-id: 165545c9-2a5c-472c-8df2-7ff2be2b3b1b
x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55
Content-Length: 1336
Content-Type: text/plain; charset=UTF-8
Host: myhost.example.com
Connection: Keep-Alive
User-Agent: Amazon Simple Notification Service Agent
```

# HTTP/HTTPS 訂閱確認 JSON 格式
<a name="http-subscription-confirmation-json"></a>

在您訂閱 HTTP/HTTPS 端點之後，Amazon SNS 會傳送訂閱確認訊息至 HTTP/HTTPS 端點。此訊息包含 `SubscribeURL` 值，您必須造訪才能確認訂閱 (或者，您可以使用具有 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 的 `Token` 值)。

**注意**  
除非已確認訂閱，否則 Amazon SNS 不會傳送通知至此端點

訂閱確認訊息是 POST 訊息，訊息內文包含 JSON 文件及以下名稱值組。

**`Type`**  
訊息的類型。若是訂閱確認，類型為 `SubscriptionConfirmation`。

**`MessageId`**  
全域唯一識別符 (UUID)，對於每個發布的訊息均為唯一。若是 Amazon SNS 在重試期間重送的訊息，會使用原始訊息的訊息 ID。

**`Token`**  
您可以與 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 動作搭配使用以確認訂閱。或者，您也可直接造訪 `SubscribeURL`。

**`TopicArn`**  
此端點訂閱之主題的 Amazon Resource Name (ARN)。

**`Message`**  
說明訊息的字串。若是訂閱確認，此字串看起來如下：  

```
You have chosen to subscribe to the topic arn:aws:sns:us-east-2:123456789012:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.
```

**`SubscribeURL`**  
為了確認訂閱您必須造訪的 URL。或者，您可以改為使用 `Token` 和 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 動作以確認訂閱。

**`Timestamp`**  
送出確認訂閱的時間 (GMT)。

**`SignatureVersion`**  
Amazon SNS 簽章所使用的版本。  
+ 如果 `SignatureVersion` 為 **1**，則 `Signature` 為 `Message`、`MessageId`、`Type`、`Timestamp` 和 `TopicArn` 值的 Base-64 編碼 `SHA1withRSA` 簽章。
+ 如果 `SignatureVersion` 為 **2**，則 `Signature` 為 `Message`、`MessageId`、`Type`、`Timestamp` 和 `TopicArn` 值的 Base-64 編碼 `SHA256withRSA` 簽章。

**`Signature`**  
以 Base64 編碼 `SHA1withRSA` 或 `Message`、`MessageId`、`Type`、`Timestamp` 和 `TopicArn` 值的 `SHA256withRSA` 簽章。

**`SigningCertURL`**  
用於簽署訊息的憑證的 URL。

以下 HTTP POST 訊息是發至 HTTP 端點的 `SubscriptionConfirmation` 訊息的範例。

```
POST / HTTP/1.1
x-amz-sns-message-type: SubscriptionConfirmation
x-amz-sns-message-id: 165545c9-2a5c-472c-8df2-7ff2be2b3b1b
x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
Content-Length: 1336
Content-Type: text/plain; charset=UTF-8
Host: myhost.example.com
Connection: Keep-Alive
User-Agent: Amazon Simple Notification Service Agent

{
  "Type" : "SubscriptionConfirmation",
  "MessageId" : "165545c9-2a5c-472c-8df2-7ff2be2b3b1b",
  "Token" : "2336412f37...",
  "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
  "Message" : "You have chosen to subscribe to the topic arn:aws:sns:us-west-2:123456789012:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.",
  "SubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:MyTopic&Token=2336412f37...",
  "Timestamp" : "2012-04-26T20:45:04.751Z",
  "SignatureVersion" : "1",
  "Signature" : "EXAMPLEpH+DcEwjAPg8O9mY8dReBSwksfg2S7WKQcikcNKWLQjwu6A4VbeS0QHVCkhRS7fUQvi2egU3N858fiTDN6bkkOxYDVrY0Ad8L10Hs3zH81mtnPk5uvvolIC1CXGu43obcgFxeL3khZl8IKvO61GWB6jI9b5+gLPoBc1Q=",
  "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
}
```

# HTTP/HTTPS 通知 JSON 格式
<a name="http-notification-json"></a>

當 Amazon SNS 傳送通知至已訂閱之 HTTP 或 HTTPS 端點時，已傳送至端點的 POST 訊息具有包含 JSON 文件及以下名稱值組的訊息內文。

**`Type`**  
訊息的類型。若是通知，類型為 `Notification`。

**`MessageId`**  
全域唯一識別符 (UUID)，對於每個發布的訊息均為唯一。若是 Amazon SNS 在重試期間重送的通知，會使用原始訊息的訊息 ID。

**`TopicArn`**  
發佈此訊息之主題的 Amazon 資源名稱 (ARN)。

**`Subject`**  
發布通知至主題時指定的 `Subject` 參數。  
這是選擇性的參數。如果未指定 `Subject`，則此名稱值組不會顯示在 JSON 文件中。

**`Message`**  
發布通知至主題時指定的 `Message` 值。

**`Timestamp`**  
發佈通知的時間 (GMT)。

**`SignatureVersion`**  
Amazon SNS 簽章所使用的版本。  
+ 如果 `SignatureVersion` 為 **1**，則 `Signature` 為 `Message`、`MessageId`、`Subject` (如果存在)、`Type`、`Timestamp` 和 `TopicArn` 值的 Base-64 編碼 `SHA1withRSA` 簽章。
+ 如果 `SignatureVersion` 為 **2**，則 `Signature` 為 `Message`、`MessageId`、`Subject` (如果存在)、`Type`、`Timestamp` 和 `TopicArn` 值的 Base-64 編碼 `SHA256withRSA` 簽章。

**`Signature`**  
以 Base64 編碼 `SHA1withRSA` 或 `Message`、`MessageId`、`Subject` (如果存在)、`Type`、`Timestamp` 和 `TopicArn` 值的 `SHA256withRSA` 簽章。

**`SigningCertURL`**  
用於簽署訊息的憑證的 URL。

**`UnsubscribeURL`**  
您可以用來從此主題取消訂閱端點的 URL。如果您造訪此 URL，Amazon SNS 會取消訂閱端點，並停止傳送通知至此端點。

以下 HTTP POST 訊息是發至 HTTP 端點的 `Notification` 訊息的範例。

```
POST / HTTP/1.1
x-amz-sns-message-type: Notification
x-amz-sns-message-id: 22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324
x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:c9135db0-26c4-47ec-8998-413945fb5a96
Content-Length: 773
Content-Type: text/plain; charset=UTF-8
Host: myhost.example.com
Connection: Keep-Alive
User-Agent: Amazon Simple Notification Service Agent

{
  "Type" : "Notification",
  "MessageId" : "22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324",
  "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
  "Subject" : "My First Message",
  "Message" : "Hello world!",
  "Timestamp" : "2012-05-02T00:54:06.655Z",
  "SignatureVersion" : "1",
  "Signature" : "EXAMPLEw6JRN...",
  "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:c9135db0-26c4-47ec-8998-413945fb5a96"
  }
```

# HTTP/HTTPS 取消訂閱確認 JSON 格式
<a name="http-unsubscribe-confirmation-json"></a>

在從主題取消訂閱 HTTP/HTTPS 端點之後，Amazon SNS 會傳送取消訂閱確認訊息至端點。

取消訂閱確認訊息是 POST 訊息，訊息內文包含 JSON 文件及以下名稱值組。

**`Type`**  
訊息的類型。若是取消訂閱確認，類型為 `UnsubscribeConfirmation`。

**`MessageId`**  
全域唯一識別符 (UUID)，對於每個發布的訊息均為唯一。若是 Amazon SNS 在重試期間重送的訊息，會使用原始訊息的訊息 ID。

**`Token`**  
您可以與 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 動作搭配使用，以重新確認訂閱。或者，您也可直接造訪 `SubscribeURL`。

**`TopicArn`**  
此端點已取消訂閱之主題的 Amazon 資源名稱 (ARN)。

**`Message`**  
說明訊息的字串。若是取消訂閱確認，此字串看起來如下：  

```
You have chosen to deactivate subscription arn:aws:sns:us-east-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55.\nTo cancel this operation and restore the subscription, visit the SubscribeURL included in this message.
```

**`SubscribeURL`**  
為了重新確認訂閱您必須造訪的 URL。或者，您可以改為使用 `Token` 和 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 動作來重新確認訂閱。

**`Timestamp`**  
送出確認取消訂閱的時間 (GMT)。

**`SignatureVersion`**  
Amazon SNS 簽章所使用的版本。  
+ 如果 `SignatureVersion` 為 **1**，則 `Signature` 為 `Message`、`MessageId`、`Type`、`Timestamp` 和 `TopicArn` 值的 Base-64 編碼 `SHA1withRSA` 簽章。
+ 如果 `SignatureVersion` 為 **2**，則 `Signature` 為 `Message`、`MessageId`、`Type`、`Timestamp` 和 `TopicArn` 值的 Base-64 編碼 `SHA256withRSA` 簽章。

**`Signature`**  
以 Base64 編碼 `SHA1withRSA` 或 `Message`、`MessageId`、`Type`、`Timestamp` 和 `TopicArn` 值的 `SHA256withRSA` 簽章。

**`SigningCertURL`**  
用於簽署訊息的憑證的 URL。

以下 HTTP POST 訊息是發至 HTTP 端點的 `UnsubscribeConfirmation` 訊息的範例。

```
POST / HTTP/1.1
x-amz-sns-message-type: UnsubscribeConfirmation
x-amz-sns-message-id: 47138184-6831-46b8-8f7c-afc488602d7d
x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55
Content-Length: 1399
Content-Type: text/plain; charset=UTF-8
Host: myhost.example.com
Connection: Keep-Alive
User-Agent: Amazon Simple Notification Service Agent

{
  "Type" : "UnsubscribeConfirmation",
  "MessageId" : "47138184-6831-46b8-8f7c-afc488602d7d",
  "Token" : "2336412f37...",
  "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
  "Message" : "You have chosen to deactivate subscription arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55.\nTo cancel this operation and restore the subscription, visit the SubscribeURL included in this message.",
  "SubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:MyTopic&Token=2336412f37fb6...",
  "Timestamp" : "2012-04-26T20:06:41.581Z",
  "SignatureVersion" : "1",
  "Signature" : "EXAMPLEHXgJm...",
  "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
}
```

# SetSubscriptionAttributes 交付政策 JSON 格式
<a name="set-sub-attributes-delivery-policy-json"></a>

如果您傳送請求至 `SetSubscriptionAttributes` 動作，並將 `AttributeName` 參數設定為 `DeliveryPolicy` 的值，`AttributeValue` 參數的值必須為有效的 JSON 物件。例如，下面的範例設定交付政策為總計 5 次重試。

```
http://sns.us-east-2.amazonaws.com/
?Action=SetSubscriptionAttributes
&SubscriptionArn=arn%3Aaws%3Asns%3Aus-east-2%3A123456789012%3AMy-Topic%3A80289ba6-0fd4-4079-afb4-ce8c8260f0ca
&AttributeName=DeliveryPolicy
&AttributeValue={"healthyRetryPolicy":{"numRetries":5}}
...
```

`AttributeValue` 參數的值使用以下 JSON 格式。

```
{
    "healthyRetryPolicy" : {
        "minDelayTarget" :  int,
        "maxDelayTarget" : int,
        "numRetries" : int,
        "numMaxDelayRetries" : int,
        "backoffFunction" : "linear|arithmetic|geometric|exponential"
    },
    "throttlePolicy" : {
        "maxReceivesPerSecond" : int
    },
    "requestPolicy" : {
        "headerContentType" : "text/plain | application/json | application/xml"
    }
}
```

如需有關 `SetSubscriptionAttribute` 動作的詳細資訊，請前往 *Amazon Simple Notification Service API 參考* 中的 [SetSubscriptionAttributes](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html)。如需有關支援之 HTTP 內容類型標頭的詳細資訊，請參閱 [建立 HTTP/S 傳遞政策](sns-message-delivery-retries.md#creating-delivery-policy)。

# SetTopicAttributes 交付政策 JSON 格式
<a name="set-topic-attributes-delivery-policy-json"></a>

如果您傳送請求至 `SetTopicAttributes` 動作，並將 `AttributeName` 參數設定為 `DeliveryPolicy` 的值，`AttributeValue` 參數的值必須為有效的 JSON 物件。例如，下面的範例設定交付政策為總計 5 次重試。

```
http://sns.us-east-2.amazonaws.com/
?Action=SetTopicAttributes
&TopicArn=arn%3Aaws%3Asns%3Aus-east-2%3A123456789012%3AMy-Topic
&AttributeName=DeliveryPolicy
&AttributeValue={"http":{"defaultHealthyRetryPolicy":{"numRetries":5}}}
...
```

`AttributeValue` 參數的值使用以下 JSON 格式。

```
{
    "http" : {
        "defaultHealthyRetryPolicy" : {
            "minDelayTarget":  int,
            "maxDelayTarget": int,
            "numRetries": int,
            "numMaxDelayRetries": int,
            "backoffFunction": "linear|arithmetic|geometric|exponential"
        },
        "disableSubscriptionOverrides" : Boolean,
        "defaultThrottlePolicy" : {
            "maxReceivesPerSecond" : int
        },
        "defaultRequestPolicy" : {
            "headerContentType" : "text/plain | application/json | application/xml"
        }
    }
}
```

如需有關 `SetTopicAttribute` 動作的詳細資訊，請前往 *Amazon Simple Notification Service API 參考* 中的 [SetTopicAttributes](https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html)。如需有關支援之 HTTP 內容類型標頭的詳細資訊，請參閱 [建立 HTTP/S 傳遞政策](sns-message-delivery-retries.md#creating-delivery-policy)。

# 將 Amazon SNS 事件散發至 AWS 事件分叉管道
<a name="sns-fork-pipeline-as-subscriber"></a>


|  | 
| --- |
| 對於事件封存和分析，Amazon SNS 現在建議使用其與 Amazon Data Firehose 的原生整合。您可以訂閱 Firehose 交付串流至 SNS 主題，這可讓您將通知傳送至封存和分析端點，例如 Amazon Simple Storage Service (Amazon S3) 儲存貯體、Amazon Redshift 資料表、Amazon OpenSearch Service (OpenSearch Service) 等。搭配使用 Amazon SNS 與 Firehose 交付串流是全受管且無程式碼的解決方案，不需要您使用 AWS Lambda 函數。如需詳細資訊，請參閱[散發到 Firehose 交付串流](sns-firehose-as-subscriber.md)。 | 

您可以使用 Amazon SNS 建置事件驅動型應用程式，這些應用程式會使用訂閱者服務自動執行工作，以回應發佈者服務所觸發的事件。這個架構模式可讓服務更具重複使用性、互通性和可擴展性。不過，可能需要投入更多勞力將事件分支到管道中處理，以滿足常見的事件處理需求，例如事件儲存、備份、搜尋、分析和重播。

為了加速事件驅動型應用程式的開發，您可以向 Amazon SNS 主題訂閱 AWS 由事件分叉管道提供支援的事件處理管道。 AWS 事件分叉管道是一組開放原始碼[巢狀應用程式](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-nested-applications.html)，以[AWS 無伺服器應用程式模型](https://aws.amazon.com/serverless/sam/) (AWS SAM) 為基礎，您可以直接從[AWS 事件分叉管道套件](https://serverlessrepo.aws.amazon.com/applications?query=aws-event-fork-pipelines) （選擇**顯示建立自訂 IAM 角色或資源政策的應用程式**) 中部署 AWS 。

如需 AWS 事件分叉管道使用案例，請參閱 [部署和測試 Amazon SNS 事件分支管道範例應用程式](sns-deploy-test-fork-pipelines-sample-application.md)。

**Topics**
+ [AWS 事件分叉管道的運作方式](#how-sns-fork-works)
+ [部署 AWS 事件分叉管道](#deploying-sns-fork-pipelines)
+ [部署和測試 Amazon SNS 事件分支管道範例應用程式](sns-deploy-test-fork-pipelines-sample-application.md)
+ [訂閱 Amazon SNS 主題 AWS 的事件分叉管道](sns-subscribe-event-fork-pipelines.md)

## AWS 事件分叉管道的運作方式
<a name="how-sns-fork-works"></a>

AWS Event Fork Pipelines 是一種無伺服器設計模式。不過，它也是一組以 SAM AWS 為基礎的巢狀無伺服器應用程式 （您可以直接從 AWS Serverless Application Repository (AWS SAR) 部署到 ， AWS 帳戶 以豐富您的事件驅動平台）。因應您的架構要求，您可以單獨部署這些巢狀應用程式。

**Topics**
+ [事件儲存和備份管道](#sns-fork-event-storage-and-backup-pipeline)
+ [事件搜尋和分析管道](#sns-fork-event-search-and-analytics-pipeline)
+ [事件重播管道](#sns-fork-event-replay-pipeline)

下圖顯示由三個巢狀應用程式補充 AWS 的事件分叉管道應用程式。您可以根據您的架構需求，從 SAR 上的 AWS AWS 事件分叉管道套件獨立部署任何管道。

![\[AWS 事件分叉管道架構，顯示如何透過三個不同的管道篩選和處理 Amazon SNS 主題的事件：事件儲存和備份、事件搜尋和分析，以及事件重播。這些管道描述為垂直堆疊方塊，每個都獨立處理來自相同 Amazon SNS 主題的事件。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-fork-pipeline-as-subscriber-how-it-works.png)


每個管道都訂閱同一個 Amazon SNS 主題，讓它本身可在事件發佈到主題時平行處理這些事件。每個管道各自獨立，而且可以設定自己的[訂閱篩選政策](sns-subscription-filter-policies.md)。這可讓管道只處理它有感興趣的事件子集 (而不是發佈到該主題的所有事件)。

**注意**  
由於您將三個 AWS Event Fork Pipelines 與一般事件處理管道一起放置 （可能已訂閱 Amazon SNS 主題），因此您不需要變更目前訊息發佈者的任何部分，即可在現有工作負載中利用 AWS Event Fork Pipelines。

### 事件儲存和備份管道
<a name="sns-fork-event-storage-and-backup-pipeline"></a>

下圖顯示[事件儲存和備份管道](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:077246666028:applications~fork-event-storage-backup-pipeline)。您可以讓此管道訂閱您的 Amazon SNS 主題，以自動備份流經您系統的事件。

此管道包含緩衝 Amazon SNS 主題交付事件的 Amazon SQS 佇列、自動輪詢佇列中這些事件並將其推送至串流的 AWS Lambda 函數，以及持久備份串流載入事件的 Amazon S3 儲存貯體。 Amazon SNS 

![\[Fork-Event-Storage-Backup-Pipeline，旨在處理和備份來自 Amazon SNS 主題的事件。流程從事件發散到 Amazon SQS 佇列的 Amazon SNS 主題開始。 Amazon SQS 然後，Lambda 函數會處理這些篩選的事件，將它們轉送至 Data Firehose。Firehose 串流負責緩衝、轉換和壓縮事件，然後再將其載入 Amazon S3 備份儲存貯體。最後，Amazon Athena 可用來查詢儲存的資料。圖表使用一系列圖示和箭頭來說明從一個服務到下一個服務的流程，清楚地標記管道的每個元件。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-fork-event-storage-and-backup-pipeline.png)


若要微調 Firehose 串流的行為，您可以將它設定為將事件載入到儲存貯體之前，先緩衝、轉換和壓縮事件。隨著事件載入，您可以透過 Amazon Athena 使用標準 SQL 查詢來查詢儲存貯體。您也可以將管道設定為重複使用現有的 Amazon S3 儲存貯體，或建立新的儲存貯體。

### 事件搜尋和分析管道
<a name="sns-fork-event-search-and-analytics-pipeline"></a>

下圖顯示[事件搜尋和分析管道](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:077246666028:applications~fork-event-search-analytics-pipeline)。您可以讓此管道訂閱您的 Amazon SNS 主題，對搜尋網域中流經您系統的事件編製索引，然後對事件進行分析。

此管道包含緩衝 Amazon SNS 主題所交付事件的 Amazon SQS 佇列、輪詢佇列事件並將其推送至 串流的 AWS Lambda 函數、編製 Firehose 串流所載入事件索引的 Amazon OpenSearch Service 網域，以及存放無法在搜尋網域中編製索引之無效字母事件的 Amazon S3 儲存貯體。 Amazon SNS 

![\[AWS 架構中的事件搜尋和分析管道。從左側開始，Amazon SNS 主題會接收所有事件。然後，這些事件會透過代表「展開篩選事件」的虛線排入 Amazon SQS 佇列。從佇列中，事件由 Lambda 函數處理，然後轉送到 Data Firehose 串流。Data Firehose 會將事件導向兩個目的地：一個路由會導向 Amazon Elasticsearch Service 進行索引，另一個路由會將無法處理的或「無效字母」事件傳送至 Amazon S3 無效字母儲存貯體。在最右側，Elasticsearch Service 的輸出會饋送至 Kibana 儀表板，以進行分析和視覺化。整個流程是水平配置的，每個元件都由顯示資料流程方向的行連接。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-fork-event-search-and-analytics-pipeline.png)


若要調整 Firehose 串流的事件緩衝、轉換和壓縮，您可以設定此管道。

您也可以設定管道是否應該重複使用 中的現有 OpenSearch 網域， AWS 帳戶 或為您建立新的網域。隨著搜尋網域中編製事件的索引，您可以使用 Kibana 對您的事件進行分析，並即時更新視覺化儀表板。

### 事件重播管道
<a name="sns-fork-event-replay-pipeline"></a>

下圖顯示[事件重播管道](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:077246666028:applications~fork-event-replay-pipeline)。若要記錄您的系統在過去 14 天已處理的事件 (例如當您的平台需要從故障中復原時)，您可以讓此管道訂閱 Amazon SNS 主題，然後重新處理事件。

此管道包含緩衝 Amazon SNS 主題所交付事件的 Amazon SQS 佇列，以及從佇列輪詢事件並將其重新驅動至您一般事件處理管道的 AWS Lambda 函數，該管道也會訂閱您的主題。 Amazon SNS 

![\[流程圖格式的事件重播管道。從左到右，從 Amazon SNS 主題開始，該主題會將篩選的事件分佈到兩個平行程序。上方流程代表您的一般事件處理管道，其中包含處理事件的 Amazon SQS 佇列。標示為「fork-event-replay-pipeline」的較低流程包含 Amazon SQS 重播佇列，其中事件會在 Lambda 重播函數處理之前暫時存放。此 Lambda 函數能夠根據是否啟用或停用重播功能，將事件重新驅動到一般事件處理管道，或保留它們以進行重播。圖表也指出運算子可以控制啟用或停用事件重播功能。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-fork-event-replay-pipeline.png)


**注意**  
預設情況下，重播函數會停用，不會轉送您的事件。如果您需要重新處理事件，則必須啟用 Amazon SQS 重播佇列做為 AWS Lambda 重播函數的事件來源。

## 部署 AWS 事件分叉管道
<a name="deploying-sns-fork-pipelines"></a>

[AWS 事件分叉管道套件](https://serverlessrepo.aws.amazon.com/applications?query=aws-event-fork-pipelines) （選擇**顯示建立自訂 IAM 角色或資源政策的應用程式**) 可作為 中的一組公有應用程式 AWS Serverless Application Repository，您可以在其中使用[AWS Lambda 主控台](https://console.aws.amazon.com/lambda/)手動部署和測試這些應用程式。如需使用 AWS Lambda 主控台部署管道的資訊，請參閱 [訂閱 Amazon SNS 主題 AWS 的事件分叉管道](sns-subscribe-event-fork-pipelines.md)。

在生產案例中，我們建議在整體應用程式的 AWS SAM 範本中嵌入 AWS 事件分叉管道。巢狀應用程式功能可讓您將 資源新增至 `[AWS::Serverless::Application](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template.html#serverless-sam-template-application)` AWS SAM 範本，並參考 AWS SAR `ApplicationId`和巢狀應用程式的 `SemanticVersion` 。

例如，您可以將下列 YAML 程式碼片段新增至 AWS SAM 範本的 `Resources`區段，以使用事件儲存和備份管道做為巢狀應用程式。

```
Backup:   
    Type: AWS::Serverless::Application
  Properties:
    Location:
      ApplicationId: arn:aws:serverlessrepo:us-east-2:123456789012:applications/fork-event-storage-backup-pipeline
      SemanticVersion: 1.0.0
    Parameters: 
      #The ARN of the Amazon SNS topic whose messages should be backed up to the Amazon S3 bucket.
      TopicArn: !Ref MySNSTopic
```

當您指定參數值時，您可以使用 AWS CloudFormation 內部函數來參考範本中的其他資源。例如，在上述 YAML 程式碼片段中， `TopicArn` 參數會參考 AWS SAM 範本中其他位置`MySNSTopic`定義的`[AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html)`資源 。如需詳細資訊，請參閱*AWS CloudFormation 《 使用者指南*》中的[內部函數參考](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html)。

**注意**  
SAR AWS 應用程式的 AWS Lambda 主控台頁面包含**複製為 SAM 資源**按鈕，可將巢狀 AWS SAR 應用程式所需的 YAML 複製到剪貼簿。

# 部署和測試 Amazon SNS 事件分支管道範例應用程式
<a name="sns-deploy-test-fork-pipelines-sample-application"></a>

為了加速事件驅動型應用程式的開發，您可以向 Amazon SNS 主題訂閱 AWS 由事件分叉管道提供支援的事件處理管道。 AWS 事件分叉管道是一組開放原始碼[巢狀應用程式](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-nested-applications.html)，以[AWS 無伺服器應用程式模型](https://aws.amazon.com/serverless/sam/) (AWS SAM) 為基礎，您可以直接從[AWS 事件分叉管道套件](https://serverlessrepo.aws.amazon.com/applications?query=aws-event-fork-pipelines) （選擇**顯示建立自訂 IAM 角色或資源政策的應用程式**) 中部署 AWS 。如需詳細資訊，請參閱[AWS 事件分叉管道的運作方式](sns-fork-pipeline-as-subscriber.md#how-sns-fork-works)。

此頁面說明如何使用 AWS 管理主控台 部署和測試 AWS 事件分叉管道範例應用程式。

**重要**  
為了避免在您完成部署 AWS Event Fork Pipelines 範例應用程式之後產生不必要的成本，請刪除其 CloudFormation 堆疊。如需詳細資訊，請參閱 *AWS CloudFormation 使用者指南*中的[刪除 CloudFormation 主控台的堆疊](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)。

# AWS 事件分叉管道使用案例範例
<a name="example-sns-fork-use-case"></a>

下列案例說明使用 AWS Event Fork Pipelines 的事件驅動型無伺服器電子商務應用程式。您可以在 中使用此[範例電子商務應用程式](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:077246666028:applications~fork-example-ecommerce-checkout-api)， AWS Serverless Application Repository 然後使用 AWS Lambda 主控台將其部署在 AWS 帳戶 中，您可以在其中進行測試，並在 GitHub 中檢查其原始碼。

![\[整合 的無伺服器電子商務應用程式的架構 AWS 服務。它描述了從透過 API Gateway 下訂單的電子商務使用者到不同處理管道的流程，包括訂單儲存、搜尋分析和重播，展示如何透過 Amazon SNS、Lambda、Amazon SQS、DynamoDB 和 Kibana 管理和分析事件。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-fork-example-use-case.png)


此電子商務應用程式會透過 API Gateway 託管並由 AWS Lambda 函數 支援的 RESTful API 接收買方的訂單`CheckoutApiBackendFunction`。此函數將所有收到的訂單發佈到名為 `CheckoutEventsTopic` 的 Amazon SNS 主題，此主題又進而將訂單散發到四個不同的管道。

第一個管道是一般結帳處理管道，由電子商務應用程式的擁有者所設計和實作。此管道具有`CheckoutQueue`緩衝所有已接收訂單的 Amazon SQS 佇列、名為 的 AWS Lambda 函數`CheckoutFunction`，以輪詢佇列來處理這些訂單，以及`CheckoutTable`安全儲存所有已下訂訂單的 DynamoDB 資料表。

## 套用 AWS 事件分叉管道
<a name="applying-sns-fork-pipelines"></a>

電子商務應用程式的元件處理核心商業邏輯。不過，電子商務應用程式擁有者還需要解決下列問題：
+ **合規** 靜態加密安全、壓縮的備份，並淨化敏感資訊
+ **彈性** 在履行程序中斷時重播最近的訂單
+ **可搜尋性** 對已提交的訂單進行分析並產生指標

應用程式擁有者可以訂閱 `CheckoutEventsTopic`Amazon SNS 主題 AWS 的事件分叉管道，而不是實作此事件處理邏輯
+ [事件儲存和備份管道](sns-fork-pipeline-as-subscriber.md#sns-fork-event-storage-and-backup-pipeline) 設定為轉換資料以移除信用卡詳細資訊、緩衝資料 60 秒、使用 GZIP 來壓縮資料，以及使用 Amazon S3 的預設客戶受管金鑰來加密資料。此金鑰由 管理 AWS ，並由 AWS Key Management Service () 提供支援AWS KMS。

  如需詳細資訊，請參閱[《Amazon Data Firehose 開發人員指南》中的為您的目的地選擇 Amazon S3](https://docs.aws.amazon.com/firehose/latest/dev/create-destination.html#create-destination-s3)**[、Amazon Data Firehose 資料轉換](https://docs.aws.amazon.com/firehose/latest/dev/data-transformation.html)和[設定設定](https://docs.aws.amazon.com/firehose/latest/dev/create-configure.html)。
+ [事件搜尋和分析管道](sns-fork-pipeline-as-subscriber.md#sns-fork-event-search-and-analytics-pipeline)設定為索引重試持續時間 30 秒、使用儲存貯體來存放無法在搜尋網域中編製索引的訂單，以及使用篩選政策來限制可編製索引的訂單集。

  如需詳細資訊，請參閱《*Amazon Data Firehose 開發人員指南*》中的[為您的目的地選擇 OpenSearch Service](https://docs.aws.amazon.com/firehose/latest/dev/create-destination.html#create-destination-elasticsearch)。
+ 設定 [事件重播管道](sns-fork-pipeline-as-subscriber.md#sns-fork-event-replay-pipeline) 為使用電子商務應用程式擁有者所設計和實作的一般訂單處理管道的 Amazon SQS 佇列部分。

  如需詳細資訊，請參閱 *Amazon Simple Queue Service 開發人員指南*中的[佇列名稱與 URL](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-general-identifiers.html#queue-name-url)。

事件搜尋和分析管道的組態中設定下列 JSON 篩選政策。它只符合總金額為 100 USD 或更多金額的傳入訂單。如需詳細資訊，請參閱[Amazon SNS 訊息篩選](sns-message-filtering.md)。

```
{				
   "amount": [{ "numeric": [ ">=", 100 ] }]
}
```

使用 AWS 事件分叉管道模式，電子商務應用程式擁有者可以避免通常在為事件處理編碼不區分邏輯之後產生的開發開銷。相反地，她可以直接從 將 AWS 事件分叉管道部署 AWS Serverless Application Repository 到她的 AWS 帳戶。

# 步驟 1：部署範例 Amazon SNS 應用程式
<a name="deploy-sample-application"></a>

1. 登入 [AWS Lambda 主控台](https://console.aws.amazon.com/lambda/)。

1. 在導覽面板上，選擇 **Functions (函數)**，然後選擇 **Create function (建立函數)**。

1. 在 **Create function** (建立函數) 頁面上，執行下列動作：

   1. 選擇**瀏覽無伺服器應用程式存放庫**、**公有應用程式**、**顯示建立自訂 IAM 角色或資源政策的應用程式**。

   1. 搜尋 `fork-example-ecommerce-checkout-api`，然後選擇應用程式。

1. 在 **fork-example-ecommerce-checkout-api** 頁面上，執行下列動作：

   1. 在 **Application settings (應用程式設定)** 區段中，輸入 **Application name (應用程式名稱)** (例如，`fork-example-ecommerce-my-app`)。
**注意**  
為了在稍後輕鬆找到您的資源，請保留字首 `fork-example-ecommerce`。
對於每個部署，應用程式名稱必須是唯一的。如果您重複使用應用程式名稱，部署只會更新先前部署的堆疊 （而不是建立新的 CloudFormation 堆疊）。

   1. (選用) 輸入下列其中之一 **LogLevel** 設置來執行應用程序的 Lambda 函數：
      + `DEBUG`
      + `ERROR`
      + `INFO` (default)
      + `WARNING`

1. 選擇 **I acknowledge that this app creates custom IAM roles, resource policies and deploys nested applications. (我了解此應用程式會建立自訂 IAM 角色、資源政策及部署巢狀應用程式。)**，然後在頁面底部選擇 **Deploy (部署)**。

在**分叉範例電子商務的部署狀態*my-app***頁面上，Lambda 會顯示**您的應用程式正在部署**狀態。

在**資源**區段中， CloudFormation 開始建立堆疊，並顯示每個資源的 **CREATE\$1IN\$1PROGRESS** 狀態。程序完成時， CloudFormation 會顯示 **CREATE\$1COMPLETE** 狀態。

**注意**  
可能需要 20 到 30 分鐘才能部署完所有資源。

當部署完成時，Lambda 會顯示 **Your application has been deployed** (您的應用程式已經完成部署) 狀態。

# 步驟 2：執行 SNS 連結範例應用程式
<a name="execute-sample-application"></a>

1. 在 AWS Lambda 主控台的導覽面板上，選擇**應用程式**。

1. 在 **Applications (應用程式)** 頁面的搜尋欄位中，搜尋 `serverlessrepo-fork-example-ecommerce-my-app`，然後搜尋應用程式。

1. 在 **Resources (資源)** 區段中，執行下列動作：

   1. 若要尋找類型為 **ApiGateway RestApi** 的資源，請依 **Type (類型)** 排序資源 (例如 `ServerlessRestApi`)，然後展開資源。

   1. 將會顯示兩個巢狀資源，類型為 **ApiGateway Deployment** 和 **ApiGateway Stage**。

   1. 複製 **Prod API endpoint** 連結，並附加 `/checkout`，例如：

      ```
      https://abcdefghij.execute-api.us-east-2.amazonaws.com/Prod/checkout
      ```

1. 將下列 JSON 複製到名為 `test_event.json` 的檔案。

   ```
   {
      "id": 15311,
      "date": "2019-03-25T23:41:11-08:00",
      "status": "confirmed",
      "customer": {
         "id": 65144,		
   	 "quantity": 2,
         "price": 25.00,
         "subtotal": 50.00
      }]
   }
   ```

1. 若要將 HTTPS 請求傳送到您的 API 端點，請執行 `curl` 命令來傳遞範例事件承載當做輸入，例如：

   ```
   curl -d "$(cat test_event.json)" https://abcdefghij.execute-api.us-east-2.amazonaws.com/Prod/checkout
   ```

   API 會傳回以下空的回應，表示成功執行：

   ```
   { }
   ```

# 步驟 3：驗證 Amazon SNS 應用程式和管道效能
<a name="verify-sample-application-pipelines"></a>

## 步驟 1：驗證範例結帳管道的執行
<a name="verify-execution-checkout-pipeline"></a>

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

1. 在導覽面板上，選擇 **Tables (資料表)**。

1. 搜尋 `serverlessrepo-fork-example` 並選擇 `CheckoutTable`。

1. 在表格詳細資訊頁面，選擇 **Items (項目)**，然後選擇建立的項目。

   將會顯示存放的屬性。

## 步驟 2：驗證事件儲存和備份管道的執行
<a name="verify-execution-event-storage-backup-pipeline"></a>

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

1. 在導覽面板上，選擇 **Buckets (儲存貯體)**。

1. 搜尋 `serverlessrepo-fork-example`，然後選擇 `CheckoutBucket`。

1. 瀏覽目錄階層，直到您找到副檔名為 `.gz` 的檔案為止。

1. 若要下載檔案，請選擇 **Actions (動作)**、**Open (開啟)**。

1. 基於合規理由，管道已設定 Lambda 函數來淨化信用卡資訊。

   若要驗證存放的 JSON 承載不包含任何信用卡資訊，請解壓縮檔案。

## 步驟 3：驗證事件搜尋和分析管道的執行
<a name="verify-execution-event-search-analytics-pipeline"></a>

1. 登入 [OpenSearch Service 主控台](https://console.aws.amazon.com/aos/)。

1. 在導覽面板的 **My domains (我的網域)** 下，選擇以 `serverl-analyt` 為字首的網域。

1. 管道已設定 Amazon SNS 訂閱篩選政策來設定數值相符條件。

   若要驗證事件編製索引是因為它參考的訂單的值高於 100 USD，請在 **serverl-analyt-*abcdefgh1ijk*** 頁面上選擇 **Indices (索引)**、**checkout\$1events**。

## 步驟 4：驗證事件重播管道的執行
<a name="verify-execution-event-replay-pipeline"></a>

1. 請登入 [Amazon SQS 主控台](https://console.aws.amazon.com/sqs/)。

1. 在佇列清單中，搜尋 `serverlessrepo-fork-example` 並選擇 `ReplayQueue`。

1. 選擇**傳送及接收訊息**。

1. 在 **Send and receive messages in fork-example-ecommerce-*my-app*...ReplayP-ReplayQueue-*123ABCD4E5F6*** (fork-example-ecommerce-my-app...ReplayP-ReplayQueue-123ABCD4E5F6 中傳送和接收訊息) 對話方塊中，選擇 **Poll for messages** (輪詢訊息)。

1. 若要驗證事件已排入佇列中，請在佇列中出現的訊息旁邊選擇 **More Details (更多詳細資訊)**。

# 步驟 4：模擬問題並重播事件以進行復原
<a name="simulate-issue-replay-events-for-recovery"></a>

## 步驟 1：啟用模擬問題並傳送第二個 API 請求
<a name="enable-simulated-issue-send-second-api-request"></a>

1. 登入 [AWS Lambda 主控台](https://console.aws.amazon.com/lambda/)。

1. 在導覽面板上，選擇 **Functions (函數)**。

1. 搜尋 `serverlessrepo-fork-example` 並選擇 `CheckoutFunction`。

1. 在 **fork-example-ecommerce-*my-app*-CheckoutFunction-*ABCDEF*...** 頁面的 **Environment variables (環境變數)** 區段中，將 **BUG\$1ENABLED** 變數設定為 **true**，然後選擇 **Save (儲存)**。

1. 將下列 JSON 複製到名為 `test_event_2.json` 的檔案。

   ```
   {
   	   "id": 9917,
   	   "date": "2019-03-26T21:11:10-08:00",
   	   "status": "confirmed",
   	   "customer": {
   	      "id": 56999,
   "quantity": 1,
   	      "price": 75.00,
   	      "subtotal": 75.00
   	   }]
   	}
   ```

1. 若要將 HTTPS 請求傳送到您的 API 端點，請執行 `curl` 命令來傳遞範例事件承載當做輸入，例如：

   ```
   curl -d "$(cat test_event_2.json)" https://abcdefghij.execute-api.us-east-2.amazonaws.com/Prod/checkout
   ```

   API 會傳回以下空的回應，表示成功執行：

   ```
   { }
   ```

## 步驟 2：驗證模擬資料損毀
<a name="verify-simulated-data-corruption"></a>

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

1. 在導覽面板上，選擇 **Tables (資料表)**。

1. 搜尋 `serverlessrepo-fork-example` 並選擇 `CheckoutTable`。

1. 在表格詳細資訊頁面，選擇 **Items (項目)**，然後選擇建立的項目。

   將會顯示存放的屬性，有些標記為 **CORRUPTED\$1 (毀損！)**

## 步驟 3：停用模擬問題
<a name="disable-simulated-issue"></a>

1. 登入 [AWS Lambda 主控台](https://console.aws.amazon.com/lambda/)。

1. 在導覽面板上，選擇 **Functions (函數)**。

1. 搜尋 `serverlessrepo-fork-example` 並選擇 `CheckoutFunction`。

1. 在 **fork-example-ecommerce-*my-app*-CheckoutFunction-*ABCDEF*...** 頁面的 **Environment variables (環境變數)** 區段中，將 **BUG\$1ENABLED** 變數設定為 **false**，然後選擇 **Save (儲存)**。

## 步驟 4：啟用重播以從問題中復原
<a name="enable-replay-recover-from-simulated-issue"></a>

1. 在 AWS Lambda 主控台的導覽面板上，選擇 **函數**。

1. 搜尋 `serverlessrepo-fork-example` 並選擇 `ReplayFunction`。

1. 展開 **Designer (設計工具)** 區段，選擇 **SQS** 圖磚，然後在 **SQS** 區段中選擇 **Enabled (已啟用)**。
**注意**  
需要大約 1 分鐘，Amazon SQS 事件來源觸發才會啟用。

1. 選擇**儲存**。

1. 若要查看復原的屬性，請返回 Amazon DynamoDB 主控台。

1. 若要停用重播，請返回 AWS Lambda 主控台並停用 的 Amazon SQS 事件來源觸發`ReplayFunction`。

# 訂閱 Amazon SNS 主題 AWS 的事件分叉管道
<a name="sns-subscribe-event-fork-pipelines"></a>

為了加速事件驅動型應用程式的開發，您可以向 Amazon SNS 主題訂閱 AWS 由事件分叉管道提供支援的事件處理管道。 AWS 事件分叉管道是一組開放原始碼[巢狀應用程式](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-nested-applications.html)，以[AWS 無伺服器應用程式模型](https://aws.amazon.com/serverless/sam/) (AWS SAM) 為基礎，您可以直接從[AWS 事件分叉管道套件](https://serverlessrepo.aws.amazon.com/applications?query=aws-event-fork-pipelines) （選擇**顯示建立自訂 IAM 角色或資源政策的應用程式**) 中部署 AWS 。如需詳細資訊，請參閱[AWS 事件分叉管道的運作方式](sns-fork-pipeline-as-subscriber.md#how-sns-fork-works)。

本節說明如何使用 AWS 管理主控台 部署管道，然後將 AWS 事件分叉管道訂閱 Amazon SNS 主題。開始之前，請[建立 Amazon SNS 主題](sns-create-topic.md)。

若要刪除構成管道的資源，請在 AWS Lambda 主控台的應用程式****頁面上尋找管道，展開 **SAM 範本區段**，選擇 **CloudFormation 堆疊**，然後選擇**其他動作**、**刪除堆疊**。

# 將事件儲存和備份管道部署和訂閱至 Amazon SNS
<a name="deploy-event-storage-backup-pipeline"></a>


|  | 
| --- |
| 對於事件封存和分析，Amazon SNS 現在建議使用其與 Amazon Data Firehose 的原生整合。您可以訂閱 Firehose 交付串流至 SNS 主題，這可讓您將通知傳送至封存和分析端點，例如 Amazon Simple Storage Service (Amazon S3) 儲存貯體、Amazon Redshift 資料表、Amazon OpenSearch Service (OpenSearch Service) 等。搭配使用 Amazon SNS 與 Firehose 交付串流是全受管且無程式碼的解決方案，不需要您使用 AWS Lambda 函數。如需詳細資訊，請參閱[散發到 Firehose 交付串流](sns-firehose-as-subscriber.md)。 | 

本教學課程說明如何部署[事件儲存和備份管道](sns-fork-pipeline-as-subscriber.md#sns-fork-event-storage-and-backup-pipeline)，並讓管道訂閱 Amazon SNS 主題。此程序會自動將與管道相關聯的 AWS SAM 範本轉換為 CloudFormation 堆疊，然後將堆疊部署到您的 AWS 帳戶。此程序還會建立和設定一組資源 (構成事件儲存和備份管道)，包括下列項目：
+ Amazon SQS 佇列
+ Lambda 函式
+ Firehose 交付串流
+ Amazon S3 備份儲存貯體

如需使用 Amazon S3 儲存貯體做為目的地設定串流的詳細資訊，請參閱《*Amazon Data Firehose API 參考*`[S3DestinationConfiguration](https://docs.aws.amazon.com/firehose/latest/APIReference/API_S3DestinationConfiguration.html)`》中的 。

如需轉換事件以及設定事件緩衝、事件壓縮和事件加密的詳細資訊，請參閱《*Amazon Data Firehose 開發人員指南*》中的[建立交付串流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)。

如需有關篩選事件的詳細資訊，請參閱本指南中的[Amazon SNS 訂閱篩選政策](sns-subscription-filter-policies.md)。

1. 登入 [AWS Lambda 主控台](https://console.aws.amazon.com/lambda/)。

1. 在導覽面板上，選擇 **Functions (函數)**，然後選擇 **Create function (建立函數)**。

1. 在 **Create function** (建立函數) 頁面上，執行下列動作：

   1. 選擇**瀏覽無伺服器應用程式存放庫**、**公有應用程式**、**顯示建立自訂 IAM 角色或資源政策的應用程式**。

   1. 搜尋 `fork-event-storage-backup-pipeline`，然後選擇應用程式。

1. 在 **fork-event-storage-backup-pipeline** 頁面上，執行下列動作：

   1. 在 **Application settings (應用程式設定)** 區段中，輸入 **Application name (應用程式名稱)** (例如，`my-app-backup`)。
**注意**  
對於每個部署，應用程式名稱必須是唯一的。如果您重複使用應用程式名稱，部署只會更新先前部署的堆疊 （而不是建立新的 CloudFormation 堆疊）。

   1. （選用） 針對 **BucketArn**，輸入要載入傳入事件的 Amazon S3 儲存貯體 ARN。如果您未輸入值，則會在 AWS 帳戶中建立新的 Amazon S3 儲存貯體。

   1. (選用) 對於 **DataTransformationFunctionArn**，輸入 Lambda 函數的 ARN，以透過此函數來轉換傳入的事件。如果您不輸入值，資料轉換會停用。

   1. (選用) 輸入下列其中之一 **LogLevel** 設置來執行應用程序的 Lambda 函數：
      + `DEBUG`
      + `ERROR`
      + `INFO` (default)
      + `WARNING`

   1. 對於 **TopicArn**，輸入 Amazon SNS 主題的 ARN，表示分支管道的此執行個體將訂閱此主題。

   1. (選用) 對於 **StreamBufferingIntervalInSeconds** 和 **StreamBufferingSizeInMBs**，輸入值來設定如何緩衝傳入的事件。如果您不輸入任何值，則會使用 300 秒和 5 MB。

   1. (選用) 輸入以下其中一個 **StreamCompressionFormat** 設定來壓縮傳入的事件：
      + `GZIP`
      + `SNAPPY`
      + `UNCOMPRESSED` (default)
      + `ZIP`

   1. （選用） 對於 **StreamPrefix**，輸入字串字首以命名存放在 Amazon S3 備份儲存貯體中的檔案。如果您不輸入值，則不會使用字首。

   1. (選用) 對於 **SubscriptionFilterPolicy**，使用 JSON 格式輸入 Amazon SNS 訂閱篩選政策，以用於篩選傳入的事件。篩選政策決定哪些事件會在 OpenSearch Service 索引中編製索引。如果您不輸入值，則不會使用篩選 (所有事件都編製索引)。

   1. (可選) 針對 **SubscriptionFilterPolicyScope**，請輸入字串 `MessageBody` 或 `MessageAttributes`，啟用以承載或屬性為基礎的訊息篩選。

   1. 選擇 **I acknowledge that this app creates custom IAM roles, resource policies and deploys nested applications. (我了解此應用程式會建立自訂 IAM 角色、資源政策及部署巢狀應用程式。)**，然後選擇 **Deploy (部署)**。

在**部署狀態*my-app***頁面上，Lambda 會顯示**您的應用程式正在部署**狀態。

在**資源**區段中， CloudFormation 開始建立堆疊，並顯示每個資源的 **CREATE\$1IN\$1PROGRESS** 狀態。程序完成時， CloudFormation 會顯示 **CREATE\$1COMPLETE** 狀態。

當部署完成時，Lambda 會顯示 **Your application has been deployed** (您的應用程式已經完成部署) 狀態。

發佈至 Amazon SNS 主題的訊息會自動儲存在事件儲存和備份管道佈建的 Amazon S3 備份儲存貯體中。

# 將事件搜尋和分析管道部署和訂閱至 Amazon SNS
<a name="deploy-event-search-analytics-pipeline"></a>


|  | 
| --- |
| 對於事件封存和分析，Amazon SNS 現在建議使用其與 Amazon Data Firehose 的原生整合。您可以訂閱 Firehose 交付串流至 SNS 主題，這可讓您將通知傳送至封存和分析端點，例如 Amazon Simple Storage Service (Amazon S3) 儲存貯體、Amazon Redshift 資料表、Amazon OpenSearch Service (OpenSearch Service) 等。搭配使用 Amazon SNS 與 Firehose 交付串流是全受管且無程式碼的解決方案，不需要您使用 AWS Lambda 函數。如需詳細資訊，請參閱[散發到 Firehose 交付串流](sns-firehose-as-subscriber.md)。 | 

本教學課程說明如何部署[事件搜尋和分析管道](sns-fork-pipeline-as-subscriber.md#sns-fork-event-search-and-analytics-pipeline)，並讓管道訂閱 Amazon SNS 主題。此程序會自動將與管道相關聯的 AWS SAM 範本轉換為 CloudFormation 堆疊，然後將堆疊部署到您的 AWS 帳戶。此程序還會建立和設定一組資源 (構成事件搜尋和分析管道)，包括下列項目：
+ Amazon SQS 佇列
+ Lambda 函式
+ Firehose 交付串流
+ Amazon OpenSearch Service 網域
+ Amazon S3 無法投遞儲存貯體

如需使用索引做為目的地設定串流的詳細資訊，請參閱《*Amazon Data Firehose API 參考*`[ElasticsearchDestinationConfiguration](https://docs.aws.amazon.com/firehose/latest/APIReference/API_ElasticsearchDestinationConfiguration.html)`》中的 。

如需轉換事件以及設定事件緩衝、事件壓縮和事件加密的詳細資訊，請參閱《*Amazon Data Firehose 開發人員指南*》中的[建立交付串流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)。

如需有關篩選事件的詳細資訊，請參閱本指南中的[Amazon SNS 訂閱篩選政策](sns-subscription-filter-policies.md)。

1. 登入 [AWS Lambda 主控台](https://console.aws.amazon.com/lambda/)。

1. 在導覽面板上，選擇 **Functions (函數)**，然後選擇 **Create function (建立函數)**。

1. 在 **Create function** (建立函數) 頁面上，執行下列動作：

   1. 選擇**瀏覽無伺服器應用程式存放庫**、**公有應用程式**、**顯示建立自訂 IAM 角色或資源政策的應用程式**。

   1. 搜尋 `fork-event-search-analytics-pipeline`，然後選擇應用程式。

1. 在 **fork-event-search-analytics-pipeline** 頁面上，執行下列動作：

   1. 在 **Application settings (應用程式設定)** 區段中，輸入 **Application name (應用程式名稱)** (例如，`my-app-search`)。
**注意**  
對於每個部署，應用程式名稱必須是唯一的。如果您重複使用應用程式名稱，部署只會更新先前部署的堆疊 （而不是建立新的 CloudFormation 堆疊）。

   1. (選用) 對於 **DataTransformationFunctionArn**，輸入 Lambda 函數的 ARN，以使用此函數來轉換傳入的事件。如果您不輸入值，資料轉換會停用。

   1. (選用) 輸入下列其中之一 **LogLevel** 設置來執行應用程序的 Lambda 函數：
      + `DEBUG`
      + `ERROR`
      + `INFO` (default)
      + `WARNING`

   1. (選用) 對於 **SearchDomainArn**，輸入叢集所在 OpenSearch Service 網域的 ARN，此叢集將設定所需的運算和儲存功能。如果您不輸入值，將會以預設組態建立新網域。

   1. 對於 **TopicArn**，輸入 Amazon SNS 主題的 ARN，表示分支管道的此執行個體將訂閱此主題。

   1. 對於 **SearchIndexName**，輸入事件搜尋和分析的 OpenSearch Service 索引名稱。
**注意**  
索引名稱有下列配額：  
不得包含大寫字母
不得包含下列字元：`\ / * ? " < > | ` , #`
開頭不得為下列字元：`- + _`
不得為下列字元：`. ..`
長度不得超過 80 個字元
長度不得超過 255 個位元組
不得包含冒號 (從 OpenSearch Service 7.0 開始)

   1. (選用) 輸入下列其中一項 OpenSearch Service 索引輪換期間的 **SearchIndexRotationPeriod** 設定：
      + `NoRotation` (default)
      + `OneDay`
      + `OneHour`
      + `OneMonth`
      + `OneWeek`

      索引輪換會將時間戳記附加到索引名稱，方便看出舊資料已過期。

   1. 對於 **SearchTypeName**，輸入 OpenSearch Service 類型的名稱，以組織索引中的事件。
**注意**  
OpenSearch Service 類型名稱可以包含任何字元 (null 位元組除外)，但開頭不得為 `_`。
若是 OpenSearch Service 6.x，每個索引僅能使用一個類型。如果您為已有其他類型的現有索引指定新類型，Firehose 會傳回執行時間錯誤。

   1. (選用) 對於 **StreamBufferingIntervalInSeconds** 和 **StreamBufferingSizeInMBs**，輸入值來設定如何緩衝傳入的事件。如果您不輸入任何值，則會使用 300 秒和 5 MB。

   1. (選用) 輸入以下其中一個 **StreamCompressionFormat** 設定來壓縮傳入的事件：
      + `GZIP`
      + `SNAPPY`
      + `UNCOMPRESSED` (default)
      + `ZIP`

   1. （選用） 對於 **StreamPrefix**，輸入字串字首以命名存放在 Amazon S3 無效字母儲存貯體中的檔案。如果您不輸入值，則不會使用字首。

   1. （選用） 對於 **StreamRetryDurationInSecons**，輸入 Firehose 無法在 OpenSearch Service 索引中為事件編製索引之案例的重試持續時間。如果您不輸入值，則會使用 300 秒。

   1. (選用) 對於 **SubscriptionFilterPolicy**，使用 JSON 格式輸入 Amazon SNS 訂閱篩選政策，以用於篩選傳入的事件。篩選政策決定哪些事件會在 OpenSearch Service 索引中編製索引。如果您不輸入值，則不會使用篩選 (所有事件都編製索引)。

   1. 選擇 **I acknowledge that this app creates custom IAM roles, resource policies and deploys nested applications. (我了解此應用程式會建立自訂 IAM 角色、資源政策及部署巢狀應用程式。)**，然後選擇 **Deploy (部署)**。

在**部署狀態*my-app 搜尋***頁面上，Lambda 會顯示**您的應用程式正在部署**狀態。

在**資源**區段中， CloudFormation 開始建立堆疊，並顯示每個資源的 **CREATE\$1IN\$1PROGRESS** 狀態。程序完成時， CloudFormation 會顯示 **CREATE\$1COMPLETE** 狀態。

當部署完成時，Lambda 會顯示 **Your application has been deployed** (您的應用程式已經完成部署) 狀態。

發佈到 Amazon SNS 主題的訊息會在由事件搜尋和分析管道佈建的 OpenSearch Service 索引中自動編製索引。如果管道無法為事件編製索引，它會將它存放在 Amazon S3 無效字母儲存貯體中。

# 使用 Amazon SNS 整合部署事件重播管道
<a name="deploy-event-replay-pipeline"></a>

本教學課程說明如何部署[事件重播管道](sns-fork-pipeline-as-subscriber.md#sns-fork-event-replay-pipeline)，並讓管道訂閱 Amazon SNS 主題。此程序會自動將與管道相關聯的 AWS SAM 範本轉換為 CloudFormation 堆疊，然後將堆疊部署到您的 AWS 帳戶。此程序還會建立和設定一組資源 (構成事件重播管道)，包括 Amazon SQS 佇列和 Lambda 函數。

如需有關篩選事件的詳細資訊，請參閱本指南中的[Amazon SNS 訂閱篩選政策](sns-subscription-filter-policies.md)。

1. 登入 [AWS Lambda 主控台](https://console.aws.amazon.com/lambda/)。

1. 在導覽面板上，選擇 **Functions (函數)**，然後選擇 **Create function (建立函數)**。

1. 在 **Create function** (建立函數) 頁面上，執行下列動作：

   1. 選擇**瀏覽無伺服器應用程式存放庫**、**公有應用程式**、**顯示建立自訂 IAM 角色或資源政策的應用程式**。

   1. 搜尋 `fork-event-replay-pipeline`，然後選擇應用程式。

1. 在 **fork-event-replay-pipeline** 頁面上，執行下列動作：

   1. 在 **Application settings (應用程式設定)** 區段中，輸入 **Application name (應用程式名稱)** (例如，`my-app-replay`)。
**注意**  
對於每個部署，應用程式名稱必須是唯一的。如果您重複使用應用程式名稱，部署只會更新先前部署的堆疊 （而不是建立新的 CloudFormation 堆疊）。

   1. (選用) 輸入下列其中之一 **LogLevel** 設置來執行應用程序的 Lambda 函數：
      + `DEBUG`
      + `ERROR`
      + `INFO` (default)
      + `WARNING`

   1. (選用) **對於 ReplayQueueRetentionPeriodInSeconds**，輸入 Amazon SQS 重播佇列保留訊息的時間量 (以秒為單位)。如果您不輸入值，則會使用 1,209,600 秒 (14 天)。

   1. 對於 **TopicArn**，輸入 Amazon SNS 主題的 ARN，表示分支管道的此執行個體將訂閱此主題。

   1. 對於 **DestinationQueueName**，輸入 Amazon SQS 佇列的名稱，供 Lambda 重播函數將訊息轉送到此佇列。

   1. (選用) 對於 **SubscriptionFilterPolicy**，使用 JSON 格式輸入 Amazon SNS 訂閱篩選政策，以用於篩選傳入的事件。篩選政策決定緩衝哪些事件來重播。如果您不輸入值，則不會使用篩選 (緩衝所有事件來重播)。

   1. 選擇 **I acknowledge that this app creates custom IAM roles, resource policies and deploys nested applications. (我了解此應用程式會建立自訂 IAM 角色、資源政策及部署巢狀應用程式。)**，然後選擇 **Deploy (部署)**。

在**部署狀態*my-app 重播***頁面上，Lambda 會顯示**您的應用程式正在部署**狀態。

在**資源**區段中， CloudFormation 開始建立堆疊，並顯示每個資源的 **CREATE\$1IN\$1PROGRESS** 狀態。程序完成時， CloudFormation 會顯示 **CREATE\$1COMPLETE** 狀態。

當部署完成時，Lambda 會顯示 **Your application has been deployed** (您的應用程式已經完成部署) 狀態。

發佈到 Amazon SNS 主題的訊息會在由事件重播管道佈建的 Amazon SQS 佇列中自動緩衝以重播。

**注意**  
在預設情況下會停用重播。若要啟用重播，請導覽到 Lambda 主控台的函數頁面，展開 **Designer** (設計工具) 區段，選擇 **SQS** 圖磚，然後在 **SQS** 區段中，選擇 **Enabled** (已啟用)。

# 使用 Amazon EventBridge 排程器搭配 Amazon SNS
<a name="using-eventbridge-scheduler"></a>

[Amazon EventBridge 排程器](https://docs.aws.amazon.com/scheduler/latest/UserGuide/what-is-scheduler.html)是無伺服器排程器，可讓您從單一受管的中央服務建立、執行及管理任務。使用 EventBridge 排程器，您可以使用週期性模式的 Cron 和 Rate 運算式來建立排程，或設定一次性呼叫。您可以設定彈性的交付時段、定義重試次數上限，以及設定失敗的 API 調用的最長保留時間。

本頁面說明如何使用 EventBridge 排程器，依照排程從 Amazon SNS 主題發佈訊息。



## 設定執行角色
<a name="using-eventbridge-scheduler-execution-role"></a>

 當您建立新排程時，EventBridge 排程器必須具有代表您調用其目標 API 操作的權限。您可以使用*執行角色*，授與 EventBridge 排程器這些許可。排程執行角色所連接的許可政策會定義哪些是必要許可。許可是否為必要權限，取決於您希望 EventBridge 排程器調用的目標 API。

 您在 EventBridge 排程器主控台建立排程時 (如以下程序所述)，EventBridge 排程器會根據您選取的目標自動設定執行角色。如果您想要使用其中一個 EventBridge 排程器 SDKs、 AWS CLI或 建立排程 CloudFormation，您必須擁有現有的執行角色，授予 EventBridge 排程器調用目標所需的許可。如需為排程手動設定執行角色的詳細資訊，請參閱《*EventBridge 排程器使用者指南*》中的[設定執行角色](https://docs.aws.amazon.com/scheduler/latest/UserGuide/setting-up.html#setting-up-execution-role)。

## 建立排程
<a name="using-eventbridge-scheduler-create"></a>

**使用主控台建立排程**

1. 前往 [https://console.aws.amazon.com/scheduler/home](https://console.aws.amazon.com/scheduler/home/) 開啟 Amazon EventBridge 排程器。

1.  在**排程**頁面上，選擇**建立排程**。

1.  在**指定排程詳細資訊**頁面的**排程名稱和描述**區段中，執行以下動作：

   1. 在**排程名稱**中，輸入排程的名稱，例如 **MyTestSchedule**。

   1. (選用) 在**描述**中，輸入對排程的描述，例如 **My first schedule**。

   1. 針對**排程群組**，從下拉式清單中選擇排程群組。如果您沒有群組，請選擇**預設值**。若要建立排程群組，請選擇**建立自己的排程**。

      您可以使用排程群組，為不同群組的排程加上標籤。

1. 

   1. 選擇排程選項。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/using-eventbridge-scheduler.html)

1. (選用) 如果您在上一個步驟中選擇**週期性排程**，請在**時間範圍**區段執行以下動作：

   1. 針對**時區**選擇時區。

   1. 對於**開始日期和時間**，依 `YYYY/MM/DD` 格式輸入有效日期，接著依 24 小時的 `hh:mm` 格式指定時間戳記。

   1. 對於**結束日期和時間**，依 `YYYY/MM/DD` 格式輸入有效日期，接著依 24 小時的 `hh:mm` 格式指定時間戳記。

1. 選擇**下一步**。

1. 在**選取目標**頁面上，選擇 EventBridge 排程器叫用的 AWS API 操作：

   1. 選擇 **Amazon SNS 發佈**。

   1. 在**發佈**區段中，選取 SNS 主題或選擇**建立新 SNS 主題**。

   1. (選用) 輸入 JSON 承載。如果您未輸入承載，EventBridge 排程器會使用空白事件來調用函數。

1. 選擇**下一步**。

1. 在**設定**頁面執行以下動作：

   1. 若要開啟排程，請在**排程狀態**底下切換到**啟用排程**。

   1. 若要設定排程的重試政策，請在**重試政策和無效字母佇列 (DLQ)** 底下執行以下動作：
      + 切換到**重試**。
      + 針對**事件的最長存留期**，輸入 EventBridge 排程器保留未處理事件的最大**時數**和**分鐘數**。
      + 時間最長可設為 24 小時。
      + 針對**重試次數上限**，輸入目標傳回錯誤時，EventBridge 排程器重新嘗試執行排程的次數上限。

         最大值為重試 185 次。

      設定好重試政策後，如果排程無法調用其目標，EventBridge 排程器會重新執行排程。一旦設定此功能，您就必須設定排程的最長保留時間和重試次數。

   1. 選擇 EventBridge 排程器儲存未交付事件的位置。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/using-eventbridge-scheduler.html)

   1. 若要使用由客戶管理的金鑰加密您的目標輸入，請在**加密**底下選擇**自訂加密設定 (進階)**。

      如果選擇此選項，請輸入現有的 KMS 金鑰 ARN，或選擇**建立 AWS KMS key**，以導覽至 AWS KMS 控制台。如需 EventBridge 排程器如何加密靜態資料的詳細資訊，請參閱《Amazon EventBridge 排程器使用者指南》中的[靜態加密](https://docs.aws.amazon.com/scheduler/latest/UserGuide/encryption-rest.html)**。

   1. 若要讓 EventBridge 排程器為您建立新的執行角色，請選擇**為此排程建立新角色**。接著輸入**角色名稱**。如果您選擇此選項，EventBridge 排程器會將範本化目標所需的必要許可與角色連接。

1. 選擇**下一步**。

1.  在**檢閱和建立排程**頁面上，檢閱排程的詳細資訊。在每個區段中選擇**編輯**，即可返回該步驟並編輯其詳細資訊。

1. 選擇**建立排程**。

   您可以在**排程**頁面檢視新建立和現有的排程。在**狀態**欄底下，確認您的新排程狀態為**已啟用**。

## 相關資源
<a name="using-eventbridge-scheduler-related-resources"></a>

 如需 EventBridge 排程器的詳細資訊，請參閱下列內容：
+ [EventBridge 排程器使用者指南](https://docs.aws.amazon.com/scheduler/latest/UserGuide/what-is-scheduler.html)
+ [EventBridge 排程器 API 參考](https://docs.aws.amazon.com/scheduler/latest/APIReference/Welcome.html)
+ [EventBridge 排程器定價](https://aws.amazon.com/eventbridge/pricing/#Scheduler)