AWS Glue ジョブを実行して別のリージョンにある Amazon SQS キューにメッセージを送信するときの「指定されたキューが存在しないかアクセス権がありません」というエラーを解決するにはどうすればよいですか。

所要時間2分
0

AWS Glue の、抽出、変換、ロード (ETL) ジョブを作成し、別の AWS アカウントとリージョンにある Amazon Simple Queue Service (Amazon SQS) キューにメッセージを送信しました。ジョブを実行すると、「指定されたキューが存在しないかアクセス権がありません」というエラーが表示されます。

簡単な説明

Amazon SQS キューが Glue ETL ジョブとは異なるリージョンにあるときは、Amazon SQS キューにメッセージを送信するときに、リージョン情報を渡す必要があります。情報を渡さないと、以下のエラーにより ETL ジョブが失敗します。

ERROR [main] glue.ProcessLauncher (Logging.scala:logError(70)): Exception in User Class: com.amazonaws.services.sqs.model.QueueDoesNotExistException :The specified queue does not exist or you do not have access to it. (Service: AmazonSQS; Status Code: 400; Error Code: AWS.SimpleQueueService.NonExistentQueue; Request ID: 3861e4c0-9b49-5404-a4c6-bcd3ed43fe20)

解決方法

us-west-2 にあるアカウント A に AWS Glue Spark ジョブを作成し、us-east-1 にあるアカウント B の Amazon SQS にメッセージを送信するには、次の手順を実行します。

1.    次のアクセスポリシーを使用してアカウント B に Amazon SQS キューを作成します。このアクセスポリシーは、アカウント A の AWS Glue Spark ジョブにアタッチされる AWS Identity and Access Management (IAM) ロールへのアクセスを提供します。これらの必要なアクセス許可は、アカウント A にある特定の IAM ユーザー (testuser など) に付与することもできます。詳細については「基本的な Amazon SQS ポリシーの例」を参照してください。

{
    "Version": "2008-10-17",
    "Id": "__default_policy_ID",
    "Statement": [
        {
            "Sid": "__owner_statement",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333444:role/GlueSparkJobIAMRole",
                    "arn:aws:iam::111122223333444:user/testuser"
                ]
            },
            "Action": "sqs:SendMessage",
            "Resource": "arn:aws:sqs:us-east-1:5555666677778888:test-queue"
        }
    ]
}

上記のポリシーの次の項目を置き換えます。

  • 111122223333444 を、アカウント A の AWS アカウント ID に置き換える。
  • 5555666677778888 を、アカウント B の AWS アカウント ID に置き換える。
  • testuser を、アカウント A の IAM ユーザーの名前に置き換える。
  • GlueSparkJobIAMRole を、アカウント A の AWS Glue スパークジョブにアタッチされた IAM ロールに置き換える。
  • test-queue を、アカウント B で作成されたキューの名前に置き換える。

2.    アカウント A で AWS Glue ETL ジョブを作成します。詳細については、「AWS Glue でジョブを追加する」を参照してください。[Configure the job properties (ジョブプロパティの設定)] ページで、[A new script to be authored by you (ユーザーが作成する新しいスクリプト)] を選択します。Python スクリプトをジョブに追加し、アカウント B の Amazon SQS キューにメッセージを送信します。

import boto3
sqs = boto3.client('sqs', region_name="us-east-1")
queue_url = 'https://sqs.us-east-1.amazonaws.com/5555666677778888/glue-queue'
response = sqs.send_message(
    QueueUrl=queue_url,
    DelaySeconds=10,
    MessageAttributes={
        'Title': {
            'DataType': 'String',
            'StringValue': 'The Whistler'
        },
        'Author': {
            'DataType': 'String',
            'StringValue': 'John Doe'
        },
        'WeeksOn': {
            'DataType': 'Number',
            'StringValue': '6'
        }
    },
    MessageBody=('Example message'))
print(response['MessageId'])

上記のスクリプトの次の項目を置き換えます。

  • us-east-1 を、Amazon SQS キューが存在するリージョンに置き換える
  • 5555666677778888 を、アカウント B の AWS アカウント ID に置き換える
  • glue-queue を、Amazon SQS キューの名前に置き換える
  • Example message を、SQS キューに送信するメッセージに置き換える。

スクリプト内のメッセージ属性と対応する値を、希望するメッセージ属性および値に置き換えます。

3.    アカウント A の AWS Glue Spark ジョブにアタッチされた AWS Identify Access Management (AWS IAM) ロールを特定します。そのロールに、Amazon SQS に必要なアクセス許可を付与します。簡素化のため、AWS 管理ポリシー AmazonSQSFullAccess をこの AWS IAM ロールにアタッチすることが可能です。詳細については、「AWS Glue の IAM アクセス許可のセットアップ」を参照してください。

4.    アカウント A で作成された AWS Glue ETL ジョブを実行します。

5.    ジョブが、アカウント B の Amazon SQS キューにメッセージを送信していることをチェックし、ジョブが正常に完了したことを確認します。

6.    アカウント B の Amazon SQS キューでメッセージを受信するには、キュー内のメッセージをポーリングします。詳細については、「メッセージの受信と削除 (コンソール)」を参照してください。

7.    キュー内のアカウント A から送信されたメッセージを表示できることを確認します。


関連情報

Amazon SQS キューの管理 (コンソール)

AWS公式
AWS公式更新しました 4年前