사용자 지정 Lambda 통합을 사용하여 API Gateway를 통해 Lambda 함수에 사용자 지정 헤더를 전달하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 1월 8일

Amazon API Gateway API를 통해 전달된 메시지의 사용자 지정 헤더를 처리하는 AWS Lambda 함수를 생성하려면 어떻게 해야 합니까?

간략한 설명

기본적으로 Lambda 함수는 API Gateway API에서 수신한 요청 본문만 수집합니다. API Gateway API에서 Lambda 함수로 사용자 지정 헤더를 전달하려면, 메시지에 추가된 사용자 지정 헤더를 추출하기 위해 curl에서 본문 매핑 템플릿을 사용하여 API에 메시지를 전송합니다.

API는 헤더를 처리하기 위해 업데이트된 메시지를 Lambda 함수에 전송하여 원본 메시지에서 하나 이상의 헤더 값을 반환합니다.

해결 방법

IAM 권한 구성

Lambda 및 API Gateway에 필요한 AWS Identity and Access Management(IAM) 권한을 구성합니다. 자세한 내용은 Control Access to an API with IAM Permissions를 참조하십시오.

테스트를 위해 IAM 역할을 생성하고 AWS 관리형 정책 AmazonAPIGatewayInvokeFullAccessAmazonAPIGatewayPushToCloudWatchLogs를 연결합니다.

Lambda 함수 생성

1.    Lambda 콘솔을 엽니다.

2.    Lambda를 처음 사용하는 경우, [Get Started Now]를 선택합니다. 그렇지 않은 경우, [Create function]을 선택합니다. [Create function] 페이지가 열리고 [Author from scratch] 옵션이 표시됩니다.

3.    [Author from scratch]가 선택된 상태로 [Basic information]에서 다음을 수행합니다.
[Function name]에 CustomHeaders와 같은 이름을 입력합니다.
[Runtime]에서 [Node.js 12.x]를 선택합니다.

4.    [Permissions]에서 [Choose or create an execution role]을 확장합니다.

5.    [Use an existing role]을 선택합니다.

6.    [Existing role]에서 앞에서 생성한 실행 역할을 선택합니다.

7.    [Create function]을 선택합니다.

8.    [Configuration] 창의 [Function code]에서 편집기 창(index.js)의 코드를 다음 예제 함수 코드로 교체합니다.

exports.handler = (event, context, callback) => {
// TODO implement
callback(null, "This message header was processed by Amazon " +event.headers["header1"]);
};

9.    [Save]를 선택합니다.

자세한 내용은 Building Lambda Functions with Node.js를 참조하십시오.

API Gateway API 생성

1.    API Gateway 콘솔을 엽니다.

2.    콘솔에 기존 API가 있는 경우 [Create API]를 선택합니다. 그렇지 않은 경우 다음 단계로 진행합니다.

3.    [Choose an API type]의 [REST API]에서 [Build]를 선택합니다.

4.    [Create new API]에서 [New API]를 선택합니다.

5.    [Settings]에서 다음을 수행합니다.
[API name]에 SendtoLambda와 같은 이름을 입력합니다.
(선택 사항) [Description]을 입력합니다.
[Endpoint Type]은 [Regional]으로 둡니다.

6.    [Create API]를 선택합니다.

API 구성

1.    API Gateway 콘솔에서 새 API의 [Resources] 창에 [Actions]를 선택한 다음 [Create Resource]를 선택합니다.

2.    [New Child Resource] 창에서 다음을 수행합니다.
[Resource Name]에 HeadersResource와 같은 이름을 입력합니다.
[Create Resource]를 선택합니다.

3.    [Actions]를 선택한 다음 [Create Method]를 선택합니다.

4.    [/headersresource] 아래의 드롭다운 메뉴에서 [POST]를 선택한 다음 확인 표시 아이콘을 선택합니다.

5.    [/ headersresource - POST - Setup] 창에서 다음을 수행하여 통합 지점을 구성합니다.
[Integration type]에서 [Lambda Function]을 선택합니다.
[Lambda Region]에서 Lambda 함수의 AWS 리전을 선택합니다.
[Lambda Function]에 Lambda 함수의 이름을 입력합니다.
[Save]를 선택합니다.

6.    [Add Permission to Lambda Function] 대화 상자에서 [OK]를 선택합니다.

7.    [/headersresource - POST - Method Execution 창에서 [Integration Request]를 선택합니다.

8.    [/headersresource - POST - Integration Request] 창에서 다음을 수행합니다.
[Mapping Templates]를 확장합니다.
[Request body passthrough]에서 [When there are no templates defined (recommended)]를 선택합니다.
[Add mapping template]을 선택합니다.
[Content-Type]에 application/json을 입력한 다음 확인 표시 아이콘([Create])을 선택합니다.

9.    매핑 템플릿 편집기에 다음을 입력합니다.

{
    "method": "$context.httpMethod",
    "body" : $input.json('$'),
    "headers": {
        #foreach($param in $input.params().header.keySet())
        "$param": "$util.escapeJavaScript($input.params().header.get($param))"
        #if($foreach.hasNext),#end
        #end
    }
}

10.    [Save]를 선택합니다.

API 배포

1.    API Gateway 콘솔에서 API의 [Resources] 창에 [Actions]를 선택한 다음 [Deploy API]를 선택합니다.

2.    [Deploy API] 대화 상자에서 다음을 수행합니다.
[Deployment stage]에서 [New Stage]를 선택합니다.
[Stage name]에 test와 같은 이름을 입력합니다.
(선택 사항) [Stage description] 및 [Deployment description]을 입력합니다.
[Deploy]를 선택합니다.

3.    [Stage Editor] 창에서 [Invoke URL]을 클립보드에 복사합니다. URL은 https://1a2bc3d456.execute-api.region.amazonaws.com/test와 같은 모양을 가지고 있습니다.

API 테스트

curl을 사용하여 API Gateway API에 메시지를 전송합니다. curl에 대한 자세한 내용은 cURL 프로젝트 웹 사이트를 참조하십시오.

팁: Windows에 curl을 설치하려면 GNU Bash 셸과 curl, tail, cat, grep, gzip 및 Perl과 같은 기타 Linux 도구가 포함된 Windows용 Git을 다운로드할 수 있습니다. Windows용 Git을 다운로드하려면 Git 웹 사이트의 Downloads를 참조하십시오. Bash에 대한 자세한 내용은 GNU 웹 사이트의 GNU Bash를 참조하십시오.

이 예제 명령은 Lambda 함수가 참조하는 header1 헤더의 값을 반환합니다.

curl -H "Content-Type: application/json" -H "header1: API Gateway and AWS Lambda" -X POST -d "{\"API_body\": \"This is the body\"}" https://restApiId.execute-api.region.amazonaws.com/stageName/headersresource

참고: 명령의 https://restApiId.execute-api.region.amazonaws.com/stageName을 API의 호출 URL로 바꿉니다.

성공하면 다음과 같은 출력이 표시됩니다.

"This message header was processed by Amazon API Gateway and AWS Lambda"