---
# System prepended metadata

title: Aws CDK Lambda Bulind 介紹
tags: [CDK, lambda, docker images, projen, AWS]

---

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