AWS CLI를 사용하여 API Gateway용 Lambda 프록시 통합 설정
이 섹션에서는 AWS CLI를 사용하여 Lambda 프록시 통합으로 API를 설정하는 방법을 보여줍니다. API Gateway 콘솔을 사용하여 Lambda 프록시 통합을 통해 프록시 리소스를 구성하는 방법에 대한 자세한 내용은 자습서: Lambda 프록시 통합을 통해 REST API 생성 단원을 참조하세요.
예를 들면 다음과 같은 샘플 Lambda 함수를 API의 백엔드로 사용합니다.
export const handler = function(event, context, callback) { 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 + "!"; callback(null, res); };
이를 API Gateway에서 Lambda 사용자 지정 통합 설정의 Lambda 사용자 지정 통합 설정과 비교하여 이 Lambda 함수에 대한 입력을 요청 파라미터 및 본문으로 표현할 수 있습니다. 클라이언트가 동일한 입력 데이터를 전달하도록 허용하는 더 많은 위도가 있습니다. 여기에서 클라이언트는 greeter의 이름을 쿼리 문자열 파라미터, 헤더 또는 본문 속성으로 전달할 수 있습니다. 함수는 Lambda 사용자 지정 통합도 지원합니다. API 설정은 더 간단합니다. 메서드 응답 또는 통합 응답은 전혀 구성하지 않습니다.
AWS CLI를 사용하여 Lambda 프록시 통합 설정
-
다음과 같이
create-rest-api
명령을 호출하여 API를 생성합니다.aws apigateway create-rest-api --name 'HelloWorld (AWS CLI)' --region us-west-2
다음과 같이 그 결과로 얻은 응답에 있는 API의
id
값(te6si5ach7
)을 적어 둡니다.{ "name": "HelloWorldProxy (AWS CLI)", "id": "te6si5ach7", "createdDate": 1508461860 }
이 단원 전체에서 API
id
가 필요합니다. -
다음과 같이
get-resources
명령을 호출하여 루트 리소스id
를 가져옵니다.aws apigateway get-resources --rest-api-id te6si5ach7 --region us-west-2
이 작업이 성공하면 그 응답은 다음과 같습니다.
{ "items": [ { "path": "/", "id": "krznpq9xpg" } ] }
루트 리소스
id
값(krznpq9xpg
)을 기록해 둡니다. 다음 단계 및 그 이후에 이 값이 필요합니다. -
다음과 같이
create-resource
를 호출하여/greeting
의 API Gateway 리소스를 생성합니다.aws apigateway create-resource --rest-api-id te6si5ach7 \ --region us-west-2 \ --parent-id krznpq9xpg \ --path-part {proxy+}
성공적인 응답은 다음과 같습니다.
{ "path": "/{proxy+}", "pathPart": "{proxy+}", "id": "2jf6xt", "parentId": "krznpq9xpg" }
{proxy+}
리소스의id
값(2jf6xt
)을 기록해 둡니다. 다음 단계에서/{proxy+}
리소스에 메서드를 생성하려면 이 값이 필요합니다. -
다음과 같이
put-method
를 호출하여ANY
의ANY /{proxy+}
메서드 요청을 생성합니다.aws apigateway put-method --rest-api-id te6si5ach7 \ --region us-west-2 \ --resource-id 2jf6xt \ --http-method ANY \ --authorization-type "NONE"
성공적인 응답은 다음과 같습니다.
{ "apiKeyRequired": false, "httpMethod": "ANY", "authorizationType": "NONE" }
이 API 메서드를 통해 클라이언트는 백엔드에서 Lambda 함수의 인사를 수신 또는 발신할 수 있습니다.
-
put-integration
을 호출하여ANY /{proxy+}
라는 Lambda 함수로HelloWorld
메서드의 통합을 설정합니다. 이 함수는"Hello, {name}!"
파라미터가 제공되면greeter
이라는 메시지로, 쿼리 문자열 파라미터가 설정되어 있지 않으면"Hello, World!"
라는 메시지로 요청에 응답합니다.aws apigateway put-integration \ --region us-west-2 \ --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 서비스 작업의 사양에 따라 통합 요청에 대해
POST
의 HTTP 메서드를 사용해야 합니다.apigAwsProxyRole
의 IAM 역할에는apigateway
서비스가 Lambda 함수를 호출하도록 허용하는 정책이 있어야 합니다. IAM 권한에 대한 자세한 내용은 API 호출을 위한 API Gateway 권한 모델 단원을 참조하세요.성공적인 출력 결과는 다음과 같습니다.
{ "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 명령을 호출하여 리소스 기반 권한을 추가할 수 있습니다. 이 작업은 API Gateway 콘솔이 수행합니다. -
다음과 같이
create-deployment
를 호출하여 API를test
단계에 배포합니다.aws apigateway create-deployment --rest-api-id te6si5ach7 --stage-name test --region us-west-2
-
터미널에서 다음 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!