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 キューの管理 (コンソール)」