Amazon Simple Queue Service(Amazon SQS) 대기열에 메시지를 전송하기 위해 AWS Glue 추출, 변환 및 로드(ETL) 작업을 생성했습니다. 하지만 Amazon SQS 대기열은 다른 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 작업을 생성하려면 다음 단계를 완료하세요.
- 다음 액세스 정책을 사용하여 계정 B에 ](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/creating-sqs-standard-queues.html)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 사용자 이름으로
계정 A의 AWS Glue Spark 작업에 연결된 IAM 역할이 포함된 GlueSparkJobIAMRole
계정 B가 생성한 대기열 이름이 포함된 test-queue
- 계정 A에서 AWS Glue ETL 작업을 생성합니다. Configure the job properties 페이지에서 직접 작성할 새 스크립트를 선택합니다. 자세한 내용은 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 포함
Amazon SQS 대기열 이름이 포함된 glue-queue
AWS Glue 작업이 Amazon SQS 대기열로 전송할 메시지가 포함된 예제 메시지
사용자 고유의 키 및 값이 포함된 MessageAttributes 키와 값
- 계정 A의 AWS Glue Spark 작업에 연결된 AWS IAM 역할을 식별하세요. 그런 다음 Amazon SQS에 필요한 권한을 해당 역할에 부여하세요. 예를 들어, AWS 관리형 정책 AmazonSQSFullAccess를 이 AWS IAM 역할에 연결합니다. 자세한 내용은 AWS Glue에 대한 IAM 권한 설정을 참조하세요.
- 계정 A에서 생성한 AWS Glue ETL 작업을 실행합니다.
- 작업이 완료되었는지 확인하려면 해당 작업이 계정 B의 Amazon SQS 대기열로 메시지를 전송했는지 확인합니다.
- 계정 B의 Amazon SQS 대기열에 있는 메시지를 수신하려면 대기열에 있는 메시지를 폴링하십시오. 자세한 내용은 Receiving and deleting a message in Amazon SQS를 참조하십시오.
- 대기열에 있는 계정 A에서 보낸 메시지를 볼 수 있는지 확인합니다.
관련 정보
Amazon SQS 큐