Amazon Simple Notification Service
開発者ガイド

受信者が Amazon SQS キューの場合のシステム間メッセージングに Amazon SNS を使用する

Amazon SNS は、Amazon Simple Queue Service (Amazon SQS) と密接に連動します。どちらのサービスも開発者にさまざまなメリットを提供します。Amazon SNS を利用すれば、アプリケーションは「プッシュ」メカニズムを使用して、複数の受信者にタイミングが重要なメッセージを送信することができます。そのため更新を定期的に確認または「ポーリング」する必要性がなくなります。Amazon SQS は、ポーリングモデルを通してメッセージを交換するために分散型アプリケーションによって使用されるメッセージキューサービスであり、このサービスを使用すると、送信および受信コンポーネントを、各コンポーネントを同時に使用できない場合でも、切り離すことができます。—Amazon SNS と Amazon SQS を組み合わせて使用することで、イベントの即時通知を必要とするアプリケーションにメッセージを配信できるだけでなく、他のアプリケーションのメッセージは、後で処理できるように Amazon SQS キューに保持することもできます。

Amazon SQS キューを Amazon SNS トピックにサブスクライブすると、そのトピックにメッセージを発行することができ、Amazon SNS が Amazon SQS メッセージをサブスクライブされたキューに送信します。Amazon SQS メッセージには、トピックに発行されたが件名とメッセージに加え、JSON ドキュメントのメッセージに関するメタデータが含まれます。Amazon SQS メッセージは、以下の JSON ドキュメントと同様になります。

{ "Type" : "Notification", "MessageId" : "63a3f6b6-d533-4a47-aef9-fcf5cf758c76", "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic", "Subject" : "Testing publish to subscribed queues", "Message" : "Hello world!", "Timestamp" : "2012-03-29T05:12:16.901Z", "SignatureVersion" : "1", "Signature" : "EXAMPLEnTrFPa37tnVO0FF9Iau3MGzjlJLRfySEoWz4uZHSj6ycK4ph71Zmdv0NtJ4dC/El9FOGp3VuvchpaTraNHWhhq/OsN1HVz20zxmF9b88R8GtqjfKB5woZZmz87HiM6CYDTo3l7LMwFT4VU7ELtyaBBafhPTg9O5CnKkg=", "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:c7fe3a54-ab0e-4ec2-88e0-db410a0f2bee" }

重要

現在、Amazon SNS は Amazon SQS FIFO キューと互換性がありません。

以下の手順に従う代わりに、Amazon SQS コンソールを使用して Amazon SQS キューを Amazon SNS トピックにサブスクライブすることにより、プロセスを簡素化できます。詳細については、「Amazon SNS トピックへのキューのサブスクライブ」を参照してください。

Amazon SNS トピックから Amazon SQS キューにメッセージを送信できるようにするには、以下の手順を実行します。

別の AWS アカウントにあるキューにメッセージを送信するようにトピックをセットアップする方法については、「別のアカウントの Amazon SQS キューに対する Amazon SNS メッセージの送信」を参照してください。

2 つのキューにメッセージを送信するトピックを作成する AWS CloudFormation テンプレートについては、「AWS CloudFormation テンプレートを使用して Amazon SQS キューにメッセージを送信するトピックを作成する」を参照してください。

ステップ 1: キューとトピックの ARN を取得する

トピックにキューをサブスクライブするときは、キューの ARN のコピーが必要です。同様に、トピックがキューにメッセージを送ることを許可するには、トピックの ARN のコピーが必要です。

キューの ARN を取得するには、Amazon SQS コンソールまたは GetQueueAttributes API アクションを使用できます。

キューの ARN を Amazon SQS コンソールから取得するには

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

  2. ARN を取得するキューのチェックボックスをオンにします。

  3. [Details] タブから、Amazon SNS トピックへのサブスクライブに使用できるように ARN 値をコピーします。

トピックの ARN を取得するには、Amazon SNS コンソール、sns-get-topic-attributes コマンド、または GetQueueAttributes API アクションを使用できます。

トピックの ARN を Amazon SNS コンソールから取得するには

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

  2. ナビゲーションパネルで、ARN を取得するトピックを選択します。

  3. [Topic Details] ペインで、Amazon SNS トピックがキューにメッセージを送信することを許可するために使用できるように、[Topic ARN] の値をコピーします。

ステップ 2: Amazon SQS キューにメッセージを送信するアクセス許可を Amazon SNS トピックに付与する

Amazon SNS トピックがキューにメッセージを送信できるようにするには、Amazon SNS トピックに sqs:SendMessage アクションの実行を許可するようにキューのポリシーを設定する必要があります。

トピックにキューをサブスクライブする前に、トピックとキューが必要です。トピックやキューをまだ作成していない場合は、ここで作成します。詳細については、「トピックの作成」および Amazon Simple Queue Service 開発者ガイド の「キューの作成」を参照してください。

キューにポリシーを設定するには、Amazon SQS コンソールまたは SetQueueAttributes API アクションを使用できます。開始する前に、キューにメッセージを送信できるようにするトピックの ARN があることを確認してください。

Amazon SQS コンソールを使用してキューに SendMessage ポリシーを設定するには

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

  2. ポリシーを設定するキューのチェックボックスをオンにし、[Permissions (アクセス許可)] タブを選択してから、[アクセス許可の追加] を選択します。

  3. [Add a Permission] ダイアログボックスで、[Effect] には [Allow]、[Principal] には [Everybody (*)] を選択し、[Actions] ドロップダウンから [SendMessage] を選択します。

  4. トピックにアクションを許可する条件を追加します。[条件の追加 (オプション)] を選択し、[条件] では [ArnEquals]、[Key (キー)] では [aws:SourceArn] を選択して、[Value (値)] にトピックの ARN を貼り付けます。[条件の追加] を選択します。新しい条件は、ボックスの最下部に表示されます (必要に応じて下方にスクロールして確認します)。

  5. [Add Permission] を選択します。

独自のポリシードキュメントを作成する場合は、次のようなポリシーを作成します。このポリシーは、MyTopic が MyQueue にメッセージを送ることを許可します。

{ "Version": "2012-10-17", "Id": "MyQueuePolicy", "Statement": [{ "Sid":"MySQSPolicy001", "Effect":"Allow", "Principal":"*", "Action":"sqs:SendMessage", "Resource":"arn:aws:sqs:us-east-1:123456789012:MyQueue", "Condition":{ "ArnEquals":{ "aws:SourceArn":"arn:aws:sns:us-east-1:123456789012:MyTopic" } } }] }

ステップ 3: キューを Amazon SNS トピックにサブスクライブする

トピックを介してキューにメッセージを送信するには、キューを Amazon SNS トピックにサブスクライブする必要があります。キューは ARN で指定します。トピックにサブスクライブするには、Amazon SNS コンソール、sns-subscribe CLI コマンド、または Subscribe API アクションを使用できます。開始する前に、サブスクライブするキューの ARN があることを確認してください。

Amazon SNS コンソールを使用してキューをトピックにサブスクライブするには

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

  2. ナビゲーションパネルで、トピックを選択します。

  3. [サブスクリプションの作成] を選択してから、[Protocol (プロトコル)] で [ Amazon SQS] を選択します。トピックがメッセージを送信するキューの ARN を [Endpoint (エンドポイント)] に貼り付け、[サブスクライブ] を選択します。

  4. [Subscription request received! (サブスクリプションリクエストを受け取りました)] メッセージが表示されたら、[Close (閉じる)] を選択します。

    サブスクリプションが確認されると、新しいサブスクリプションの [Subscription ID] にサブスクリプション ID が表示されます。キューの所有者がサブスクリプションを作成する場合、サブスクリプションは自動的に確認され、瞬時にアクティブになります。

    通常は、自分のアカウントの自分のトピックに自分のキューをサブスクライブします。ただし、別のアカウントのキューを自分のトピックにサブスクライブすることもできます。サブスクリプションを作成するユーザーがキューの所有者ではない場合 (たとえば、アカウント A のユーザーがアカウント A のトピックにアカウント B のキューをサブスクライブする場合)、サブスクリプションの確認が必用です。別のアカウントのキューをサブスクライブし、サブスクリプションを確認する方法の詳細については、「別のアカウントの Amazon SQS キューに対する Amazon SNS メッセージの送信」を参照してください。

ステップ 4: 適切なトピックおよびキューアクションに対するアクセス許可をユーザーに付与する

適切なユーザーのみに Amazon SNS トピックへのメッセージの発行および Amazon SQS キューからのメッセージの読み取り/削除を許可するには、AWS Identity and Access Management (IAM) を使用する必要があります。IAM ユーザーのトピックとキューのアクションをコントロールする方法の詳細については、「Controlling User Access to Your AWS Account」、および Amazon Simple Queue Service 開発者ガイド の「AWS アカウントへのユーザーアクセスのコントロール」を参照してください。

トピックまたはキューへのアクセスは、次の 2 つの方法で制御します。

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

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

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

IAM ユーザーまたはグループへのポリシーの追加

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" }] }

IAM ユーザーまたはグループに次のポリシーを追加した場合、ユーザーまたはそのグループのメンバーに、キュー MyQueue1 と MyQueue2 に対して sqs:ReceiveMessage および sqs:DeleteMessage アクションを実行する許可が付与されます。

{ "Version":"2012-10-17", "Statement":[{ "Sid":"AllowReadDeleteMessageOnMyQueue", "Effect":"Allow", "Action":[ "sqs:ReceiveMessage", "sqs:DeleteMessage" ], "Resource":[ "arn:aws:sns:us-east-1:123456789012:MyQueue1", "arn:aws:sns:us-east-1:123456789012:MyQueue2" ] }] }

トピックまたはキューへのポリシーの追加

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

注記

別の 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" }] }

アカウント 123456789012 のキュー MyQueue に以下のポリシーを追加した場合、そのキューで sqs:DeleteMessage および sqs:ReceiveMessage アクションを実行する許可をアカウント 111122223333 に付与したことになります。

{ "Version":"2012-10-17", "Id":"MyQueuePolicy", "Statement":[{ "Sid":"Allow-Processing-Of-Messages-for-Queue", "Effect":"Allow", "Principal":{ "AWS":"111122223333" }, "Action":[ "sqs:DeleteMessage", "sqs:ReceiveMessage" ], "Resource":[ "arn:aws:sns:us-east-1:123456789012:MyQueue" ] }] }

ステップ 5: トピックのキューサブスクリプションをテストする

トピックのキューサブスクリプションは、トピックに発行し、トピックがキューに送信したメッセージを表示することでテストできます。

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

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

  2. ナビゲーションパネルで、トピックを選択し、[トピックに発行] を選択します。

  3. [件名] ボックスに件名 (「Testing publish to queue」など) を入力し、[メッセージ] ボックスに任意のテキスト (「Hello world!」など) を入力して、[メッセージの発行] を選択します。「Your message has been successfully published.」というメッセージが表示されます。

Amazon SQS コンソールを使用してトピックからのメッセージを表示するには

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

  2. トピックにサブスクライブしているキューのチェックボックスをオンにします。

  3. [キュー操作] ドロップダウンリストから、[メッセージの表示/削除] を選択して、[メッセージのポーリングを開始] を選択します。タイプが [Notification] のメッセージが表示されます。

  4. [本文] 列で、[詳細] を選択します。[メッセージ詳細] ボックスに、トピックに発行した件名とメッセージを含む JSON ドキュメントが表示されます。メッセージは、以下の JSON ドキュメントのように見えます。

    { "Type" : "Notification", "MessageId" : "63a3f6b6-d533-4a47-aef9-fcf5cf758c76", "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic", "Subject" : "Testing publish to subscribed queues", "Message" : "Hello world!", "Timestamp" : "2012-03-29T05:12:16.901Z", "SignatureVersion" : "1", "Signature" : "EXAMPLEnTrFPa37tnVO0FF9Iau3MGzjlJLRfySEoWz4uZHSj6ycK4ph71Zmdv0NtJ4dC/El9FOGp3VuvchpaTraNHWhhq/OsN1HVz20zxmF9b88R8GtqjfKB5woZZmz87HiM6CYDTo3l7LMwFT4VU7ELtyaBBafhPTg9O5CnKkg=", "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:c7fe3a54-ab0e-4ec2-88e0-db410a0f2bee" }
  5. [閉じる] を選択します。キューに通知メッセージを送信するトピックへの発行は、正常に終了しました。