步驟 1:確保您的端點已準備好處理 Amazon SNS 訊息 - Amazon Simple Notification Service

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

步驟 1:確保您的端點已準備好處理 Amazon SNS 訊息

將 HTTP或 HTTPS 端點訂閱主題之前,您必須確定 HTTP或 HTTPS端點能夠處理 Amazon SNS 用來傳送訂閱確認和通知訊息的HTTPPOST請求。通常,這表示建立和部署 Web 應用程式 (例如,如果您的端點主機正在執行 Linux 搭配 Apache 和 Tomcat),以處理來自 Amazon 的HTTP請求SNS。當您訂閱HTTP端點時,Amazon SNS會傳送訂閱確認請求。建立訂閱時,您的端點必須準備好接收和處理此請求,因為 Amazon 會在當時SNS傳送此請求。在您確認訂閱之前,Amazon SNS不會傳送通知至端點。確認訂閱後,Amazon SNS會在訂閱主題上執行發佈動作時,傳送通知至端點。

設定您的端點以處理訂閱確認和通知訊息
  1. 您的程式碼應該會讀取 Amazon SNS傳送至端點之HTTPPOST請求的HTTP標頭。您的程式碼應該尋找標頭欄位 x-amz-sns-message-type,該欄位會告訴您 Amazon SNS傳送給您的訊息類型。透過查看標頭,您可以判斷訊息類型,而不必剖析HTTP請求的內文。有兩種類型您需要處理:SubscriptionConfirmationNotificationUnsubscribeConfirmation 訊息唯有從主題刪除訂閱時才使用。

    如需 HTTP 標頭的詳細資訊,請參閱 HTTP/HTTPS 標頭。下列HTTPPOST請求是訂閱確認訊息的範例。

    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. 您的程式碼應該剖析HTTPPOST請求內文中的JSON文件,以及內容類型文字/純文字,以讀取構成 Amazon SNS 訊息的名稱值對。使用JSON剖析器來處理將控制項字元的逸出表示法轉換回其ASCII字元值 (例如,將 \n 轉換為新行字元)。您可以使用現有的JSON剖析器,例如 Jackson JSON 處理器或自行撰寫。為了將主旨和訊息欄位中的文字作為有效的 傳送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(例如,透過傳送HTTPGET請求至 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訊息中的對應值。如果您想要僅允許主題擁有者和訂閱擁有者可以取消訂閱端點,您使用 AWS 簽章呼叫 ConfirmSubscription 動作。

    Notification

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

    如需有關 Notification 訊息之格式的詳細資訊,請參閱 HTTP/HTTPS 標頭。下列HTTPPOST請求是傳送至端點 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. 請確定您的端點SNS使用適當的狀態碼回應來自 Amazon HTTPPOST的訊息。連線將在大約 15 秒內逾時。如果您的端點未在連線逾時之前回應,或您的端點傳回 200–4xx 範圍以外的狀態碼,Amazon SNS會將訊息交付視為失敗嘗試。

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

    注意

    訊息請求會在大約 15 秒後逾時。這表示,如果訊息傳遞失敗是由於逾時所造成,Amazon SNS 會在上一次傳遞嘗試後重試約 35 秒。您可以為端點設定不同的傳遞政策。

    Amazon SNS使用x-amz-sns-message-id標頭欄位,以唯一方式識別發佈至 Amazon SNS主題的每個訊息。透過將您處理IDs的訊息與傳入訊息進行比較,您可以判斷訊息是否為重試嘗試。

  7. 如果您要訂閱HTTPS端點,請確定您的端點具有來自信任憑證授權單位 (CA) 的伺服器憑證。Amazon SNS只會將訊息傳送至具有由 Amazon 信任的 CA 簽署之伺服器憑證的HTTPS端點SNS。

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