クロスアカウントの Amazon SQS エンドポイントを Amazon SNS トピックに設定するにはどうすればよいですか?

所要時間3分
0

アカウント A に Amazon Simple Queue Service (Amazon SQS) のキューがあります。このキューをアカウント B の Amazon Simple Notification Service (Amazon SNS) のトピックにサブスクライブしたいと考えています。

簡単な説明

Amazon SNS トピックから、トピック所有者としてサブスクリプションを作成します。または、Amazon SQS キューからキュー所有者としてサブスクリプションを作成します。サブスクリプションを正常に作成するには、どちらの方法であっても、適切な権限が必要です。

解決方法

重要: キュー所有者として登録するには、アカウント B の SNS トピックのアクセスポリシーに適切な権限があることを確認してください。これらの権限により、アカウント A の SQS キューを SNS トピックにサブスクライブできます。トピック所有者としてサブスクライブする際は、アカウント A の SQS キューアクセスポリシーに適切な権限があることを確認します。アカウント A には、SNS トピックがサブスクリプション確認 URL を送信できるようにする権限が必要です。

キュー所有者としてサブスクライブする

キュー所有者としてキューをサブスクライブするには、次のタスクを実行してください。

アカウント B の SNS アクセスポリシーを変更する

次の手順を実行します。

  1. アカウント B で Amazon SNS コンソールにログインします。
  2. 適切な AWS リージョンに切り替えます。
  3. **[トピック]**を選択してから、SNS トピックを選択します。
  4. **[編集]**を選択します。
  5. **[アクセスポリシー]**セクションを展開します。
  6. 次のアクセスポリシーをコピーして JSON エディターセクションに貼り付けます。
    {
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "111122223333"
          },
          "Action": "sns:Subscribe",
          "Resource": "arn:aws:sns:Region:account-id:topic-name"
        }
      ]
    }
    注: AWS アカウントと SNS トピック ARN をご自身の値に置き換えてください。
  7. **[保存]**を選択します。

キュー所有者として、以下の手順を実行して、アカウント A の SQS キューをアカウント B の SNS トピックにサブスクライブしてください。

  1. アカウント A で Amazon SQS コンソールにログインします。
  2. 適切なリージョンに切り替えます。
  3. **[キュー]**を選択し、次に SQS キューを選択します。
  4. SNS サブスクリプションセクションで、**[Amazon SNS トピックにサブスクライブ]**を選択します。
  5. **[このキューで使用可能な Amazon SNS トピックを指定]で、ドロップダウンを選択します。次に、[Amazon SNS トピック ARN を入力]**を選択します。
  6. **[Amazon SQS キューに通知を送信できる Amazon SNS トピック]**テキストフィールドで、SNS トピックの ARN を入力します。
  7. **[保存]**を選択します。
  8. アカウント B で Amazon SNS コンソールにログインします。
  9. **[トピック]**を選択してから、SNS トピックを選択します。
  10. アカウント B の SNS トピックのサブスクリプションが確定していることを確認するには、**[サブスクリプション]**セクションを確認します。
    注: サブスクリプションを作成すると、SQS キューアクセスポリシーにステートメントが追加されます。このポリシーでは、SNS トピックがキューにメッセージを送信することが許可されます。ポリシーは以下のようになります。
{
      "Sid": "topic-subscription-arn:aws:sns:Region:account-id:topic-name",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "SQS:SendMessage",
      "Resource": "arn:aws:sqs:Region:account-id:queue-name",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:sns:Region:account-id:topic-name"
        }
      }
    }

トピック所有者としてサブスクライブする

トピック所有者としてキューをサブスクライブするには、次のタスクを実行してください。

アカウント A の SQS キューを変更

次の手順を実行します。

  1. アカウント A で Amazon SQS コンソールにログインします。
  2. 適切なリージョンに切り替えます。
  3. **[キュー]**を選択し、次に SQS キューを選択します。
  4. **[編集]**を選択します。
  5. **[アクセスポリシー]**セクションを展開します。
  6. 次のアクセスポリシーをコピーして JSON エディターに貼り付けます。
    {
          "Sid": "Allow_SNS_topic_in_Account_B_to_Send_Message",
          "Effect": "Allow",
          "Principal": {
            "AWS": "*"
          },
          "Action": "SQS:SendMessage",
          "Resource": "arn:aws:sqs:Region:account-id:queue-name",
          "Condition": {
            "ArnLike": {
              "aws:SourceArn": "arn:aws:sns:Region:account-id:topic-name"
            }
          }
        }
    注: SQS キュー ARN と SNS トピック ARN は自分の値に置き換えてください。

トピック所有者として、次の手順を実行して SQS キューをもう 1 つのアカウントでサブスクライブします。

  1. アカウント B で Amazon SNS コンソールにログインします。
  2. 適切なリージョンに切り替えます。
  3. **[トピック]**を選択してから、SNS トピックを選択します。
  4. **[サブスクリプション][サブスクリプションの作成]**を選択します。
  5. **[プロトコル]ドロップダウンリストを選択し、[Amazon SQS]**を選択します。
  6. 次に、**[サブスクリプションの作成]**を選択します。
  7. サブスクリプションを確定するには、アカウント A で Amazon SQS コンソールにログインします。
  8. **[キュー]**を選択し、サブスクライブされている SQS キューを選択します。
  9. **[メッセージの送受信]**を選択します。
  10. **[メッセージをポーリング]を選択します。Amazon SNS からのメッセージが[メッセージ]**セクションに表示されます。
  11. メッセージ ID を選択します。SubscribeURL の下の、引用符で囲まれた URL をコピーします。
  12. ConfirmSubscriptionResultSubscriptionARN で確認するには、この URL リンクをウェブブラウザに貼り付けて[Enter]キーを押します。
  13. アカウント B で Amazon SNS コンソールにログインします。
  14. **[トピック]**を選択してから、SNS トピックを選択します。
  15. サブスクリプションが確定されていることを確認するには、**[サブスクリプション]の下でサブスクリプションのステータスを確認します。サブスクリプションのステータスが[確認待ち]から[確認済み]**に変わります。

注: サブスクリプションは SNS アカウントによって所有されているため、SQS コンソールにサブスクリプションは表示されません。

トラブルシューティングのヒント

キューの問題をトラブルシューティングするには、ケースに応じて次のタスクを実行してください。

SQS キューが暗号化されている

AWS Key Management Service (AWS KMS) キーで暗号化された SQS キューは、アカウント間のアクセスを制限できます。暗号化されたキューのキーを定義しない場合、キューはデフォルトキーとして AWS KMS キー (SSE-KMS) を使用します。このキーでは、同じアカウントのプリンシパルしかアクセスが許可されません。詳細については、「Amazon SQS での保管時の暗号化」をご覧ください。

SSE-KMS を使用する暗号化されたキューにアクセスするには、カスタマー管理の AWS KMS キーを作成します。次に、SNS サービスが AWS KMS API コールを行うことを許可するアクセス権限をキーポリシーに追加します。

SNS サービスが GenerateDataKeyDecrypt API メソッドを使用できるようにするには、カスタマー管理キーポリシーに次のステートメントを追加します。

{
      "Effect": "Allow",
      "Principal": {
            "Service": "sns.amazonaws.com"
      },
      "Action": [
            "kms:GenerateDataKey*",
            "kms:Decrypt"
      ],
      "Resource": "*"
}

詳細については、「キューのサーバー側の暗号化 (SSE) の設定 (コンソール)」をご覧ください。

Amazon SNS コンソールでサブスクリプションを作成しても、自分のサブスクリプションは SNS コンソールで保留のままである

この問題をトラブルシューティングするには、次の手順を実行してください。

  1. サブスクリプションを削除します。次に、前のステップのステップ 13 から開始します。

  2. AWS コマンドラインインターフェイス (AWS CLI) を使用して SQS キューをポーリングするには、次のコマンドを実行して SubscriptionURL を取得します。

    aws sqs receive-message --queue-url https**:**//sqs.us-east-1.amazonaws.com/80398EXAMPLE/MyQueue --attribute-names All --message-attribute-names All --max-number-of-messages 10

    **注:**AWS CLI のコマンドの実行時にエラーが発生する場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

  3. この URL をコピーしてブラウザに貼り付け、サブスクリプションを確認します。キュー URL は必ず独自のものに置き換えてください。

SNS トピックアクセスポリシーをコピーして貼り付けると、「Couldn't set topic access policy」エラーが表示される

SNS トピックアクセスポリシーをコピーして貼り付けると、次のエラーが表示されます。

「Couldn't set topic access policy.Error code: InvalidParameter - Error message: 属性アクセスポリシーの設定中にエラーが発生しました。Invalid parameter: Policy Error: null」

エラーをトラブルシューティングするには、次の手順を実行してください。

  1. ポリシーの構文が正しいことを確認するには、アクセスポリシーを JSON Validator ツールウェブサイトにコピーアンドペーストします。
  2. アクセスポリシーを見直して、ステートメントが重複していないことを確認してください。最初のステートメント ID の後にカンマがあることを確認してください。

Amazon SNS コンソールで、サブスクリプション ID が「削除済み」と表示される

SNS と SQS のクロスアカウント統合では、サブスクリプションの作成元によってサブスクリプションの所有者が決まります。

サブスクリプションが SQS アカウントから作成された場合、SQS がサブスクリプションの所有者になります。サブスクリプションが SNS アカウントから作成された場合、SNS がサブスクリプションの所有者になります。

サブスクリプションを所有していないアカウントから Unsubscribe API を呼び出すと、サブスクリプションのステータスは削除済みになります。または、コンソールからサブスクリプションを削除しようとした場合も、サブスクリプションのステータスは削除済みになります。SNS トピックサブスクリプションのステータスが削除済みの場合、サブスクリプションを所有するアカウントでは、同じエンドポイントをトピックに再サブスクライブすることができません。

48 時間が経過したら、Amazon SNS は削除済みサブスクリプションをクリアし、サブスクリプションを所有するアカウントで同じエンドポイントをトピックに再サブスクライブできるようになります。

48 時間が経過する前に再サブスクライブするには、SNS トピックを所有する AWS アカウントから Subscribe API を呼び出して、サブスクライブを再作成します。

ベストプラクティス

SQS キューへの SNS サブスクリプションを認証します。この設定では、トピック所有者とサブスクリプション所有者のみが SNS トピックから SQS キューのサブスクライブを解除できます。

関連情報

Amazon SNS メッセージを別のアカウントの Amazon SQS キューに送信する

Amazon Simple Storage Service (Amazon S3) のイベント通知をトピックに発行することを許可する

Amazon SNS トピックにサブスクライバーを追加する際の認証エラーを解決するにはどうすればよいですか?

データキー再利用期間について

AWS公式
AWS公式更新しました 8ヶ月前
コメントはありません

関連するコンテンツ