【问题标题】:Interpolating data source name in Terraform在 Terraform 中插入数据源名称
【发布时间】:2018-01-28 01:58:18
【问题描述】:

我正在尝试编写一个用于将存储桶策略附加到 AWS S3 存储桶的 terraform 模块。代码如下:

data "aws_iam_policy_document" "make_objects_public" {
  # if policy_name == <this-policy-name>, then generate policy
  count = "${var.policy_name == "make_objects_public" ? 1 : 0}"

  statement {
    ...
  }
}

resource "aws_s3_bucket_policy" "bucket_policy" {
  # if policy_name != "", then add the generated policy
  count = "${var.policy_name != "" ? 1 : 0}"

  bucket = "${var.bucket_name}"
  policy = "${data.aws_iam_policy_document.<policy-name-goes-here>.json}"
}

我想在获取aws_iam_policy_document 生成的策略时插入policy_name 变量。我尝试了几件事,但遗憾的是它们没有用。这在 terraform 中是否可行?

我尝试了这些技巧:

policy = "${data.aws_iam_policy_document."${var.policy_name}".json}"

policy = "${"${format("%s", "data.aws_iam_policy_document.${var.policy_name}.json")}"}"

policy = "${format("%s", "$${data.aws_iam_policy_document.${var.policy_name}.json}")}"

谢谢。

【问题讨论】:

    标签: amazon-web-services amazon-s3 interpolation terraform


    【解决方案1】:

    不支持动态资源名称,因为 Terraform 必须在开始处理插值之前构建依赖关系图,因此这些关系必须是明确的。

    这种设置的推荐方法是将系统分解为小模块,然后调用模块可以一起使用这些小模块来产生所需的结果,而无需复制所有细节。

    在这种特殊情况下,例如,您可以将每个策略拆分为自己的可重用模块,然后再编写一个可重用模块来创建 S3 存储桶并将给定策略与其关联。然后调用配置可以选择性地实例化一个适合其需要的策略模块以及通用 S3 存储桶模块,以创建所需的结果:

    module "policy" {
      # policy-specific module; only contains the policy data source
      source = "../policies/make_objects_public"
    
      # (any other arguments the policy needs...)
    }
    
    module "s3_bucket" {
      # S3 bucket module creates a bucket and attaches a policy to it
      source = "../s3_bucket" # general resource for S3 buckets with attached policies
    
      name   = "example"
      policy = "${module.policy.policy_json}" # an output from the policy module above
    }
    

    除了避免动态资源选择的需要之外,这还通过将策略生成与 S3 存储桶创建分离来增加灵活性,并且原则上允许具有不寻常的调用模块需要跳过实例化策略全部模块,直接使用aws_iam_policy_document

    上述模式有点类似于the dependency injection technique,其中系统被分成小组件(在本例中为模块),然后根配置以适合特定用例的方式“连接”这些组件.这种方法与一般技术具有非常相似的优点和缺点。

    【讨论】:

    • 很好的类比依赖注入技术。对于正在寻找更多详细信息的任何人,此问题也在GitHub issues 中进行了跟踪。
    • 您能解释一下为什么 policy = "${var.environment == "foo" ? data.aws_iam_policy_document.foo.json : data.aws_iam_policy_document.bar.json}" 似乎有效吗?
    • 在条件在其每个表达式中引用不同资源的情况下,依赖关系图保守地包括它们:引用资源将同时依赖于data.aws_iam_policy_document.foo data.aws_iam_policy_document.bar.
    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 2019-12-20
    • 2023-03-07
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多