如何使用Terraform部署可从两个ECR中按需选取镜像的Lambda
Terraform 双ECR仓库优先选择部署Lambda容器镜像方案
核心思路
通过Terraform官方AWS Provider的内置数据源提前查询两个ECR仓库的镜像存在状态,结合条件判断实现优先级选择,全程无需额外自定义脚本,完全符合Terraform声明式语法规范,是当前场景下兼容性和执行效率最优的实现方式。
实现步骤
- 声明两个ECR仓库的基础信息数据源,获取仓库URI等核心属性
- 用
aws_ecr_images数据源查询优先级更高的ECR-1仓库的镜像列表,判断是否存在可用镜像 - 仅当ECR-1存在可用镜像时,查询其最新镜像的详细信息;无镜像时该数据源自动跳过
- 查询备用ECR-2仓库的最新可用镜像作为兜底选项
- 通过本地值(local)做条件判断,选择最终要使用的镜像URI传入Lambda配置
示例代码
# 读取ECR-1仓库基础信息 data "aws_ecr_repository" "ecr_1" { name = "替换为你的ECR-1仓库名称" } # 读取ECR-2仓库基础信息 data "aws_ecr_repository" "ecr_2" { name = "替换为你的ECR-2仓库名称" } # 查询ECR-1下所有已标记的可用镜像列表,无镜像时返回空列表不报错 data "aws_ecr_images" "ecr_1_images" { repository_name = data.aws_ecr_repository.ecr_1.name filter { name = "tag_status" values = ["TAGGED"] } } # 仅当ECR-1存在可用镜像时,查询其最新推送的镜像详情 data "aws_ecr_image" "ecr_1_latest" { count = length(data.aws_ecr_images.ecr_1_images.image_ids) > 0 ? 1 : 0 repository_name = data.aws_ecr_repository.ecr_1.name most_recent = true filter { name = "tag_status" values = ["TAGGED"] } } # 查询ECR-2的最新可用镜像作为兜底 data "aws_ecr_image" "ecr_2_latest" { repository_name = data.aws_ecr_repository.ecr_2.name most_recent = true filter { name = "tag_status" values = ["TAGGED"] } } # 条件判断选择最终使用的镜像URI locals { ecr_1_image_uri = length(data.aws_ecr_image.ecr_1_latest) > 0 ? "${data.aws_ecr_repository.ecr_1.repository_url}:${data.aws_ecr_image.ecr_1_latest[0].image_tags[0]}" : null final_lambda_image = local.ecr_1_image_uri != null ? local.ecr_1_image_uri : "${data.aws_ecr_repository.ecr_2.repository_url}:${data.aws_ecr_image.ecr_2_latest.image_tags[0]}" } # 部署容器类型Lambda函数 resource "aws_lambda_function" "container_lambda" { function_name = "替换为你的Lambda函数名称" role = "替换为你的Lambda执行角色ARN" package_type = "Image" image_uri = local.final_lambda_image # 其他Lambda配置(内存、超时、环境变量等)根据业务需求补充 }
注意事项
- 可根据业务需求调整
aws_ecr_images和aws_ecr_image的过滤规则,比如指定特定镜像标签、过滤特定架构的镜像、排除待删除状态的镜像等 - 如果ECR镜像未打标签,只需调整
tag_status的过滤值为UNTAGGED即可适配 - 该方案完全基于官方Provider原生能力实现,Terraform计划阶段就可以直观看到最终要使用的镜像地址,便于提前校验配置正确性
内容的提问来源于stack exchange,提问作者user1154422
相关产品推荐
相关产品推荐

