Terraform如何结合count实现S3资源条件创建与多文件夹循环?
Terraform条件创建多S3文件夹对象解决方案
问题分析
你的代码报错核心是重复声明count参数,同时需要实现两个逻辑:
- 仅当
environment变量为"prod"时创建资源 - 遍历
s3_folders列表生成多个S3对象(模拟文件夹)
可行解决方案
方案1:整合count逻辑
将两个条件合并到单个count参数中,当环境为prod时,count值等于s3_folders的长度;否则为0,完全不创建资源。
修正后的完整代码:
variable "s3_folders" { type = list(string) description = "The list of S3 folders to create" default = ["ron", "al", "ted"] } variable "environment" { type = string description = "Deployment environment" } variable "bucketname-smc-updater-upgrades" { type = string description = "Target S3 bucket name" } resource "aws_s3_object" "smcupdater-folder-new-out" { count = var.environment == "prod" ? length(var.s3_folders) : 0 bucket = var.bucketname-smc-updater-upgrades acl = "private" key = "UpdaterActions/${var.s3_folders[count.index]}/NewActionsFiles/out-smcupdater/" source = "/dev/null" server_side_encryption = "AES256" }
方案2:使用for_each(更推荐)
通过for表达式生成一个条件性集合,仅当环境为prod时包含s3_folders的元素,否则为空集合,这样for_each会根据集合内容决定是否创建资源。
代码示例:
variable "s3_folders" { type = list(string) description = "The list of S3 folders to create" default = ["ron", "al", "ted"] } variable "environment" { type = string description = "Deployment environment" } variable "bucketname-smc-updater-upgrades" { type = string description = "Target S3 bucket name" } resource "aws_s3_object" "smcupdater-folder-new-out" { for_each = var.environment == "prod" ? toset(var.s3_folders) : toset([]) bucket = var.bucketname-smc-updater-upgrades acl = "private" key = "UpdaterActions/${each.value}/NewActionsFiles/out-smcupdater/" source = "/dev/null" server_side_encryption = "AES256" }
说明
- 两种方案都解决了重复count的问题,同时实现了环境条件判断
- for_each方案相比count更稳定,因为它依赖元素值而非索引,当
s3_folders列表元素顺序变化时,不会导致资源重建
内容的提问来源于stack exchange,提问作者Shahar Hamuzim Rajuan
相关产品推荐
相关产品推荐

