REST API를 Amazon SQS와 통합하고 일반적인 오류를 해결하려면 어떻게 해야 하나요?
Amazon API Gateway REST API를 Amazon Simple Queue Service(Amazon SQS)와 통합하고자 하는데 통합 오류를 해결하고 싶습니다.
해결 방법
통합 솔루션을 생성하려면 Amazon SQS와 함께 작동하도록 API Gateway REST API를 구성하세요.
REST API와 Amazon SQS 통합 설정
다음 단계를 완료합니다.
- SQS 대기열을 생성합니다.
- AWS Identity and Access Management(AWS IAM) 역할을 생성하고 SendMessage 권한과 함께 Amazon SQS 정책을 연결합니다. 정책을 통해 API에서 Amazon SQS로 메시지를 게시할 수 있습니다.
참고: example-region을 내 AWS 리전으로 바꾸고, example-account-id를 내 AWS 계정 ID로, example-sqs-queue-name을 내 SQS 대기열 이름으로 바꾸세요.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": [ "arn:aws:sqs:example-region:example-account-id:example-sqs-queue-name" ], "Action": [ "sqs:SendMessage" ] } ] }
- API Gateway에서 REST API를 생성합니다.
- API Gateway 콘솔에서 REST API용 Amazon SQS 통합을 생성합니다.
- (선택 사항) REST API 리소스 또는 REST API 메서드 생성합니다.
리소스 화면에서 메서드 생성을 선택합니다.
메서드 유형에서 POST를 선택합니다.
통합 ** 유형에서 ** AWS 서비스를 선택합니다.
AWS 리전에서 내 리전을 선택합니다.
AWS 서비스에서 **Simple Queue Service(SQS)**를 선택합니다.
(선택 사항) AWS 하위 도메인의 경우 AWS 서비스에서 사용하는 하위 도메인을 입력합니다. 하위 도메인의 가용성을 확인하려면 AWS 서비스 문서를 참고하세요. Amazon SQS 예제 설정 필드는 비워 두세요.
HTTP 메서드에서 POST를 선택합니다.
작업 유형에서 경로 재정의 사용을 선택합니다.
**경로 재정의(선택 사항)**에 내 계정 ID와 SQS 대기열 이름을 example-account-id/example-sqs-queue-name 형식으로 입력하세요. 다음 예시를 참고하세요. 1234567890/MySQSStandardQueue.
실행 역할에는 IAM 역할의 ARN을 입력합니다.
기본 시간 초과에서 설정 옵션을 선택합니다.
계속해서 REST API 통합 정보를 입력하세요.
POST 메서드 통합 요청을 선택하세요.
편집을 선택합니다.
본문 패스스루 요청에는 요구 사항에 맞는 옵션을 선택합니다.
URL 요청 헤더 파라미터를 확장합니다.
요청 헤더 파라미터 추가를 선택합니다.
이름에 Content-Type을 입력합니다.
매핑 출처에는 **'application/x-www-form-urlencoded'**을 입력합니다.
매핑 템플릿을 확장하세요.
매핑 템플릿 추가를 선택하세요.
Content-Type에 application/json을 입력하세요.
템플릿에는 Action=SendMessage&MessageBody=$input.body를 입력하고 저장을 선택하세요. - REST API 배포
- 설정을 테스트하려면 다음 요청을 API Gateway에 전송하세요.
참고: example-api-id를 내 API ID로, example-region을 내 리전으로, example-stage를 내 테스팅 단계 이름으로, example-resource를 내 리소스 이름으로 바꾸세요.curl --location --request POST 'https://example-api-id.execute-api.example-region.amazonaws.com/example-stage/example-resource' --header 'Content-Type: application/json' --data-raw '{ "message": "Hello World" }'
통합이 성공하면 다음과 비슷한 응답이 표시됩니다.{ "SendMessageResponse": { "ResponseMetadata": { "RequestId": "f879fb11-e736-52c0-bd29-a0f2d09ad90d" }, "SendMessageResult": { "MD5OfMessageAttributes": null, "MD5OfMessageBody": "3fc759ac1733366f98ec4270c788fcd1", "MD5OfMessageSystemAttributes": null, "MessageId": "4c360c3c-08f4-4392-bc14-8b0c88e314a2", "SequenceNumber": null } } }
일반적인 오류 해결
일반적인 오류를 해결하려면 수신한 오류 메시지에 따라 작업을 완료하세요.
UnknownOperationException error
통합 요청 HTTP 헤더에서 Content-Type을 **"application/x-www-form-urlencoded"**로 구성하지 않으면 UnknownOperationException 오류가 발생합니다. 요청 매핑 템플릿에 SendMessage 작업을 추가하지 않은 경우에도 UnknownOperationException 오류가 발생합니다. 이 오류를 해결하려면 Content-Type 형식이 올바른지 확인하고 매핑 템플릿에 SendMessage 작업을 포함해야 합니다.
AccessDenied error
다음은 AccessDenied 오류 예시입니다.
{
"Error": {
"Code": "AccessDenied",
"Message": "Access to the resource https://sqs.example-region.amazonaws.com/example-account-id/example-sqs-queue-name is denied.",
"Type": "Sender"
},
"RequestId": "92aea8b7-47f1-5bd4-b3c4-f3d0688d3809" }
API 통합 실행 역할에 SQS 대기열에 메시지를 전송할 수 있는 sqs:SendMessage 권한이 설정되지 않으면 AccessDenied 오류가 발생합니다. 요청 본문 페이로드에 "&" 및 "%"와 같은 특수 문자를 전달하는 경우에도 AccessDenied 오류가 발생할 수 있습니다. 전달하려면 특수 문자를 인코딩해야 합니다. 매핑 템플릿에 $util.urlEncode() 함수를 추가해 요청 본문을 문자열에서 인코딩된 형식으로 변환합니다. 다음은 매핑 템플릿 예제입니다.
Action=SendMessage&MessageBody=$util.urlEncode($input.body)
다음 예시에 SQS 대기열에 메시지를 보내는 데 필요한 권한이 포함되어 있습니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": [ "arn:aws:sqs:example-region:example-account-id:example-sqs-queue-name" ], "Action": [ "sqs:SendMessage" ] } ] }
참고: example-region을 내 리전으로, example-account-id를 내 계정 ID로, example-sqs-queue-name을 SQS 대기열 이름으로 바꾸세요.
KMS.AccessDeniedException error
다음은 KMS.AccessDeniedException 오류의 두 가지 예시입니다.
{
"Error": {
"Code": "KMS.AccessDeniedException",
"Message": "User: arn:aws:sts::example-account-number:assumed-role/example-sqs-queue-name/BackplaneAssumeRoleSession is not authorized to perform: kms:GenerateDataKey on resource: arn:aws:kms:example-region:example-account-number:key/example-keyId because no identity-based policy allows the kms:GenerateDataKey action (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: c58f1eec-6b18-4029-826b-d05d6a715716;
Proxy: null)",
"Type": "Sender"
},
"RequestId": "99976a6a-3311-57e9-86e9-310d0654ff80"
}
{
"Error": {
"Code": "KMS.AccessDeniedException",
"Message": "The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access. (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: a8adea02-c246-49d9-8b3d-ff6b6a43b40f;
Proxy: null)",
"Type": "Sender"
},
"RequestId": "9565c451-742c-55f3-a1eb-9f3641fd30aa"
}
API 통합 실행 역할이 AWS Key Management Service(AWS KMS)를 통해 작업을 할 수 없을 때 KMS.AccessDeniedException 오류가 발생합니다. Amazon SQS 서버 측 암호화된 대기열에 연결된 AWS KMS 키에 작업을 실행할 수 있는 권한을 구성해야 합니다.
SQS 대기열에 연결된 KMS 키에 작업을 실행하는 데 필요한 권한이 다음 예시에 포함되어 있습니다.
{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::example-account-id:role/example-api-gw-integration-execution-role" }, "Action": [ "kms:Encrypt", "kms:GenerateDataKey*", "kms:Decrypt" ], "Resource": "*" }
참고: example-account-id를 내 계정 ID로 바꾸고, example-api-gw-integration-execution-role을 내 실행 역할로 바꾸세요.
관련 정보
관련 콘텐츠
- 질문됨 2년 전lg...
- 질문됨 일 년 전lg...
- AWS 공식업데이트됨 13일 전
- AWS 공식업데이트됨 3년 전