

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

# 向 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)。