Lambda Express API 서버 구축하기 람다와 express 를 이용하여 API 서버를 구축해보자.
- 프로젝트 생성
- 패키지 설치
1 2 npm install express aws-serverless-express npm install serverless-offline -d
- 로컬에서도 express를 실행하며 테스트하고 배포는 람다로 하고싶다. 개발환경과 배포환경을 구분하여 개발을 진행해야한다. (나누어 진행하지 않는다면?? 매우 힘들다…) serverless 는 serverless-offline 이라는 서비스를 지원하며 람다를 통해 배포한 환경과 동일한 환경에서 테스트를 로컬에서 실행이 가능하도록 해주는 패키지이다.
그래서 난 로컬환경에서 serverless-offline 을 통해 실행함과 더불어 일반적인 express 개발 환경처럼 직접 express 를 구동할 수 있도록 설정하기로 했다.
app.js
1 2 3 4 5 6 7 8 9 10 11 12 const express = require ('express' );const { initialize } = require ('./init' );const app = express();initialize(app); app.get('/api/v1/meta' , async (req, res) => { return res.json({}); }); module .exports = app;
app.js 에서는 기본적인 express 의 구조로 작성했다.
local.js
1 2 3 4 5 6 7 const app = require ('./app' );const port = process.env.PORT || 9000 ;app.listen(port, () => { console .log(`localhost:${port} start app` ); });
뭐 크게 특별하지 않다. 왜냐면 회사에서 람다로 api 를 구축하기 전 테스트 단계이니까.👏👏👏
lambda.js
1 2 3 4 5 6 'use strict' const awsServerlessExpress = require ('aws-serverless-express' )const app = require ('./app' )const server = awsServerlessExpress.createServer(app)exports .handler = (event, context ) => { awsServerlessExpress.proxy(server, event, context) }
lambda.js 에서는 express 를 lambda 함수로 실행할 수 있도록 하기 위해 작성한다.
- serverless.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 service: express-lambda-test plugins: - serverless-offline custom: stage: ${opt:stage, self:provider.stage} environment: ${file(env.yml):${self:custom.stage}, file(env.yml):default} provider: name: aws runtime: nodejs16.x memorySize: 256 timeout: 20 stage: ${opt:stage, 'dev' } region: ap-northeast-2 environment: NODE_ENV: ${self:custom.environment.NODE_ENV} functions: app: handler: ./src/lambda.handler events: - http: path: / method: any cors: true - http: path: '/api/v1/{proxy+}' method: any cors: true
- 람다 배포 람다를 통해 api 호출해서 응답을 받기 위한 준비는 끝났고 배포만 진행하면 된다.
1 serverless deploy --stage dev
- 호출해보기
간단하게 알아보았으니 이제 lambda 가 어떻게 api 를 호출하는지 알아보자.