在AWS Lambda中使用nodejs+express+docker處理API Gateway的請求
2023/01/31
refs
建立Node.js Express API
建立app.ts
首先建立一個express app
import express from 'express'
const app = express()
// API TODO
export default app
startApp.ts
接著建立一個startApp.ts
這個是for非lambda模式中使用的
import app from "./app"
app.listen(process.env.APP_PORT)
Lambda Docker模式
在lambda docker模式中
基本上就是將Dockerfile的CMD指向一個hanlder function
而這個function就可以去做任何事情
使用serverless-express套件
這邊要使用一個serverless-express套件
它就是在資料進入handler後接手
將API Gateway的請求資料接起來
然後拋給對應Express API
功能上就類似Python包進Lamdba Docker用的Mangum
或是PHP包進Lambda Docker用的bref
建立lambda.ts
為了讓整個API可以在一般模式及Lambda Docker模式都可使用
因此我獨立一個lambda.ts專本for lambda模式使用
只要將express app載入後建立serverlessExpressInstance
就可用來轉譯來自API Gateway的請求
import app from './app'
const serverlessExpress = require('@vendia/serverless-express')
exports.handler = function(event, context) {
const serverlessExpressInstance = serverlessExpress({ app })
return serverlessExpressInstance(event, context)
}
Dockerize
FROM public.ecr.aws/lambda/nodejs:16
ENV TIMEZONE="Asia/Taipei"
WORKDIR $LAMBDA_TASK_ROOT
COPY . $LAMBDA_TASK_ROOT
RUN npm install --global yarn && \
yarn install && \
yarn build && \
rm -rf node_modules && \
rm -rf src && \
yarn install --prod && \
cp -r dist/* $LAMBDA_TASK_ROOT && \
rm -rf dist
# 指向lambda.ts內的handler callback
CMD ["lambda.handler"]
API Gateway的部份
只要建立一個proxy resource即可
並將請求都轉為lambda proxy
這樣就不用依照express每隻API都逐一設定到API Gateway上