步驟 1:確保您的端點已就緒可處理 Amazon SNS 訊息 - Amazon Simple Notification Service

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

步驟 1:確保您的端點已就緒可處理 Amazon SNS 訊息

在您訂閱您的 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 訊息內文。有兩種類型您需要處理:SubscriptionConfirmationNotificationUnsubscribeConfirmation訊息唯有從主題刪除訂閱時才使用。

    如需有關 HTTP 標頭的詳細資訊,請參閱 HTTP/HTTPS 標頭。以下 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" }
  2. 您的程式碼應該剖析 HTTP POST 請求內文中的 JSON 文件,以讀取組成 Amazon SNS 訊息的名稱值組。使用 JSON 剖析器,處理將逸出表示法的控制字元轉換回其 ASCII 字元值 (例如,將 \n 轉換為新行字元)。您可以使用現有的 JSON 剖析器,例如 Jackson JSON Processor 或者您自己撰寫。為傳送主旨和訊息欄位中的文字做為有效的 JSON,Amazon SNS 必須轉換一些控制字元為可包含在 JSON 文件中的逸出表示法。當您接收傳送至您端點的 POST 請求內文中的 JSON 文件時,如果您想要確切呈現發佈至主題的原始主旨和訊息,您必須將逸出的字元轉換回其原始字元值。如果您想要驗證通知的簽章,這很重要,因為簽章使用其原始形式的訊息和主旨做為要簽署之字串的一部分。

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

  4. 根據標頭欄位 x-amz-sns-message-type所指定的類型,您的程式碼應該讀取 HTTP 請求內文中所包含的 JSON 文件並處理訊息。以下是處理兩個主要類型的訊息的準則:

    SubscriptionConfirmation

    讀取 SubscribeURL的值並造訪該 URL。若要確認訂閱並開始在端點接收通知,您必須造訪 SubscribeURLURL (例如,透過傳送 HTTP GET 請求至 URL)。請查看上一個步驟中的範例 HTTP 請求,以得知 SubscribeURL看起來像什麼。如需有關 SubscriptionConfirmation訊息之格式的詳細資訊,請參閱HTTP/HTTPS 訂閱確認 JSON 格式。當您造訪 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 動作且 Token 設定為其 SubscriptionConfirmation 訊息中的對應值,來確認訂閱。如果您想要僅允許主題擁有者和訂閱擁有者可以取消訂閱端點,您呼叫ConfirmSubscription動作AWS簽章。

    Notification

    讀取 SubjectMessage 的值來取得已發佈至主題的通知資訊。

    如需有關 Notification訊息之格式的詳細資訊,請參閱HTTP/HTTPS 標頭。以下 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" }
  5. 確保您的端點從具適當狀態碼的對應至 Amazon SNS 的 HTTP POST 訊息。連線將在 15 秒內逾時。如果您的端點在逾時前沒有回應,或者您的端點傳回 200—4 範圍外的狀態碼XX,Amazon SNS 會將訊息傳遞視為失敗的嘗試。

  6. 確保您的程式碼可以處理來自 Amazon SNS 的訊息傳遞重試。如果 Amazon SNS 未從您的端點收到成功回應,它會再次嘗試傳遞訊息。這會套用到所有訊息,包括訂閱確認訊息。根據預設,如果初始的訊息傳遞失敗,Amazon SNS 最多嘗試重試三次,各次失敗的重試之間的延遲設定在 20 秒。

    注意

    訊息請求會在 15 秒後逾時。這表示如果訊息傳遞失敗是因為逾時所導致,Amazon SNS 會在之前的傳遞重試後大約 35 秒進行重試。您可以為端點設定不同的傳遞政策。

    清楚來說,Amazon SNS 僅在傳遞後才會嘗試進行重試x-amz-sns-message-id標題欄位。透過比較您已處理傳入之訊息的 ID,您可以判斷訊息是否為重試的嘗試。

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

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