You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:54:01