로컬에서 Lambda 함수 호출하기
Lambda 함수 로컬에서 실행하기
Lambda 함수를 만든 후에는 먼저 로컬에서 실행해보고 싶을 겁니다.
로컬에서 Lambda 호출하기
notes-api
서비스의 serverless.yml
파일에 정의된 get 함수를 살펴보겠습니다.
functions:
get:
handler: get.main
events:
- http:
path: notes/{id}
method: get
cors: true
authorizer: aws_iam
그리고 get.js
파일은 다음과 같습니다.
import handler from "../../libs/handler-lib";
import dynamoDb from "../../libs/dynamodb-lib";
export const main = handler(async (event, context) => {
const params = {
TableName: process.env.tableName,
// 'Key'는 조회할 항목의 파티션 키와 정렬 키를 정의합니다.
// - 'userId': 인증된 사용자의 Identity Pool identity id
// - 'noteId': 경로 파라미터
Key: {
userId: event.requestContext.identity.cognitoIdentityId,
noteId: event.pathParameters.id,
},
};
const result = await dynamoDb.get(params);
if (!result.Item) {
throw new Error("항목을 찾을 수 없습니다.");
}
// 조회된 항목을 반환합니다.
return result.Item;
});
이 Lambda 함수는 API Gateway의 GET HTTP 요청에 의해 호출됩니다. 요청 파라미터를 모의로 만들어야 합니다. services/notes-api/
내부의 events
디렉토리에는 get-event.json
이라는 모의 이벤트 파일이 있습니다.
{
"pathParameters": {
"id": "578eb840-f70f-11e6-9d1a-1359b3b22944"
},
"requestContext": {
"identity": {
"cognitoIdentityId": "USER-SUB-1234"
}
}
}
이 함수를 호출하려면 services/notes-api
디렉토리 내에서 다음 명령을 실행합니다.
$ serverless invoke local -f get --path events/get-event.json
몇 가지 예제 HTTP 이벤트 객체를 살펴보겠습니다.
쿼리 문자열 파라미터
쿼리 문자열 파라미터를 전달하려면:
{
"queryStringParameters": {
"key": "value"
}
}
POST 데이터
POST 요청의 HTTP 본문에 데이터를 전달하려면 다음과 같이 작성합니다:
{
"body": "{\"key\":\"value\"}"
}
또한 SNS, SQS 등 다른 이벤트에 의해 Lambda 함수가 호출된 것처럼 이벤트를 모의(mock)할 수도 있습니다. 모의 이벤트 파일의 내용은 Lambda 함수의 이벤트 객체에 직접 전달됩니다.
로컬에서 실행된 Lambda 구분하기
테스트 중에 Lambda 함수가 serverless invoke local
로 트리거되었는지 확인하고 싶을 수 있습니다. 예를 들어, 분석 서버에 이벤트를 보내지 않거나 이메일을 보내지 않으려는 경우가 있습니다. Serverless Framework는 로컬에서 실행될 때 IS_LOCAL
환경 변수를 설정합니다.
따라서 코드에서 이 환경 변수를 확인할 수 있습니다. 우리는 libs/aws-sdk.js
에서 로컬에서 함수를 호출할 때 X-Ray 트레이싱을 비활성화하기 위해 이 방법을 사용합니다:
import aws from "aws-sdk";
import xray from "aws-xray-sdk";
// 'invoke local'일 때는 트레이싱을 활성화하지 않음
const awsWrapped = process.env.IS_LOCAL ? aws : xray.captureAWS(aws);
export default awsWrapped;
다음으로, 로컬에서 API Gateway 엔드포인트를 어떻게 작업할 수 있는지 살펴보겠습니다.
For help and discussion
Comments on this chapter