목적
nodejs 환경에서 TypeScript로 작성된 어플리케이션을 serverless framework를 활용하여 람다에 배포
요구사항
- REST + AWSGatewayProxy
- POST with json body
- API KEY 기반 인증
- local 환경에서의 테스트
- 람다 함수 내부에서 API 외부 호출 (node-fetch)
본 글에서는 yarn을 활용하여 의존성 관리를 진행한다.
Serverless 설치
1
npm install -g serverless
의존성 설정
1
2
3
4
5
yarn init
yarn add @types/aws-lambda
yarn add serverless-plugin-typescript
yarn add serverless-offline -D
... #add optional dependencies
어플리케이션 작성 index.ts
api-gateway proxy를 통해 넘어오는 event값 내용을 확인
1
2
3
4
5
6
7
8
9
export async function echo(
event: APIGatewayProxyEventV2
): Promise<APIGatewayProxyResultV2> {
const requestBody = JSON.parse(event.body ?? "") // aws gateway proxy를 통해 넘어온 event의 body값을 통해 request body를 획득
return {
statusCode: 200,
data: JSON.stringify(event)
}
}
Serverless yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
service: {SERVICE_NAME_FOR_LAMBDA_APPLICATION}
plugins:
- serverless-plugin-typescript # 필수
- serverless-offline
provider:
name: aws
runtime: nodejs14.x
region: ap-northeast-2
functions:
metadata:
handler: src/index.echo
events:
- http:
path: echo
method: post
private: true # API 인증 활성화
Offline test
1
2
3
4
5
serverless offline
...
│ POST | http://localhost:3000/dev/echo │
...
Response
Postman을 사용하여 json body를 입력하고 POST 요청을 보내면 아래와 같은 결과 획득
1
2
3
4
5
6
7
{
"resource": "/echo",
"path": "/echo",
"httpMethod": "POST",
"body": ...
...
}
Deploy
1
2
3
4
5
6
7
serverless deploy
...
endpoint: POST - https://~~~/dev/echo
functions:
echo: ...
...
위처럼 배포가 진행되고 완료되면 api endpoint와 배포된 람다 함수 목록을 확인 할 수 있다.
serverless.yml
events에 private 설정을 안해뒀으면 바로 endpoint 호출이 가능하다.
API 키 생성 및 설정
이후 생성된 aws api gateway console에 접속하여 좌측 탭의 API 키 > 작업 > API 생성 및 사용량 계획을 생성하여 설정해주면 생성된 api key값을 헤더x-api-key
에 추가하여 요청이 가능하다.