「AWS Glue ジョブを作成したのとは異なるリージョンにある Amazon SQS にメッセージを送信する AWS Glue ジョブを実行した場合に表示される、「The specified queue does not exist or you do not have access to it」というエラーを解決するには、どうすればよいですか?

所要時間2分
0

Amazon Simple Queue Service (Amazon SQS) のキューにメッセージを送信するために、AWS Glue の抽出、変換、ロード (ETL) ジョブを作成しました。しかし、その Amazon SQS のキューは、AWS Glue ジョブを作成したのとは異なる AWS リージョンの (別の) AWS アカウントにあります。ジョブを実行すると、「The specified queue does not exist or you do not have access to it」というエラーが表示されます。

簡単な説明

Amazon SQS のキューが AWS Glue ジョブを作成するのとは異なる AWS リージョンにある場合、キューへのメッセージにはリージョン情報を含めておく必要があります。リージョン情報をメッセージに入れて渡さないと、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)

解決策

あなたが、AWS リージョン us-west-2 にはアカウント A という名前の AWS アカウントを持っている一方で、リージョン us-east-1 にはアカウント B という別のアカウントを持っているとします。アカウント A で、アカウント B の Amazon SQS にメッセージを送信する AWS Glue Spark ジョブを作成するために実行する手順は、次のとおりです。

  1. アカウント B で、次のアクセスポリシーを持つ Amazon SQS のキューを作成します。このアクセスポリシーは、アカウント A が AWS Glue Spark ジョブに関連付けた AWS Identity and Access Management (IAM) ロールにアクセスを許可します。これら必要なアクセス許可を、アカウント A で特定の IAM ユーザー (例: testuser) に付与することもできます。詳細については、「Basic examples of Amazon SQS policies」を参照してください。
    {
      "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 Spark ジョブに関連付けられている IAM ロールに置き換える
    test-queueアカウント B が作成したキューの名前に置き換える
  2. アカウント A で AWS Glue ETL ジョブを作成します。[ジョブプロパティの設定] ページで、[ユーザーが作成する新しいスクリプト] を選択します。詳細については、「Configuring job properties for Spark jobs in AWS Glue」を参照してください。
    アカウント B の Amazon SQS のキューにメッセージを送信するため、次の Python スクリプトをジョブに含めます。
    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'])
    注: 上記のスクリプトで以下の置き換えを行ってください。
    5555666677778888アカウント B の AWS アカウント ID に置き換える
    glue-queue を Amazon SQS のキューの名前に置き換える
    Example message を AWS Glue ジョブが Amazon SQS のキューに送信するメッセージに置き換える
    MessageAttributes のキーと値を自身のキーと値に置き換える
  3. アカウント A の AWS Glue Spark ジョブに関連付けられている AWS IAM ロールを確認します。次に、Amazon SQS に必要なアクセス許可をそのロールに付与します。例えば、AWS マネージドポリシー ** AmazonSQSFullAccess ** をこの AWS IAM ロールに関連付けます。詳細については、「Setting up IAM permissions for AWS Glue」を参照してください。
  4. アカウント A で作成した AWS Glue ETL ジョブを実行します。
  5. ジョブが完了したことを確認するには、ジョブによってメッセージがアカウント B の Amazon SQS のキューに送信されたことを確認します。
  6. アカウント B の Amazon SQS のキューにある当該のメッセージを表示するには、まず、キュー内にそのメッセージがあるかポーリングします。詳細については、「Receiving and deleting a message in Amazon SQS」を参照してください。
  7. アカウント A からキューに送信されたメッセージを表示できることを確認します。

関連情報

Managing an Amazon SQS queue

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

関連するコンテンツ