###### tags: `AWS` `CDK` `projen` `lambda` `docker images` # Aws CDK Lambda Bulind 介紹 ## 案例環境介紹 簡單的 lambda 功能,呼叫時僅顯示一段文字 此案例將會示範兩種 lambda build 方式 ## 在部屬階段使用 lambda 提供的 docker iamges build ### 程式碼範例 ```=typesctipt new lambda.Function(this, 'testEventLambda', { functionName: 'testEventLambda', code: lambda.Code.fromAsset( path.join(__dirname, '../lambda/test-event'), { bundling: { user: 'root', image: lambda.Runtime.NODEJS_14_X.bundlingImage, command: [ 'bash', '-c', [ 'npm install', 'npm run build', 'cp -r /asset-input/dist /asset-output/', 'npm install --only=production', 'cp -a /asset-input/node_modules /asset-output/', ].join(' && '), ], }, } ), runtime: lambda.Runtime.NODEJS_14_X, handler: 'dist/testEventLambda.handler', }); ``` ### 優點 1. 可以省去過往需要使用 `tsc` 先在本機 Compile 出 `.js` 檔才能執行此lambda ### 缺點 1. 本機無法 debug 2. 由於是在部屬時進行 Compile 並打包,故在 aws console 也看不到 Compile 後的檔案 ## 直接使用 docker iamges build ### 程式碼範例 #### lambda ```=typescript new lambda.DockerImageFunction(this, 'DockerEventLambda', { functionName: 'dockerEventLambda', code: lambda.DockerImageCode.fromImageAsset( path.join(__dirname, '../lambda/docker-event'), { cmd: ['dist/dockerEventLambda.handler'], } ), }); ``` #### dockerfile ```=dockerfile FROM public.ecr.aws/lambda/nodejs:14 COPY src /var/task/src COPY package.json tsconfig.json /var/task/ # Install NPM dependencies for function RUN npm install && npm run build # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "dist/dockerEventLambda.handler" ] ``` ### CDK 部屬流程 1. pull 此 docker image 下來 build 2. build 成功後會推上 AWS ECR 3. 成功後即可看到lambda code 就會顯示來源是 ECR 的某個 tag PS: ECR tag 是 CDK 自行產生的 hash code,目的在於每次修改 lambda 後,CDK 發現有變動就會再推一個新版到 ECR tag ### 本機測試步驟 1. 切換置要測試的 lambda 目錄下,即有存 dockerfile 的目錄 2. 啟動 docker ``` $ docker build -t docker-lambda:latest . $ docker run -p 9000:8080 docker-lambda:latest ``` 3. 使用 curl 來測試 lambda ``` $ curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}' ``` PS: -d 後方為 event payload ### 優點 1. 可以省去過往需要使用 `tsc` 先在本機 Compile 出 `.js` 檔才能執行此lambda 2. 可以本機測試 ## 參考資料 [使用 CDK 打造 Docker Image 建置 Lambda](https://9incloud.com/aws/cdk/cdk-docker-image-build-lambda) [Building Lambda functions inside Docker containers with CDK](https://aripalo.com/blog/2020/building-lambda-functions-inside-docker-containers-with-cdk/) [AWS Lambda Container Image Support example for Node.js](https://sbstjn.com/blog/aws-lambda-container-docker-example/)