Amazon API Gateway
개발자 안내서

자습서: Lambda 프록시 통합을 사용하여 Hello World API 빌드

Lambda 프록시 통합은 API 메서드나 전체 API를 Lambda 함수와 통합할 수 있는 유연하고 간단한 API Gateway API 통합 유형입니다. Lambda 함수는 Lambda가 지원하는 어떤 언어로도 작성할 수 있습니다. 이것은 프록시 통합이기 때문에 API를 다시 배포할 필요 없어 언제든지 Lambda 함수 구현을 변경할 수 있습니다.

이 자습서에서는 다음 작업을 수행합니다.

  • API의 백엔드가 될 "Hello, World!" Lambda 함수를 만듭니다.

  • "Hello, World!" 만들기 및 테스트 Lambda 프록시 통합을 포함하는 API.

"Hello, World!" 만들기 Lambda 함수

이 함수는 인사말을 다음 형식의 JSON 객체로 호출자에게 반환합니다.

{ "greeting": "Good {time}, {name} of {city}.[ Happy {day}!]" }

Lambda 콘솔에서 "Hello, World!" Lambda 함수를 만듭니다.

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

  2. AWS 탐색 모음에서 리전(예: 미국 동부(버지니아 북부))를 선택합니다.

    참고

    Lambda 함수를 생성한 리전을 기록해 둡니다. 이 리전은 API를 생성할 때 필요합니다.

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

  4. 함수 생성을 선택합니다.

  5. 새로 작성을 선택합니다.

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

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

    2. 런타임 드롭다운 목록에서 Node.js 8.10을 선택합니다.

    3. 권한에서 실행 역할 선택 또는 생성을 확장합니다. 실행 역할 드롭다운 목록에서 Create new role from AWS policy templates(AWS 정책 템플릿에서 새 역할 생성)을 선택합니다.

    4. 역할 이름GetStartedLambdaBasicExecutionRole을 입력합니다.

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

    6. 함수 생성을 선택합니다.

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

    'use strict'; console.log('Loading hello world function'); exports.handler = async (event) => { let name = "you"; let city = 'World'; let time = 'day'; let day = ''; let responseCode = 200; console.log("request: " + JSON.stringify(event)); if (event.queryStringParameters && event.queryStringParameters.name) { console.log("Received name: " + event.queryStringParameters.name); name = event.queryStringParameters.name; } if (event.queryStringParameters && event.queryStringParameters.city) { console.log("Received city: " + event.queryStringParameters.city); city = event.queryStringParameters.city; } if (event.headers && event.headers['day']) { console.log("Received day: " + event.headers.day); day = event.headers.day; } if (event.body) { let body = JSON.parse(event.body) if (body.time) time = body.time; } let greeting = `Good ${time}, ${name} of ${city}.`; if (day) greeting += ` Happy ${day}!`; let responseBody = { message: greeting, input: event }; // The output from a Lambda proxy integration must be // in the following JSON object. The 'headers' property // is for custom response headers in addition to standard // ones. The 'body' property must be a JSON string. For // base64-encoded payload, you must also set the 'isBase64Encoded' // property to 'true'. let response = { statusCode: responseCode, headers: { "x-custom-header" : "my custom header value" }, body: JSON.stringify(responseBody) }; console.log("response: " + JSON.stringify(response)) return response; };
  8. Save를 선택합니다.

"Hello, World!" 만들기 API

이제 API Gateway 콘솔을 사용하여 "Hello, World!" Lambda 함수를 위한 API를 생성합니다.

"Hello, World!" 빌드 API

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

  2. API Gateway을 처음 사용하는 경우, 서비스의 기능을 소개하는 페이지가 표시됩니다. [Get Started ]를 선택합니다. 예제 API 생성 팝업이 나타나면 확인을 선택합니다.

    API Gateway을 처음 사용하는 것이 아닌 경우 API 생성을 선택합니다.

  3. 다음과 같이 비어 있는 API를 생성합니다.

    1. Choose the protocol(프로토콜 선택)에서 REST를 선택합니다.

    2. 새 API 생성에서 새 API를 선택합니다.

    3. 설정에서 다음과 같이 합니다.

      • API 이름LambdaSimpleProxy를 입력합니다.

      • 필요한 경우 설명 필드에 설명을 입력합니다. 설명을 입력하지 않으려면 비워 둡니다.

      • 엔드포인트 유형 설정을 리전으로 그대로 둡니다.

    4. API 생성(Create API)을 선택합니다.

  4. 다음과 같이 helloworld 리소스를 만듭니다.

    1. 리소스 트리에서 루트 리소스(/)를 선택합니다.

    2. 작업 드롭다운 목록에서 리소스 생성을 선택합니다.

    3. 프록시 리소스로 구성을 선택 해제된 상태로 둡니다.

    4. 리소스 이름helloworld를 입력합니다.

    5. 리소스 경로 설정을 /helloworld로 유지합니다.

    6. API Gateway CORS 활성화를 선택 해제된 상태로 둡니다.

    7. Create Resourc(리소스 생성)을 선택합니다.

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

    ANY 메서드를 설정하려면 다음을 수행합니다.

    1. 리소스 목록에서 /helloworld를 선택합니다.

    2. 작업 메뉴에서 메서드 생성을 선택합니다.

    3. 드롭다운 메뉴에서 ANY를 선택하고 확인 표시 아이콘을 선택합니다.

    4. 통합 유형 설정을 Lambda 함수)로 유지합니다.

    5. Lambda 프록시 통합 사용을 선택합니다.

    6. Lambda 리전 드롭다운 메뉴에서, GetStartedLambdaProxyIntegration Lambda 함수를 생성한 리전을 선택합니다.

    7. Lambda 함수 필드에 문자를 입력하고 드롭다운 메뉴에서 GetStartedLambdaProxyIntegration을 선택합니다.

    8. Use Default Timeout(기본 제한 시간 사용)이 선택된 상태이어야 합니다.

    9. Save를 선택합니다.

    10. Lambda 함수에 대한 권한 추가 메시지가 나타나면 확인을 선택합니다.

API 배포 및 테스트

API Gateway 콘솔에서 API 배포

  1. 작업 드롭다운 메뉴에서 API 배포를 선택합니다.

  2. 배포 단계에서 [새 단계]를 선택합니다.

  3. 단계 이름test를 입력합니다.

  4. 필요한 경우 단계 설명을 입력합니다.

  5. 필요한 경우 배포 설명을 입력합니다.

  6. 배포를 선택합니다.

  7. API의 호출 URL을 기록해 둡니다.

브라우저와 cURL을 사용하여 API의 Lambda 프록시 통합 테스트

브라우저 또는 cURL을 사용하여 API를 테스트할 수 있습니다.

쿼리 문자열 파라미터를 사용하여 GET 요청을 테스트하려면, API의 helloworld 리소스에 대한 URL을 브라우저 주소 표시줄에 입력합니다. 예: https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?name=John&city=Seattle

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

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

  1. 터미널 창을 엽니다.

  2. 다음 cURL 명령을 복사하여 터미널 창에 붙여 넣습니다. r275xc9bmd를 해당 API의 API ID로 바꾸고, us-east-1을 해당 API가 배포된 리전으로 바꾸십시오.

    curl -v -X POST \ 'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?name=John&city=Seattle' \ -H 'content-type: application/json' \ -H 'day: Thursday' \ -d '{ "time": "evening" }'

    참고

    Windows에서 이 명령을 실행할 경우 다음 구문을 사용하십시오.

    curl -v -X POST "https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?name=John&city=Seattle" -H "content-type: application/json" -H "day: Thursday" -d "{ \"time\": \"evening\" }"

다음과 같은 페이로드와 함께 성공적인 응답을 받아야 합니다.

{ "message":"Good evening, John of Seattle. Happy Thursday!", "input":{ "resource":"/helloworld", "path":"/helloworld", "httpMethod":"POST", "headers":{"Accept":"*/*", "content-type":"application/json", "day":"Thursday", "Host":"r275xc9bmd.execute-api.us-east-1.amazonaws.com", "User-Agent":"curl/7.64.0""X-Amzn-Trace-Id":"Root=1-1a2b3c4d-a1b2c3d4e5f6a1b2c3d4e5f6", "X-Forwarded-For":"72.21.198.64", "X-Forwarded-Port":"443", "X-Forwarded-Proto":"https"}, "multiValueHeaders":{"Accept":["*/*"]," content-type":["application/json"], "day":["Thursday"], "Host":["r275xc9bmd.execute-api.us-east-1.amazonaws.com"], "User-Agent":["curl/0.0.0"], "X-Amzn-Trace-Id":["Root=1-1a2b3c4d-a1b2c3d4e5f6a1b2c3d4e5f6"], "X-Forwarded-For":["11.22.333.44"], "X-Forwarded-Port":["443"], "X-Forwarded-Proto":["https"]}, "queryStringParameters":{"city":"Seattle", "name":"John" }, "multiValueQueryStringParameters":{ "city":["Seattle"], "name":["John"] }, "pathParameters":null, "stageVariables":null, "requestContext":{ "resourceId":"3htbry", "resourcePath":"/helloworld", "htt* Connection #0 to host r275xc9bmd.execute-api.us-east-1.amazonaws.com left intact pMethod":"POST", "extendedRequestId":"a1b2c3d4e5f6g7h=", "requestTime":"20/Mar/2019:20:38:30 +0000", "path":"/test/helloworld", "accountId":"123456789012", "protocol":"HTTP/1.1", "stage":"test", "domainPrefix":"r275xc9bmd", "requestTimeEpoch":1553114310423, "requestId":"test-invoke-request", "identity":{"cognitoIdentityPoolId":null, "accountId":null, "cognitoIdentityId":null, "caller":null, "sourceIp":"test-invoke-source-ip", "accessKey":null, "cognitoAuthenticationType":null, "cognitoAuthenticationProvider":null, "userArn":null, "userAgent":"curl/0.0.0","user":null }, "domainName":"r275xc9bmd.execute-api.us-east-1.amazonaws.com", "apiId":"r275xc9bmd" }, "body":"{ \"time\": \"evening\" }", "isBase64Encoded":false } }

이전 메서드 요청에서 POSTPUT으로 변경할 경우 동일한 응답을 받습니다.

GET 메서드를 테스트하려면 다음 cURL 명령을 복사하여 터미널 창에 붙여 넣습니다. r275xc9bmd를 해당 API의 API ID로 바꾸고, us-east-1을 해당 API가 배포된 리전으로 바꾸십시오.

curl -X GET \ 'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld/Seattle?name=John' \ -H 'content-type: application/json' \ -H 'day: Thursday'

GET 요청에 페이로드가 없는 경우를 제외하고 이전 POST 요청의 결과와 비슷한 응답을 받습니다. 따라서 body 파라미터는 null이 됩니다.