在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上