

# AWS CLI를 사용하여 API Gateway용 Lambda 프록시 통합 설정
<a name="set-up-lambda-proxy-integration-using-cli"></a>

이 섹션에서는 AWS CLI를 사용하여 Lambda 프록시 통합으로 API를 설정하는 방법을 보여줍니다. API Gateway 콘솔을 사용하여 Lambda 프록시 통합을 통해 프록시 리소스를 구성하는 방법에 대한 자세한 내용은 [자습서: Lambda 프록시 통합을 통해 REST API 생성](api-gateway-create-api-as-simple-proxy-for-lambda.md) 단원을 참조하세요.

예를 들면 다음과 같은 샘플 Lambda 함수를 API의 백엔드로 사용합니다.

```
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
};
```

이를 [API Gateway에서 Lambda 사용자 지정 통합 설정](set-up-lambda-custom-integrations.md)의 Lambda 사용자 지정 통합 설정과 비교하여 이 Lambda 함수에 대한 입력을 요청 파라미터 및 본문으로 표현할 수 있습니다. 클라이언트가 동일한 입력 데이터를 전달하도록 허용하는 더 많은 위도가 있습니다. 여기에서 클라이언트는 greeter의 이름을 쿼리 문자열 파라미터, 헤더 또는 본문 속성으로 전달할 수 있습니다. 함수는 Lambda 사용자 지정 통합도 지원합니다. API 설정은 더 간단합니다. 메서드 응답 또는 통합 응답은 전혀 구성하지 않습니다.

**AWS CLI를 사용하여 Lambda 프록시 통합 설정**

1. 다음 [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) 명령을 사용하면 API를 생성할 수 있습니다.

   ```
   aws apigateway create-rest-api --name 'HelloWorld (AWS CLI)'
   ```

   출력은 다음과 같습니다.

   ```
   {
       "name": "HelloWorldProxy (AWS CLI)", 
       "id": "te6si5ach7",
       "rootResourceId" : "krznpq9xpg",
       "createdDate": 1508461860
   }
   ```

   이 예제에서는 API `id`(`te6si5ach7`)와 `rootResourceId`(`krznpq9xpg`)를 사용합니다.

1. 다음 [create-resource](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-resource.html) 명령을 사용하면 `/greeting`의 API Gateway [리소스](https://docs.aws.amazon.com/apigateway/latest/api/API_Resource.html)를 생성할 수 있습니다.

   ```
   aws apigateway create-resource \
         --rest-api-id te6si5ach7 \
         --parent-id krznpq9xpg \
         --path-part {proxy+}
   ```

   출력은 다음과 같습니다.

   ```
   {
       "path": "/{proxy+}", 
       "pathPart": "{proxy+}", 
       "id": "2jf6xt", 
       "parentId": "krznpq9xpg"
   }
   ```

   다음 단계에서는 `{proxy+}` 리소스의 `id` 값(`2jf6xt`)을 사용하여 `/{proxy+}` 리소스에 대한 메서드를 생성합니다.

1. 다음 [put-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method.html)를 사용하면 `ANY /{proxy+}`의 `ANY` 메서드 요청을 생성할 수 있습니다.

   ```
   aws apigateway put-method --rest-api-id te6si5ach7 \
          --resource-id 2jf6xt \
          --http-method ANY \
          --authorization-type "NONE"
   ```

   출력은 다음과 같습니다.

   ```
   {
       "apiKeyRequired": false, 
       "httpMethod": "ANY", 
       "authorizationType": "NONE"
   }
   ```

   이 API 메서드를 통해 클라이언트는 백엔드에서 Lambda 함수의 인사를 수신 또는 발신할 수 있습니다.

1. 다음 [put-integration](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-integration.html) 명령을 사용하면 `HelloWorld`라는 Lambda 함수와 `ANY /{proxy+}` 메서드의 통합을 설정할 수 있습니다. 이 함수는 `"Hello, {name}!"` 파라미터가 제공되면 `greeter`이라는 메시지로, 쿼리 문자열 파라미터가 설정되어 있지 않으면 `"Hello, World!"`라는 메시지로 요청에 응답합니다.

   ```
   aws apigateway put-integration \
         --rest-api-id te6si5ach7 \
         --resource-id 2jf6xt \
         --http-method ANY \
         --type AWS_PROXY \
         --integration-http-method POST \
         --uri arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:HelloWorld/invocations \
         --credentials arn:aws:iam::123456789012:role/apigAwsProxyRole
   ```
**중요**  
Lambda 통합의 경우에는 [함수 호출을 위한 Lambda 서비스 작업의 사양](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)에 따라 통합 요청에 대해 `POST`의 HTTP 메서드를 사용해야 합니다. `apigAwsProxyRole`의 IAM 역할에는 `apigateway` 서비스가 Lambda 함수를 호출하도록 허용하는 정책이 있어야 합니다. IAM 권한에 대한 자세한 내용은 [API 호출을 위한 API Gateway 권한 모델](permissions.md#api-gateway-control-access-iam-permissions-model-for-calling-api) 단원을 참조하세요.

   출력은 다음과 같습니다.

   ```
   {
       "passthroughBehavior": "WHEN_NO_MATCH", 
       "cacheKeyParameters": [], 
       "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:1234567890:function:HelloWorld/invocations", 
       "httpMethod": "POST", 
       "cacheNamespace": "vvom7n", 
       "credentials": "arn:aws:iam::1234567890:role/apigAwsProxyRole", 
       "type": "AWS_PROXY"
   }
   ```

   `credentials`에 IAM 역할을 제공하는 대신 [add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) 명령을 사용하여 리소스 기반 권한을 추가할 수 있습니다. 이 작업은 API Gateway 콘솔이 수행합니다.

1. 다음 [create-deployment](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-deployment.html) 명령을 사용하면 API를 `test` 스테이지에 배포할 수 있습니다.

   ```
   aws apigateway create-deployment  \
         --rest-api-id te6si5ach7 \
         --stage-name test
   ```

1. 터미널에서 다음 cURL 명령을 사용하여 API를 테스트합니다.

   `?greeter=jane`이라는 쿼리 문자열 파라미터와 함께 API를 호출:

   ```
   curl -X GET 'https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/greeting?greeter=jane'
   ```

   `greeter:jane`이라는 헤더 파라미터와 함께 API를 호출:

   ```
   curl -X GET https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/hi \
     -H 'content-type: application/json' \
     -H 'greeter: jane'
   ```

   `{"greeter":"jane"}`이라는 본문과 함께 API를 호출:

   ```
   curl -X POST https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/hi \
     -H 'content-type: application/json' \
     -d '{ "greeter": "jane" }'
   ```

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

   ```
   Hello, jane!
   ```