

# 자습서: Lambda 프록시 통합을 통해 REST API 생성
<a name="api-gateway-create-api-as-simple-proxy-for-lambda"></a>

[Lambda 프록시 통합](set-up-lambda-proxy-integrations.md)은 API 메서드나 전체 API를 Lambda 함수와 통합할 수 있는 유연하고 간단한 API Gateway API 통합 유형입니다. Lambda 함수는 [Lambda가 지원하는 어떤 언어](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html)로도 작성할 수 있습니다. 이것은 프록시 통합이기 때문에 API를 다시 배포할 필요 없어 언제든지 Lambda 함수 구현을 변경할 수 있습니다.

이 자습서에서는 다음 작업을 수행합니다.
+ "Hello, World\$1" 만들기 API의 백엔드가 될 Lambda 함수를 만듭니다.
+ "Hello, World\$1" 만들기 및 테스트 Lambda 프록시 통합을 사용하여 API를 만들고 테스트합니다.

**Topics**
+ [

## "Hello, World\$1" 만들기 Lambda 함수
](#api-gateway-proxy-integration-create-lambda-backend)
+ [

## "Hello, World\$1" 만들기 API
](#api-gateway-create-api-as-simple-proxy-for-lambda-build)
+ [

## API 배포 및 테스트
](#api-gateway-create-api-as-simple-proxy-for-lambda-test)

## "Hello, World\$1" 만들기 Lambda 함수
<a name="api-gateway-proxy-integration-create-lambda-backend"></a>

**“Hello, World\$1”를 생성하려면 Lambda 콘솔의 Lambda 함수**

1. [https://console.aws.amazon.com/lambda](https://console.aws.amazon.com/lambda)에서 Lambda 콘솔에 로그인합니다.

1. AWS 탐색 모음에서 [AWS 리전](https://docs.aws.amazon.com/general/latest/gr/apigateway.html)을 선택합니다.
**참고**  
Lambda 함수를 생성한 리전을 적어 둡니다. 이 리전은 API를 생성할 때 필요합니다.

1. 탐색 창에서 **함수**를 선택합니다.

1. **함수 생성**을 선택합니다.

1. **새로 작성**을 선택합니다.

1. **기본 정보**에서 다음과 같이 합니다.

   1. **함수 이름**에 **GetStartedLambdaProxyIntegration**을 입력합니다.

   1. **런타임**에서 지원되는 최신 **Node.js** 또는 **Python** 런타임을 선택합니다.

   1. **아키텍처**의 경우 기본 설정을 유지합니다.

   1. **권한(Permissions)**에서 **기본 실행 역할 변경(Change default execution role)**을 확장합니다. **실행 역할** 드롭다운 목록에서 **AWS 정책 템플릿에서 새 역할 생성**을 선택합니다.

   1. **역할 이름**에 **GetStartedLambdaBasicExecutionRole**을 입력합니다.

   1. [**Policy templates**] 필드를 비워둡니다.

   1. **함수 생성**을 선택합니다.

1. 다음 코드를 복사하여 인라인 코드 편집기의 **함수 코드**에 붙여 넣습니다.

------
#### [ Node.js ]

   ```
   export const handler = async(event, context) => {
       console.log('Received event:', JSON.stringify(event, null, 2));
       var res ={
           "statusCode": 200,
           "headers": {
               "Content-Type": "*/*"
           }
       };
       var greeter = 'World';
       if (event.greeter && event.greeter!=="") {
           greeter =  event.greeter;
       } else if (event.body && event.body !== "") {
           var body = JSON.parse(event.body);
           if (body.greeter && body.greeter !== "") {
               greeter = body.greeter;
           }
       } else if (event.queryStringParameters && event.queryStringParameters.greeter && event.queryStringParameters.greeter !== "") {
           greeter = event.queryStringParameters.greeter;
       } else if (event.multiValueHeaders && event.multiValueHeaders.greeter && event.multiValueHeaders.greeter != "") {
           greeter = event.multiValueHeaders.greeter.join(" and ");
       } else if (event.headers && event.headers.greeter && event.headers.greeter != "") {
           greeter = event.headers.greeter;
       } 
       res.body = "Hello, " + greeter + "!";
       return res
   };
   ```

------
#### [ Python ]

   ```
   import json
   
   
   def lambda_handler(event, context):
       print(event)
   
       greeter = 'World'
   
       try:
           if (event['queryStringParameters']) and (event['queryStringParameters']['greeter']) and (
                   event['queryStringParameters']['greeter'] is not None):
               greeter = event['queryStringParameters']['greeter']
       except KeyError:
           print('No greeter')
   
       try:
           if (event['multiValueHeaders']) and (event['multiValueHeaders']['greeter']) and (
                   event['multiValueHeaders']['greeter'] is not None):
               greeter = " and ".join(event['multiValueHeaders']['greeter'])
       except KeyError:
           print('No greeter')
   
       try:
           if (event['headers']) and (event['headers']['greeter']) and (
                   event['headers']['greeter'] is not None):
               greeter = event['headers']['greeter']
       except KeyError:
           print('No greeter')
   
       if (event['body']) and (event['body'] is not None):
           body = json.loads(event['body'])
           try:
               if (body['greeter']) and (body['greeter'] is not None):
                   greeter = body['greeter']
           except KeyError:
               print('No greeter')
   
       res = {
           "statusCode": 200,
           "headers": {
               "Content-Type": "*/*"
           },
           "body": "Hello, " + greeter + "!"
       }
   
       return res
   ```

------

1. [**Deploy**]를 선택합니다.

## "Hello, World\$1" 만들기 API
<a name="api-gateway-create-api-as-simple-proxy-for-lambda-build"></a>

이제 API Gateway 콘솔을 사용하여 “Hello, World\$1” Lambda 함수에 대한 API를 만듭니다.

**“Hello, World\$1”를 생성하려면 API**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. API Gateway를 처음 사용하는 경우, 서비스의 기능을 소개하는 페이지가 나타납니다. **REST API**에서 **빌드**를 선택합니다. **예제 API 생성** 팝업이 나타나면 **확인**을 선택합니다.

   API Gateway를 처음 사용하는 것이 아닌 경우 **API 생성**을 선택합니다. **REST API**에서 **빌드**를 선택합니다.

1.  **API 이름**에서 **LambdaProxyAPI**을 입력합니다.

1. (선택 사항) **설명**에 설명을 입력합니다.

1. **API 엔드포인트 유형** 설정을 **지역**으로 유지합니다.

1. **IP 주소 유형**에서 **IPv4**를 선택합니다.

1. **API 생성**을 선택합니다.

API를 생성한 후에는 리소스를 생성합니다. 일반적으로 API 리소스는 애플리케이션 로직에 따른 리소스 트리로 정리되어 있습니다. 이 예시에서는 **/helloworld** 리소스를 생성합니다.

**리소스를 생성하려면**

1. **리소스 생성**을 선택합니다.

1. **프록시 리소스**는 꺼진 상태로 둡니다.

1. **리소스 경로**를 `/`로 유지합니다.

1. **리소스 이름**에 **helloworld**을 입력합니다.

1. **오리진 간 리소스 공유(CORS)**를 꺼진 상태로 둡니다.

1. **리소스 생성**을 선택합니다.

 프록시 통합에서는 전체 요청이 HTTP 메서드를 나타내는 catch-all `ANY` 메서드를 통해 백엔드 Lambda 함수로 그대로 전송됩니다. 실제 HTTP 메서드는 실행 시 클라이언트가 지정합니다. `ANY` 메서드를 통해 지원되는 모든 HTTP 메서드인 `DELETE`, `GET`, `HEAD`, `OPTIONS`, `PATCH`, `POST`, `PUT`에 대해 단일 API 메서드 설정을 사용할 수 있습니다.

**`ANY` 메서드를 생성하려면**

1. **/helloworld** 리소스를 선택한 다음 **메서드 생성**을 선택합니다.

1. **메서드 유형**에서 **ANY**를 선택합니다.

1. **통합 유형**에서 **Lambda 함수**를 선택합니다.

1. **Lambda 프록시 통합**을 켭니다.

1. **Lambda 함수**에서 Lambda 함수를 생성한 AWS 리전을 선택하고 함수 이름을 입력합니다.

1. 기본 제한 시간 값인 29초를 사용하려면 **기본 제한 시간**을 활성화된 상태로 유지합니다. 사용자 지정 제한 시간을 설정하려면 **기본 제한 시간**을 선택하고 `50` \$1 `29000`밀리초 사이의 제한 시간 값을 입력합니다.

1. **메서드 생성**을 선택합니다.

## API 배포 및 테스트
<a name="api-gateway-create-api-as-simple-proxy-for-lambda-test"></a>

**API를 배포하려면**

1. **Deploy API(API 배포)**를 선택합니다.

1. **스테이지**에서 **새 스테이지**를 선택합니다.

1. **단계 이름**에 **test**를 입력합니다.

1. (선택 사항) **설명**에 설명을 입력합니다.

1. **배포(Deploy)**를 선택합니다.

1. **스테이지 세부 정보**에서 복사 아이콘을 선택하여 API의 호출 URL을 복사합니다.

### 브라우저와 cURL을 사용하여 API의 Lambda 프록시 통합 테스트
<a name="api-gateway-create-api-as-simple-proxy-for-lambda-test-curl"></a>

브라우저 또는 [cURL](https://curl.se/)을 사용하여 API를 테스트할 수 있습니다.

쿼리 문자열 파라미터를 사용하여 `GET` 요청을 테스트하려면, API의 `helloworld` 리소스에 대한 URL을 브라우저 주소 표시줄에 입력합니다.

API `helloworld` 리소스의 URL을 만들려면 `helloworld` 리소스와 쿼리 문자열 파라미터 `?greeter=John`을 간접 호출 URL에 추가합니다. URL은 다음과 같이 표시되어야 합니다.

```
https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John
```

다른 메서드의 경우 [POSTMAN](https://www.postman.com/) 또는 [cURL](https://curl.se/) 등의 고급 REST API 테스트 유틸리티를 사용해야 합니다. 이 자습서에서는 cURL을 사용합니다. 아래의 cURL 명령 예제는 컴퓨터에 cURL이 설치되어 있다고 전제합니다.

**cURL을 사용하여 배포된 API를 테스트하려면 다음과 같이 합니다.**

1. 터미널 창을 엽니다.

1. 다음 cURL 명령을 복사하여 터미널 창에 붙여 넣습니다. 호출 URL을 이전 단계에서 복사한 것으로 바꾸고 URL 끝에 **/helloworld**를 추가합니다.
**참고**  
Windows에서 이 명령을 실행할 경우 다음 구문을 사용하십시오.  

   ```
   curl -v -X POST "https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld" -H "content-type: application/json" -d "{ \"greeter\": \"John\" }"
   ```

   1. `?greeter=John`이라는 쿼리 문자열 파라미터와 함께 API를 직접적으로 호출하려면 다음과 같이 합니다.

      ```
      curl -X GET 'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John'
      ```

   1. `greeter:John`이라는 헤더 파라미터와 함께 API를 직접적으로 호출하려면 다음과 같이 합니다.

      ```
      curl -X GET https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \
        -H 'content-type: application/json' \
        -H 'greeter: John'
      ```

   1. `{"greeter":"John"}`이라는 본문과 함께 API를 직접적으로 호출하려면 다음과 같이 합니다.

      ```
      curl -X POST https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \
        -H 'content-type: application/json' \
        -d '{ "greeter": "John" }'
      ```

   이 모든 경우에 출력되는 것은 다음과 같은 응답 본문이 있는 200 응답입니다.

   ```
   Hello, John!
   ```