如何用Terraform条件创建ECR仓库?循环资源实现求助
实现Terraform条件创建ECR仓库(仅仓库不存在时创建)
要实现仅当ECR仓库不存在时才创建的需求,核心思路是先通过数据源检测已有仓库,再过滤出需要创建的仓库列表,最后基于这个列表循环创建资源。具体步骤如下:
1. 检测已有ECR仓库
定义数据源循环检查每个目标仓库是否存在,通过ignore_errors避免因仓库不存在导致Terraform执行中断:
data "aws_ecr_repository" "existing_repos" { for_each = local.repositories name = each.key lifecycle { ignore_errors = true } }
2. 过滤出需要创建的仓库
创建本地变量,筛选出数据源检测不到的仓库(即不存在的仓库):
locals { repos_to_create = { for repo_name in keys(local.repositories) : repo_name => local.repositories[repo_name] if try(data.aws_ecr_repository.existing_repos[repo_name].name, null) == null } }
这里用try函数安全访问数据源属性,若仓库不存在,try会返回null,从而将该仓库纳入创建列表。
3. 修改资源块使用过滤后的列表
将原资源的for_each替换为过滤后的local.repos_to_create,这样只会创建不存在的仓库及对应生命周期策略:
resource "aws_ecr_repository" "ecr_repository" { for_each = local.repos_to_create name = each.key image_scanning_configuration { scan_on_push = true } tags = var.tags } resource "aws_ecr_lifecycle_policy" "default_policy" { for_each = local.repos_to_create repository = aws_ecr_repository.ecr_repository[each.key].name policy = jsonencode({rules = concat(local.untagged_images_rule, local.pull_request_images_rule, local.remove_max_images_rule)}) }
为什么之前用count失败?
count适合控制单个资源的创建数量,而你是批量处理多个仓库,用for_each结合数据源过滤才是匹配场景的方案。直接给循环资源加count会导致语法逻辑冲突,无法实现批量条件创建。
内容的提问来源于stack exchange,提问作者albertsha
相关产品推荐
相关产品推荐

