【问题标题】:How to conditionally merge multiple IAM policy statements in terraform?如何在 terraform 中有条件地合并多个 IAM 策略语句?
【发布时间】:2021-03-06 15:45:52
【问题描述】:

我正在尝试使用 Terraform 0.13 编写一个内部模块,该模块允许调用者在调用时选择一个或多个预先编写的策略文档。我想做的是将每个策略定义为 data.iam_policy_document,并有条件地将它们作为多个语句包含/合并到生成的策略中。我发现的示例似乎都没有做到这一点,并且注册表中的大多数 IAM 相关模块只依赖于传递完整策略语句的父模块,但我的目标是让模块的用户不需要了解如何编写正确的 IAM 政策。

我的想法是最简单的方法是合并策略文档的 .json 版本并将其传递给 iam_policy 资源,但这似乎不适用于通过计数三元控制策略文档,我意识到这可能完全是错误的方法。

使用该模块的预期结果是创建具有适当信任策略的单个角色,该角色可以访问所选的服务组,并且不会创建任何未使用和不需要的资源(未附加的额外策略,等)

【问题讨论】:

  • 您要处理多少个保单?在 Terraform 中,将多个策略附加到单个角色要比以某种方式组合策略文档要容易得多。否则,我认为您可能希望将 statement 部分拆分为单独的 JSON 字符串,然后根据您的需要将它们组合成单个字符串。

标签: amazon-web-services terraform amazon-iam


【解决方案1】:

aws_iam_policy_document 主要用于定义全新的策略,但对于这种与现有策略争论的任务(我想可能是使用 aws_iam_policy_document 创建的,也可能不是),我认为解码会更容易使用jsondecode 的策略 JSON,然后在将结果重新合并在一起之前使用这些结果数据结构。

如果策略可能相互依赖或相互冲突,这可能会变得复杂,但如果您可以假设所有策略将相互独立,那么您可能只需将每个策略的 Statement 数组连接在一起文件。

例如:

variable "iam_policies_json" {
  type = list(string)
}

locals {
  iam_policies = [for src in var.iam_policies_json : jsondecode(src)]
  iam_policy_statements = flatten([
    for policy in local.iam_policies : policy.Statement
  ])
  merged_policy = jsonencode({
    Version   = "2012-10-17"
    Statement = local.iam_policy_statements
  })
}

上面只是无条件地将它们全部合并在一起,但是一旦你有像 local.iam_policy_statements 这样的数据结构,你可以使用其他 Terraform 表达式构造,例如带有 if 子句的 for 表达式,有条件地过滤掉您不想包含在结果中的任何政策。

【讨论】:

    猜你喜欢
    • 2021-07-31
    • 2020-09-22
    • 2020-11-11
    • 1970-01-01
    • 2021-04-06
    • 2018-01-11
    • 2021-11-19
    • 2020-01-23
    • 2022-01-19
    相关资源
    最近更新 更多