ステップ 1: エンドポイントで Amazon SNS メッセージを処理する準備が完了していることを確認する - Amazon Simple Notification Service

ステップ 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 は、サブスクリプションを確認すると、サブスクライブしたトピックで発行アクションが実行されたときにエンドポイントに通知を送信します。

サブスクリプションの確認および通知メッセージを処理するようにエンドポイントを設定するには

  1. コードは、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" }
  2. コードは Amazon SNS メッセージを構成する名前と値のペアを読み取る HTTP POST リクエストの本文で JSON ドキュメントを解析する必要があります。制御文字のエスケープ表現を ASCII 文字値に戻す変換 (\n を改行文字に変換するなど) を実行する JSON パーサーを使用します。Jackson JSON プロセッサなどの既存の JSON パーサーを使用するか、または独自のパーサーを記述できます。件名フィールドとメッセージフィールドで有効な JSON としてテキストを送信するためには、Amazon SNS は一部の制御文字を、JSON ドキュメントに含めることができるエスケープ表現に変換する必要があります。エンドポイントに送信される POST リクエストの本文で JSON ドキュメントを受信する場合で、トピックに対して発行された元の件名およびメッセージとまったく同じ表現が必要なときは、エスケープした文字を元の文字値に戻す変換を実行する必要があります。これは、署名では署名対象の文字列の一部としてメッセージと件名が元の形式で使用されるため、通知の署名を確認する場合に重要です。

  3. Amazon SNS によって送信された通知、サブスクリプションの確認、またはサブスクリプション解除の確認メッセージの信頼性を確認する必要があります。エンドポイントは、Amazon SNS メッセージに含まれている情報を使用して署名を再作成し、署名を Amazon SNS がメッセージとともに送信した署名とマッチングすることで、メッセージの内容を確認できるようにします。メッセージの署名の確認の詳細については、「Amazon SNS メッセージの署名を検証する」を参照してください。

  4. コードは、ヘッダーフィールド 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" }
  5. エンドポイントが Amazon SNS からの HTTP POST メッセージに適切なステータスコードで応答することを確認します。接続は 15 秒でタイムアウトします。接続がタイムアウトする前にエンドポイントが応答しない場合、またはエンドポイントが 200~4xx の範囲外のステータスコードを返す場合、Amazon SNS はメッセージの配信に失敗したと見なします。

  6. コードが Amazon SNS からのメッセージ配信の再試行を処理できることを確認します。Amazon SNS は、エンドポイントから正常な応答を受け取らない場合、そのメッセージの配信をもう一度試みます。これはサブスクリプションの確認メッセージを含むすべてのメッセージに適用されます。デフォルトでは、メッセージの最初の配信が失敗した場合、Amazon SNS は試行の失敗の間隔として 20 秒に設定された遅延時間で、最大 3 回再試行を試みます。

    注記

    メッセージのリクエストは 15 秒後にタイムアウトします。つまり、メッセージ配信の失敗がタイムアウトによって起きた場合、Amazon SNS は前回の配信の試行から約 35 秒後に再試行します。エンドポイントに別の配信ポリシーを設定できます。

    つまり、Amazon SNS は、配信 x-amz-sns-message-id ヘッダーフィールドの後でのみ再試行を開始します。受信メッセージとともに処理したメッセージ ID を比較することで、メッセージが再試行であるかどうかを判断することができます。

  7. HTTPS エンドポイントをサブスクライブする場合、エンドポイントに、信頼された認定権限 (CA) からのサーバー証明書があることを確認します。Amazon SNS は、Amazon SNS によって信頼された CA によって署名されたサーバー証明書がある HTTPS エンドポイントにのみメッセージを送信します。

  8. Amazon SNS メッセージを受信するために作成したコードをデプロイします。エンドポイントをサブスクライブするときに、エンドポイントは少なくともサブスクリプションの確認メッセージを受信する準備ができている必要があります。