翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
ステップ 1: エンドポイントで Amazon SNS メッセージを処理する準備が完了していることを確認する
HTTP または HTTPS エンドポイントをトピックにサブスクライブする前に、エンドポイントが Amazon SNS がサブスクリプションの確認および通知メッセージを送信するために使用する HTTP POST リクエストを処理できることを確認する必要があります。通常、これは Amazon SNS からの HTTP リクエストを処理するウェブアプリケーションを作成してデプロイすることを意味します。たとえば、エンドポイントホストが Apache と Tomcat で Linux を実行している場合は、Java サーブレットを使用します。HTTP エンドポイントをサブスクライブする場合、Amazon SNS はサブスクリプションの確認リクエストを送信します。エンドポイントは、サブスクリプションの作成時にこのリクエストを受信して処理する準備が整っている必要があります。Amazon SNS は、その時点でこのリクエストを送信します。Amazon SNS は、サブスクリプションが確認されるまでエンドポイントにメッセージを送信しません。確認後、トピックで公開アクションが実行されると、Amazon SNS はエンドポイントに通知を送信します。
サブスクリプションの確認および通知メッセージを処理するようにエンドポイントを設定するには
-
コードは、Amazon SNS がエンドポイントに送信する HTTP POST リクエストの HTTP ヘッダーを読み取る必要があります。コードはヘッダーフィールド を探します
x-amz-sns-message-type。このフィールドには、Amazon SNS が送信したメッセージのタイプが表示されます。ヘッダーを確認することで、HTTP リクエストの本文を解析せずにメッセージタイプを特定できます。処理する必要がある 2 つのタイプ (SubscriptionConfirmationおよびNotification) があります。UnsubscribeConfirmationメッセージは、サブスクリプションがトピックから削除された場合のみ使用されます。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" } -
コードは、Amazon SNS メッセージを構成する名前と値のペアを読み取る HTTP POST リクエストの本文と content-type text/plain で、JSON ドキュメントを解析する必要があります。制御文字のエスケープ表現を ASCII 文字値に戻す変換 (\n を改行文字に変換するなど) を実行する JSON パーサーを使用します。Jackson JSON プロセッサ
などの既存の JSON パーサーを使用するか、または独自のパーサーを記述できます。件名とメッセージフィールドのテキストを有効な JSON として送信するには、Amazon SNS は一部のコントロール文字を JSON ドキュメントに含めることができるエスケープされた表現に変換する必要があります。POST リクエストの本文で JSON ドキュメントを受け取ったら、エスケープされた文字を元の文字値に戻す必要があります。トピックに発行される元の件名とメッセージの正確な表現が必要な場合は、これを行います。これは、通知の署名を検証する場合に重要です。署名は、署名する文字列の一部として、メッセージと件名を元の形式で使用します。 -
Amazon SNS によって送信された通知、サブスクリプションの確認、またはサブスクリプション解除の確認メッセージの信頼性を確認する必要があります。Amazon SNS メッセージ内の情報を使用して、エンドポイントは署名を再作成できます。その後、署名を Amazon SNS が送信した署名と照合することで、メッセージの内容を確認できます。メッセージの署名の確認の詳細については、「Amazon SNS メッセージの署名を検証する」を参照してください。
-
コードは、ヘッダーフィールド
x-amz-sns-message-typeで指定したタイプに基づいて、HTTP リクエストの本文に含まれている JSON ドキュメントを読み取り、メッセージを処理する必要があります。メッセージの 2 つの主要なタイプを処理するためのガイドラインを以下に示します。- SubscriptionConfirmation
-
SubscribeURLの値を読み取り、その URL にアクセスします。サブスクリプションを確認し、エンドポイントで通知の受信を開始するには、(URL に HTTP GET リクエストを送信するなどして)SubscribeURLURL にアクセスする必要があります。SubscribeURLの例については、前のステップの HTTP リクエストの例を参照してください。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 アクションをSubscriptionConfirmationメッセージの対応する値に設定したTokenとともに使ってサブスクリプションを確認できます。トピックの所有者とサブスクリプションの所有者がエンドポイントのサブスクリプションを解除できるようにするには、 AWS 署名とともにConfirmSubscriptionアクションを呼び出します。 - 通知
-
SubjectおよびMessageの値を読み取り、トピックに発行された通知情報を取得します。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" }
-
エンドポイントが Amazon SNS からの HTTP POST メッセージに適切なステータスコードで応答していることを確認します。接続は約 15 秒でタイムアウトします。エンドポイントが時間内に応答しない場合、Amazon SNS は配信を失敗したと見なします。エンドポイントが 200~4xx の範囲外のステータスコードを返す場合も同様です。
-
コードが Amazon SNS からのメッセージ配信の再試行を処理できることを確認します。Amazon SNS は、エンドポイントから正常な応答を受け取らない場合、そのメッセージの配信をもう一度試みます。これはサブスクリプションの確認メッセージを含むすべてのメッセージに適用されます。デフォルトでは、最初の配信が失敗した場合、Amazon SNS は最大 3 回の再試行を試行し、失敗した試行間の遅延は 20 秒に設定されています。
注記
メッセージリクエストは約 15 秒後にタイムアウトします。したがって、配信の失敗がタイムアウトに起因する場合、Amazon SNS は前回の試行から約 35 秒後に再試行します。エンドポイントに別の配信ポリシーを設定できます。
Amazon SNS は、
x-amz-sns-message-idヘッダーフィールドを使用して、Amazon SNS トピックに発行された各メッセージを識別します。処理されたメッセージの IDs と受信メッセージを比較することで、メッセージが再試行であるかどうかを判断できます。 -
HTTPS エンドポイントをサブスクライブする場合は、エンドポイントに信頼できる認証機関 (CA) からのサーバー証明書があることを確認してください。Amazon SNS は、Amazon SNS によって信頼された CA によって署名されたサーバー証明書がある HTTPS エンドポイントにのみメッセージを送信します。
-
Amazon SNS メッセージを受信するために作成したコードをデプロイします。エンドポイントをサブスクライブするときに、エンドポイントは少なくともサブスクリプションの確認メッセージを受信する準備ができている必要があります。