###### 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/)