Terraform for表达式无效问题:AWS Config remediation参数配置
Terraform for表达式错误排查与解决:S3桶AWS Config remediation参数配置
错误原因
你写的parameters列表语法不符合Terraform for表达式规则:
- Terraform的列表推导式
[for ... : ...]要求循环体是单个表达式,你在循环生成第一个参数Map后,直接用逗号拼接另外两个Map,属于语法错误。 - 后面的
local.bucket_prefixes[bucket_name]无法访问循环变量bucket_name,因为它不在for循环的作用域内。
修正方案
要实现每个S3桶对应一组三个参数(BucketName、TargetBucket、TargetPrefix),需要调整for表达式结构,让循环体生成包含这三个参数的子列表,再用flatten函数展开为一维列表(适配AWS Config的参数格式)。
修正后的完整代码
locals { bucket_names = data.aws_s3_bucket.all.bucket_names bucket_prefixes = { for bucket_name in local.bucket_names : bucket_name => format("%s/access-logs/", bucket_name) } } # 生成扁平的参数列表,每个桶对应三个参数项 parameters = flatten([ for bucket_name in local.bucket_names : [ { name = "BucketName" resource_value = bucket_name # 替换原占位符RESOURCE_ID为实际桶名 }, { name = "TargetBucket" resource_value = "your-target-bucket-name" }, { name = "TargetPrefix" resource_value = local.bucket_prefixes[bucket_name] } ] ])
关键调整说明
- 语法修正:将每个桶对应的三个参数放在一个子列表中,外层用for循环遍历所有桶,生成嵌套列表后通过
flatten转为一维列表,符合Terraform语法。 - 作用域修正:
bucket_name现在处于for循环的作用域内,可以正确调用local.bucket_prefixes[bucket_name]获取对应桶的日志前缀。 - 逻辑修正:把原代码中固定的
RESOURCE_ID替换为循环变量bucket_name,确保每个参数项对应正确的目标桶。
内容的提问来源于stack exchange,提问作者Tiwalade
相关产品推荐
相关产品推荐

