AWS Glue 작업을 실행하여 다른 리전의 Amazon SQS에 메시지를 전송할 때 발생하는 "지정된 대기열이 존재하지 않거나 액세스 권한이 없습니다.(The specified queue does not exist or you do not have access to it.)" 오류는 어떻게 해결합니까?

최종 업데이트 날짜: 2021년 3월 24일

다른 AWS 계정 및 리전의 Amazon Simple Queue Service(Amazon SQS) 대기열로 메시지를 전송하기 위해 AWS Glue 추출, 변환 및 로드(ETL) 작업을 생성했습니다. 작업을 실행할 때 "지정된 대기열이 존재하지 않거나 액세스 권한이 없습니다.(The specified queue does not exist or you do not have access to it.)"라는 오류가 발생합니다.

간략한 설명

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-east-1의 계정 B의 Amazon SQS로 메시지를 전송하기 위해 us-west-2의 계정 A의 AWS Glue Spark 작업을 생성하려면 다음을 수행합니다.

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 Spark 작업에 연결된 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에서 보낸 메시지를 볼 수 있는지 확인합니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?