CloudFormation 템플릿 또는 OpenAPI 정의를 사용하여 Lambda가 통합된 REST API를 생성한 후, API Gateway에서 “Execution failed due to configuration” 오류가 발생하는 이유는 무엇입니까?

최종 업데이트 날짜: 2022년 5월 4일

AWS CloudFormation 템플릿(또는 OpenAPI 정의)을 사용하여 AWS Lambda가 통합된 Amazon API Gateway REST API를 생성했습니다. API 메서드를 사용하여 Lambda 함수를 호출하려고 하면 "Execution failed due to configuration error." 오류 메시지와 상태 코드 500이 표시됩니다. 오류의 원인은 무엇이며 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

Lambda가 통합된 API Gateway REST API가 있는 경우 API는 HTTP 메서드 POST를 사용하여 백엔드 Lambda 함수를 호출해야 합니다. 백엔드 통합을 요청하는 데 다른 HTTP 메서드(예: ANY 또는 GET)를 사용하는 경우 호출에 실패합니다. 그러면 API Gateway가 Amazon CloudWatch Logs에서 다음 예와 유사한 오류 메시지를 반환합니다.

Mon Oct 14 14:08:49 UTC 2019 : Received response. Status: 403, Integration latency: 3 ms
Mon Oct 14 14:08:49 UTC 2019 : Endpoint response headers: {Date=Mon, 14 Oct 2019 14:08:49 GMT, Content-Length=130, Connection=keep-alive, x-amzn-RequestId=abc1d2ef-34ab-56c7-de8f-90123a456789}
Mon Oct 14 14:08:49 UTC 2019 : Endpoint response body before transformations: <AccessDeniedException>
<Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>
Mon Oct 14 14:08:49 UTC 2019 : Lambda invocation failed with status: 403. Lambda request id: abc1d2ef-34ab-56c7-de8f-90123a456789
Mon Oct 14 14:08:49 UTC 2019 : Execution failed due to configuration error:
Mon Oct 14 14:08:49 UTC 2019 : Method completed with status: 500

참고: REST API의 프런트엔드에 대해 계속 모든 HTTP 메서드를 설정할 수 있습니다.

다음 중 하나를 사용하여 Lambda가 통합된 REST API를 생성하는 경우, 백엔드 통합 요청에 대한 POST 메서드를 지정해야 합니다.

참고: API Gateway 콘솔을 사용하여 Lambda 통합을 구성하는 경우, 백엔드 통합 요청이 POST로 자동 설정됩니다.

해결 방법

CloudFormation 모범 사례는 AWS CloudFormation을 통해 모든 스택 리소스를 관리하고 CloudFormation 외부에서 스택 리소스를 변경하지 않는 것입니다.

백엔드 통합 요청에 대해 HTTP 메서드를 POST로 변경하는 데 사용되는 메서드는 원래 템플릿 정의에 따라 다릅니다. 예를 들어 CloudFormation을 사용하여 배포된 API Gateway를 업데이트하는 프로세스와 OpenAPI 또는 AWS CLI로 생성된 API Gateway를 업데이트하는 프로세스가 다릅니다.

CloudFormation을 사용하여 생성된 API Gateway에 대해 통합의 요청 메서드를 POST로 변경하려면

자세한 지침은 스택 템플릿 수정을 참조하세요.

A. CloudFormation 템플릿에서 AWS::ApiGateway::Method 리소스를 정의하여 메서드를 생성한 경우, HttpMethod 속성을 POST로 업데이트합니다. 지침은 AWS::ApiGateway::Method 설명서의 예제(Examples) 섹션을 참조하세요.

B. 메서드에 AWS::ApiGateway::RestAPI 리소스의 Body 속성 값으로 OpenAPI 정의가 포함된 경우, API 정의 파일의 httpMethod 속성 값을 POST로 설정합니다.  자세한 지침은 aws-samples GitHub 리포지토리의 x-amazon-apigateway-integration Object예제 Swagger 템플릿을 참조하세요.

편집된 템플릿으로 AWS CloudFormation 스택 업데이트를 실행하여 API를 업데이트합니다.

"x-amazon-apigateway-integration" : {
    "type" : "aws",

    "httpMethod" : "POST"

CloudFormation 외부에서 생성된 API Gateway에 대해 백엔드 통합의 HTTP 메서드를 POST로 변경하려면

콘솔을 사용하여 메서드 업데이트

  1. API Gateway 콘솔에서 API를 선택합니다.
  2. 리소스 창에서 Lambda가 통합된 HTTP 메서드를 선택합니다.
  3. 메서드 실행(Method Execution) 창에서 통합 요청(Integration Request)을 선택합니다.
  4. 통합 요청(Integration Request) 창에서 HTTP 메서드에 대해 함수 이름 오른쪽의 연필 아이콘을 클릭하여 Lambda 함수 이름을 편집한 다음 오른쪽에 나타나는 확인 표시 아이콘을 클릭합니다.
  5. Lambda 함수에 권한 추가(Add Permission to Lambda Function) 프롬프트에서 확인(OK)을 선택합니다.
  6. API를 배포합니다.
  7. (선택 사항) Lambda가 통합된 HTTP 메서드를 테스트합니다.

참고: 콘솔은 Lambda 함수에 권한 추가(Add Permission to Lambda Function) 프롬프트에서 확인(OK)이 선택될 때마다 Lambda 함수의 리소스 정책에 새 문을 추가합니다. 함수의 리소스 정책 크기를 확인하여 이 크기가 리소스 정책 크기 제한에 도달하지 않는지 확인합니다. 참조: 함수 구성, 배포 및 실행.

자세한 내용은 API Gateway 시작하기API Gateway 콘솔을 사용하여 API 통합 요청 설정을 참조하세요.

AWS CLI를 사용하여 메서드 업데이트

  1. put-integration 메서드를 실행하여 통합 http 메서드를 POST로 업데이트합니다.
aws apigateway put-integration \
--rest-api-id 1234123412 \
--resource-id a1b2c3 \
--http-method ANY \
--type AWS \
--integration-http-method POST \
--uri 'arn:aws:apigateway:us-west-2:lambda:path//2015-03-31/functions/arn:aws:lambda:us-east-1:123412341234:function:function_name/invocations

2. API에 대해 구성된 리소스를 기존 단계에 배포합니다.

aws apigateway create-deployment \
--rest-api-id 1234123412 \
--stage-name dev \
--description 'Deployment to an existing dev stage'

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우, 최신 버전의 AWS CLI를 사용하고 있는지 확인합니다.

OpenAPI 정의 가져오기를 사용하여 메서드 업데이트

  1. API 정의 파일의 httpMethod 속성 값을 POST로 설정합니다. 자세한 지침은 aws-samples GitHub 리포지토리의 x-amazon-apigateway-integration Object예제 Swagger 템플릿을 참조하세요.
  2. API Gateway로 편집된 API 정의 파일을 가져와 API를 업데이트합니다. 기존 API 정의 업데이트를 위해 OpenAPI 파일 가져오기를 참조하세요.