Amazon Simple Notification Service
開発者ガイド (API バージョン 2010-03-31)

HTTP/HTTPS エンドポイントへの Amazon SNS メッセージの送信

Amazon SNS を使用して、1 つ以上の HTTP または HTTPS エンドポイントに通知メッセージを送信できます。エンドポイントをトピックに受信登録すると、トピックに通知を発行することができます。Amazon SNS は HTTP POST リクエストを送信し、通知の内容を受信登録したエンドポイントに配信します。エンドポイントを受信登録する際は、Amazon SNS が POST リクエストをエンドポイントに送信するときに HTTP を使用するか HTTPS を使用するかを選択します。HTTPS を使用する場合は、以下に対して Amazon SNS のサポートを利用できます。

  • Server Name Indication (SNI) — これにより、Amazon SNS は複数のドメインをホストするために複数の証明書を必要とするサーバーなど、SNI を必要とする HTTPS エンドポイントをサポートすることができます。SNI の詳細については、http://ja.wikipedia.org/wiki/Server_Name_Indication を参照してください。

  • Basic and Digest Access Authentication — これにより、https://user:password@domain.com や https://user@domain.com など、HTTP POST リクエストで HTTPS URL にユーザー名とパスワードを指定することができます。HTTPS を使用する場合、ユーザー名とパスワードは確立された SSL 接続で暗号化されます。ドメイン名のみがプレーンテキストで送信されます。Basic and Digest Access Authentication の詳細については、http://www.rfc-editor.org/info/rfc2617 を参照してください。

リクエストには、JSON ドキュメントの通知に関するメタデータとともに、トピックに発行された件名とメッセージが含まれます。リクエストは以下の HTTP POST リクエストのようになります。HTTP ヘッダーおよびリクエストボディの JSON 形式の詳細については、「HTTP/HTTPS ヘッダー」および「HTTP/HTTPS 通知の JSON 形式」を参照してください。

POST / HTTP/1.1 x-amz-sns-message-type: Notification x-amz-sns-message-id: da41e39f-ea4d-435a-b922-c6aae3915ebe 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:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55 Content-Length: 761 Content-Type: text/plain; charset=UTF-8 Host: ec2-50-17-44-49.compute-1.amazonaws.com Connection: Keep-Alive User-Agent: Amazon Simple Notification Service Agent { "Type" : "Notification", "MessageId" : "da41e39f-ea4d-435a-b922-c6aae3915ebe", "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic", "Subject" : "test", "Message" : "test message", "Timestamp" : "2012-04-25T21:49:25.719Z", "SignatureVersion" : "1", "Signature" : "EXAMPLElDMXvB8r9R83tGoNn0ecwd5UjllzsvSvbItzfaMpN2nk5HVSw7XnOn/49IkxDKz8YrlH2qJXj2iZB0Zo2O71c4qQk1fMUDi3LGpij7RCW7AW9vYYsSqIKRnFS94ilu7NFhUzLiieYr4BKHpdTmdD6c0esKEYBpabxDSc=", "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:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55" }

Amazon SNS トピックが HTTP または HTTPS エンドポイントにメッセージを送信できるようにするには、以下の手順に従います。

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

ステップ 2: Amazon SNS トピックに HTTP/HTTPS エンドポイントを受信登録する

ステップ 3: 受信登録を確認する

ステップ 4: 受信登録の配信再試行ポリシーを設定する (オプション)

ステップ 5: トピックに発行するアクセス許可をユーザーに付与する (オプション)

ステップ 6: HTTP/HTTPS エンドポイントにメッセージを送信する

ステップ 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" : "2336412f37fb687f5d51e6e241d09c805a5a57b30d712f794cc5f6a988666d92768dd60a747ba6f3beb71854e285d6ad02428b09ceece29417f1f02d609c582afbacc99c583a916b9981dd2728f4ae6fdb82efd087cc3b7849e05798d2d2785c03b0879594eeac82c01f235d0e717736", "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=2336412f37fb687f5d51e6e241d09c805a5a57b30d712f794cc5f6a988666d92768dd60a747ba6f3beb71854e285d6ad02428b09ceece29417f1f02d609c582afbacc99c583a916b9981dd2728f4ae6fdb82efd087cc3b7849e05798d2d2785c03b0879594eeac82c01f235d0e717736", "Timestamp" : "2012-04-26T20:45:04.751Z", "SignatureVersion" : "1", "Signature" : "EXAMPLEpH+DcEwjAPg8O9mY8dReBSwksfg2S7WKQcikcNKWLQjwu6A4VbeS0QHVCkhRS7fUQvi2egU3N858fiTDN6bkkOxYDVrY0Ad8L10Hs3zH81mtnPk5uvvolIC1CXGu43obcgFxeL3khZl8IKvO61GWB6jI9b5+gLPoBc1Q=", "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem" }
  2. コードは Amazon SNS メッセージを構成する名前と値のペアを読み取る HTTP POST リクエストの本文で JSON ドキュメントを解析する必要があります。制御文字のエスケープ表現を ASCII 文字値に戻す変換 (\n を改行文字に変換するなど) を実行する JSON パーサーを使用します。Jackson JSON プロセッサ (http://wiki.fasterxml.com/JacksonHome) などの既存の 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" : "EXAMPLEw6JRNwm1LFQL4ICB0bnXrdB8ClRMTQFGBqwLpGbM78tJ4etTwC5zU7O3tS6tGpey3ejedNdOJ+1fkIp9F2/LmNVKb5aFlYq+9rk9ZiPph5YlLmWsDcyC5T+Sy9/umic5S0UQc2PEtgdpVBahwNOdMW4JPwk0kAJJztnc=", "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 エンドポイントのみにメッセージを送信します。信頼された CA のリストについては、「HTTPS エンドポイントについて Amazon SNS で認識される証明機関 (CA)」を参照してください。

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

ステップ 2: Amazon SNS トピックに HTTP/HTTPS エンドポイントを受信登録する

トピックを通じて HTTP または HTTPS エンドポイントにメッセージを送信するには、エンドポイントを Amazon SNS トピックに受信登録する必要があります。エンドポイントを指定するには、その URL を使用します。トピックにサブスクライブするには、Amazon SNS コンソール、sns-subscribe コマンド、または Subscribe API アクションを使用できます。開始する前に、受信登録するエンドポイントの URL があり、ステップ 1 で説明したように、エンドポイントで確認メッセージや通知メッセージを受信する準備ができていることを確認します。

Amazon SNS コンソールを使って HTTP または HTTPS エンドポイントをトピックに受信登録するには

  1. AWS マネジメントコンソールにサインインした後、Amazon SNS コンソール (https://console.aws.amazon.com/sns/v2/home) を開きます。

  2. 左のナビゲーションペインで、[Topics] をクリックし、トピックを選択します。

  3. [Other actions] ドロップダウンリストをクリックし、[Subscribe to topic] を選択します。

  4. [Protocol] ドロップダウンリストで [HTTP] または [HTTPS] を選択します。

  5. [Endpoint] ボックスで、メッセージの送信先となるトピックのエンドポイントの URL を貼り付け、[Create subscription] をクリックします。

  6. [Subscription request received!] というメッセージで、[Close] をクリックします。

    新しい受信登録の [Subscription ID] に、PendingConfirmation と表示されます。受信登録を確認すると、[Subscription ID] に受信登録 ID が表示されます。

ステップ 3: 受信登録を確認する

エンドポイントを受信登録すると、Amazon SNS はエンドポイントに受信登録の確認メッセージを送信します。ステップ 1 で説明しているアクションを実行するコードは、すでにエンドポイントにデプロイしています。具体的には、エンドポイントのコードは、受信登録の確認メッセージから SubscribeURL 値を取得し、SubscribeURL そのもので指定された場所にアクセスするか、この場所を利用可能にして、ユーザーがウェブブラウザを使用するなどして手動で SubscribeURL にアクセスできるようにする必要があります。Amazon SNS は、受信登録が確認されるまでエンドポイントにメッセージを送信しません。SubscribeURL にアクセスすると、応答には受信登録のための ARN を指定する SubscriptionArn 要素を含む XML ドキュメントが含まれます。Amazon SNS コンソールを使用して、受信登録が確認されたことを検証できます。[Subscription ID] には、最初に受信登録を追加したときに表示された PendingConfirmation 値の代わりに、受信登録の ARN が表示されます。

ステップ 4: 受信登録の配信再試行ポリシーを設定する (オプション)

デフォルトでは、メッセージの最初の配信が失敗した場合、Amazon SNS は試行の失敗の間隔として 20 秒に設定された遅延時間で、最大 3 回再試行を試みます。ステップ 1 で説明しているように、エンドポイントには再試行されたメッセージを処理できるコードが必要です。トピックまたは受信登録で配信ポリシーを設定することで、Amazon SNS が失敗したメッセージを再試行する頻度と間隔をコントロールできます。トピックまたは特定の受信登録で配信ポリシーを設定できます。

ステップ 5: トピックに発行するアクセス許可をユーザーに付与する (オプション)

デフォルトでは、トピックの所有者にはトピックを発行するアクセス許可があります。その他のユーザーやアプリケーションがトピックに発行できるようにするには、AWS Identity and Access Management (IAM) を使ってトピックへの発行許可を付与する必要があります。Amazon SNS アクションのアクセス許可の IAM ユーザーへの付与の詳細については、「AWS アカウントへのユーザーアクセスのコントロール」を参照してください。

トピックへのアクセスは、以下の 2 つの方法でコントロールできます。

  • IAM ユーザーまたはグループにポリシーを追加する。トピックへのアクセス許可をユーザーに付与する最も簡単な方法では、グループを作成し、適切なポリシーをグループに追加して、そのグループにユーザーを追加します。個々のユーザーに設定するポリシーを継続的に追跡するよりも、グループに対してユーザーを追加または削除する方がはるかに簡単です。

  • トピックにポリシーを追加する。別の AWS アカウントにトピックへのアクセス許可を追加する場合、そのプリンシパルとして、アクセス許可を付与する AWS アカウントを持っているポリシーを追加することが唯一の方法です。

ほとんどの場合は、最初の方法 (ポリシーをグループに適用し、適切なユーザーをグループに追加または削除することでアクセス許可を管理する) を使用します。別のアカウントのユーザーにアクセス許可を付与する必要がある場合は、2 番目の方法を使用します。

IAM ユーザーまたはグループに次のポリシーを追加した場合、そのユーザーまたはそのグループのメンバーに、MyTopic トピックで sns:Publish アクションを実行する許可が付与されます。

{ "Version":"2012-10-17", "Statement":[{ "Sid":"AllowPublishToMyTopic", "Effect":"Allow", "Action":"sns:Publish", "Resource":"arn:aws:sns:us-east-1:123456789012:MyTopic" } ] }

以下の例のポリシーでは、トピックへのアクセス許可を別のアカウントに付与する方法を示しています。

注記

別の AWS アカウントにアカウントのリソースへのアクセス許可を付与する場合、管理レベルのアクセス (ワイルドカードアクセス) の権限を持っている IAM ユーザーにも、そのリソースへのアクセス許可が付与されます。他の IAM アカウントの他のすべてのユーザーは、自動的にリソースへのアクセスが拒否されます。その AWS アカウントの特定の IAM ユーザーにリソースへのアクセス許可を付与する場合、管理レベルアクセスの権限を持っているアカウントまたは IAM ユーザーは、そのリソースのアクセス許可をそれらの IAM ユーザーに委任する必要があります。クロスアカウントの委任の詳細については、『IAM の使用ガイド』の「クロスアカウントアクセスの有効化」を参照してください。

アカウント 123456789012 の MyTopic トピックに次のポリシーを追加した場合、そのトピックで sns:Publish アクションを実行するアクセス許可をアカウント111122223333 に付与したことになります。

{ "Version":"2012-10-17", "Id":"MyTopicPolicy", "Statement":[{ "Sid":"Allow-publish-to-topic", "Effect":"Allow", "Principal":{ "AWS":"111122223333" }, "Action":"sns:Publish", "Resource":"arn:aws:sns:us-east-1:123456789012:MyTopic" } ] }

ステップ 6: HTTP/HTTPS エンドポイントにメッセージを送信する

トピックに発行することで、トピックの受信登録にメッセージを送信できます。トピックに発行するには、Amazon SNS コンソール、sns-publish コマンド、または Publish API を 使用できます。

ステップ 1 を実行した場合、エンドポイントでデプロイしたコードで通知を処理できます。

Amazon SNS コンソールを使用してトピックに発行するには

  1. トピックに発行するアクセス許可を持っている AWS アカウントまたは IAM ユーザーの認証情報を使用して、AWS マネジメントコンソール にサインインし、Amazon SNS コンソール (https://console.aws.amazon.com/sns/) を開きます。

  2. 左のナビゲーションペインで、[Topics] をクリックし、トピックを選択します。

  3. [Publish to topic] ボタンをクリックします。

  4. [Subject] ボックスに件名 (たとえば、「エンドポイントへの発行のテスト」) を入力します。

  5. [Message] ボックスに任意のテキスト (たとえば、「Hello world!」) を入力して、[Publish message] をクリックします。

    「Your message has been successfully published.」というメッセージが表示されます。