Terraform中如何在IAM等资源内引用条件创建的S3存储桶资源
解决方案
你可以通过Terraform的concat函数结合列表推导式处理条件创建资源的引用问题,自动过滤掉未创建的存储桶ARN,修改后的配置如下:
data "aws_iam_policy_document" "test_policy_document" { statement { actions = [ "s3:ListBucket", ] resources = concat( [aws_s3_bucket.bucket_always.arn], [for bucket in aws_s3_bucket.bucket_conditional : bucket.arn] ) } statement { actions = [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", ] resources = concat( ["${aws_s3_bucket.bucket_always.arn}/*"], [for bucket in aws_s3_bucket.bucket_conditional : "${bucket.arn}/*"] ) } }
实现原理
- 使用
count参数创建的资源本质是一个资源列表,当环境不是QA时,aws_s3_bucket.bucket_conditional是长度为0的空列表,遍历空列表得到的ARN集合也为空 concat函数会把多个列表拼接为一个列表,空列表不会添加任何多余元素,刚好实现非QA环境仅保留固定存储桶权限、QA环境自动追加条件存储桶权限的需求
内容的提问来源于stack exchange,提问作者Vikas Rathore
相关产品推荐
相关产品推荐

