CDK: 如何解决使用 ECR 支持的 Lambda 函数的鸡生蛋问题

87次阅读
没有评论

问题描述

在使用 CDK 时,如果我有以下代码:

const repository = new ecr.Repository(this, 'SomeRepository', {
  repositoryName: 'SomeRepository',
});
const lambda = new lambda.DockerImageFunction(this, 'SomeLambda', {
  code: lambda.DockerImageCode.fromEcr(repository, { tag: 'latest' }),
  functionName: 'SomeLambda',
  vpc: this.vpc,
  vpcSubnets: this.vpcSubnets,
});

CDK 在部署时会失败,因为刚刚创建的 ECR 中没有镜像。我的想法是先设置好所有内容,然后设置 GitHub Actions 来上传镜像,并告诉 Lambda 函数从哪里获取代码。

我应该如何设置好所有内容,以便准备好像这样的 CDK 部署?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

你可以使用 DockerImageAsset 来初始化 ECR,使用一个基础镜像,比如 scratchalpine,甚至是最基本的 Lambda 容器,以确保你的 Lambda 函数能够执行。
以下是一些相关链接:
DockerImageAsset 文档
scratch 镜像

当你设置好 GitHub Actions 后,只需替换镜像即可。

方案2

另一种方法是在 CDK 部署之前手动创建 ECR 镜像,并将其推送到 ECR 仓库中。然后在 CDK 代码中引用该镜像。
以下是一些步骤:
1. 使用 Dockerfile 构建一个 Docker 镜像。
2. 将该镜像推送到 ECR 仓库中。
3. 在 CDK 代码中引用该镜像。

这样,在 CDK 部署时,ECR 中已经存在镜像,CDK 就能够成功部署 Lambda 函数。

请注意,这种方法需要手动管理镜像的构建和推送过程,并确保在 CDK 部署之前镜像已经存在于 ECR 中。

方案3

如果你希望完全自动化这个过程,可以考虑使用 CI/CD 工具,如 Jenkins、GitLab CI、Travis CI 等。这些工具可以帮助你在代码提交或其他事件触发时自动构建和推送镜像到 ECR,并触发 CDK 部署。

具体步骤会因使用的工具而有所不同,你可以根据你使用的工具的文档进行配置和操作。

请注意,使用 CI/CD 工具需要一定的配置和管理工作,但可以实现自动化的构建、推送和部署过程,提高开发效率。

以上是几种解决方案,你可以根据自己的需求选择适合的方法来解决 CDK 中 Lambda 函数与 ECR 的鸡生蛋问题。

正文完