翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
ステップ 1: エンドポイントで Amazon SNS メッセージを処理する準備が完了していることを確認する
HTTP または HTTPS エンドポイントをトピックにサブスクライブする前に、Amazon SNS がサブスクライブプションの確認および通知メッセージの送信に使用する HTTP POST のリクエストを処理する能力が HTTP または HTTPS エンドポイントにあることを確認する必要があります。通常、これは Amazon SNS からの HTTP リクエストを処理するウェブアプリケーション (例えば、エンドポイントホストが Apache と Tomcat で Linux を実行している場合は Java servlet) の作成とデプロイを意味します。HTTP エンドポイントをサブスクライブする場合、Amazon SNS はサブスクリプションの確認リクエストを送信します。サブスクリプションを作成するときに、エンドポイントはこのリクエストを受信して処理する準備ができている必要があります。Amazon SNS はこの時点でこのリクエストを送信するためです。Amazon SNS は、サブスクリプションが確認されるまでエンドポイントにメッセージを送信しません。Amazon SNS は、サブスクリプションを確認すると、サブスクライブしたトピックで発行アクションが実行されたときにエンドポイントに通知を送信します。
サブスクリプションの確認および通知メッセージを処理するようにエンドポイントを設定するには
-
コードは、Amazon SNS がエンドポイントに送信する HTTP POST リクエストの HTTP ヘッダーを読み取る必要があります。また、コードは Amazon SNS が送信したメッセージのタイプを示すヘッダーフィールド
x-amz-sns-message-type
を探す必要があります。ヘッダーを確認すると、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 リクエストを送信するなどして)SubscribeURL
URL にアクセスする必要があります。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 秒でタイムアウトします。接続がタイムアウトする前にエンドポイントが応答しない場合、またはエンドポイントが 200~4xx の範囲外のステータスコードを返す場合、Amazon SNS はメッセージの配信に失敗したとみなします。
-
コードが Amazon SNS からのメッセージ配信の再試行を処理できることを確認します。Amazon SNS は、エンドポイントから正常な応答を受け取らない場合、そのメッセージの配信をもう一度試みます。これはサブスクリプションの確認メッセージを含むすべてのメッセージに適用されます。デフォルトでは、メッセージの最初の配信が失敗した場合、Amazon SNS は試行の失敗の間隔として 20 秒に設定された遅延時間で、最大 3 回再試行を試みます。
注記
メッセージのリクエストは約 15 秒後にタイムアウトします。つまり、メッセージ配信の失敗がタイムアウトによって起きた場合、Amazon SNS は前回の配信の試行から約 35 秒後に再試行します。エンドポイントに別の配信ポリシーを設定できます。
Amazon SNS は
x-amz-sns-message-id
ヘッダーフィールドを使用して、Amazon SNS トピックにパブリッシュされた各メッセージを一意に識別します。受信メッセージとともに処理したメッセージ ID を比較することで、メッセージが再試行であるかどうかを判断することができます。 -
HTTPS エンドポイントをサブスクライブする場合、エンドポイントに、信頼された認定権限 (CA) からのサーバー証明書があることを確認します。Amazon SNS は、Amazon SNS によって信頼された CA によって署名されたサーバー証明書がある HTTPS エンドポイントにのみメッセージを送信します。
-
Amazon SNS メッセージを受信するために作成したコードをデプロイします。エンドポイントをサブスクライブするときに、エンドポイントは少なくともサブスクリプションの確認メッセージを受信する準備ができている必要があります。