API Gateway REST API를 Amazon SQS와 통합하고 일반적인 오류를 해결하려면 어떻게 해야 합니까?

4분 분량
0

Amazon API Gateway REST API를 Amazon Simple Queue Service(Amazon SQS)와 통합하고 싶습니다. 또한 통합 오류를 해결하고 싶습니다.

해결 방법

사용자는 통합 솔루션으로서 Amazon SQS와 연동되도록 API Gateway REST API를 구성할 수 있습니다.

REST API와 Amazon SQS의 통합 설정

API Gateway REST API를 Amazon SQS와 통합하려면 다음 단계를 따릅니다.

1.    SQS 대기열을 생성합니다.

2.    AWS Identity and Access Management(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"
      ]
    }
  ]
}

3.    API Gateway에서 REST API를 생성합니다.

4.    API Gateway 콘솔에서 새로 생성한 REST API에 대한 Amazon SQS 통합을 생성합니다.

  • 필요에 따라 REST API 리소스 또는 REST API 메서드를 생성할 수 있습니다.
  • POST 메서드를 생성합니다.
    **Integration type(통합 유형)**에서 **AWS Service(AWS 서비스)**를 선택합니다.
    **AWS Region(AWS 리전)**에서 AWS 리전을 선택합니다.
    AWS 서비스에서 **Simple Queue Service(SQS)**를 선택합니다.
    (선택 사항) AWS Subdomain에 AWS 서비스가 사용하는 하위 도메인을 입력합니다. AWS 서비스 설명서를 확인하여 하위 도메인의 가용성을 확인합니다. Amazon SQS 예제 설정의 경우 이곳을 비워둡니다.
    HTTP 메서드에서 POST를 선택합니다.
    작업 유형에서 경로 재정의 사용을 선택합니다.
    **경로 재정의(선택 사항)**의 경우 계정 ID 및 SQS 대기열 이름을 example-account-id/example-sqs-queue-name 형식으로 입력합니다. 예를 들어 1234567890/MySQSStandardQueue로 바꿀 수 있습니다.
    실행 역할2단계에서 생성한 IAM 역할의 ARN을 입력합니다.
    콘텐츠 처리에서 설정에 맞는 옵션을 선택합니다.
    **Default Timeout(기본 제한 시간)**을 선택 취소하거나 선택합니다. 설정에 맞는 옵션을 선택합니다.
    새 POST 메서드를 저장합니다.
  • REST API 통합 정보를 계속 입력합니다.
    POST 메서드 Integration Request를 선택합니다.
    **HTTP Headers(HTTP 헤더)**를 펼칩니다.
    **Add header(헤더 추가)**를 선택합니다.
    이름Content-Type을 입력합니다.
    매핑 소스에 **'application/x-www-form-urlencoded'**를 입력하고 생성을 선택합니다.
    매핑 템플릿을 펼칩니다.
    **Request body passthrough(요청 본문 패스스루)**에서 요구 사항에 맞는 옵션을 선택합니다.
    매핑 템플릿 추가를 선택합니다.
    콘텐츠 유형application/json을 입력하고 생성를 선택합니다.
    템플릿에 대해 Action=SendMessage&MessageBody=$input.body를 입력합니다.

4.    구성된 REST API를 배포합니다.

5.    API Gateway에 다음 요청을 전송하여 설정을 테스트합니다. example-api-id를 API ID로, example-region을 AWS 리전으로, 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 오류

UnknownOperationException 오류는 사용자가 통합 요청 HTTP 헤더에 Content-Type을 **"application/x-www-form-urlencoded"**로 구성하지 못할 때 발생합니다. SendMessage 작업을 통합 요청 매핑 템플릿에 추가하지 않은 경우에도 UnknownOperationException 오류가 발생합니다.

AccessDenied 오류

다음은 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"
}

AccessDenied 오류는 API 통합 실행 역할에 메시지를 SQS 대기열로 보내도록 설정된 sqs:SendMessage 권한이 없을 때 발생합니다. 요청 본문 페이로드에 ‘&’, ‘%’ 등의 특수 문자가 전달될 경우에도 AccessDenied 오류가 발생할 수 있습니다. 전달하려면 특수 문자를 인코딩해야 합니다. 매핑 템플릿에 $util.urlEncode() 함수를 추가하여 요청 본문을 문자열에서 인코딩된 형식으로 변환합니다. 다음은 예제 매핑 템플릿입니다.

Action=SendMessage&MessageBody=$util.urlEncode($input.body)

다음 예에는 메시지를 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"
      ]
    }
  ]
}

KMS.AccessDeniedException 오류

다음은 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"
}

KMS.AccessDeniedException 오류는 API 통합 실행 역할이 AWS Key Management Service(AWS KMS)를 통해 작업을 수행할 수 없을 때 발생합니다. Amazon SQS 서버 측 암호화 대기열에 연결된 AWS KMS 키에 대한 작업을 수행할 권한을 구성해야 합니다.

다음 예에는 SQS 대기열에 연결된 KMS 키에 대한 작업을 수행하기 위해 반드시 가져야 하는 권한이 포함되어 있습니다. example-account-id를 AWS 계정 ID로, example-api-gw-integration-execution-role을 실행 역할 이름으로 각각 바꿉니다.

{
  "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": "*"
}

AWS 공식
AWS 공식업데이트됨 일 년 전