如何在 terraform 中有条件地合并多个 IAM 策略语句?

6
我正在尝试使用 Terraform 0.13 编写一个内部模块,使调用者可以在调用时选择一个或多个预定义策略文档。我想做的是将每个策略定义为 data.iam_policy_document,并按条件包含/合并它们到结果策略中作为多个声明。我找到的所有示例似乎都不能完全做到这一点,大多数 IAM 相关模块在注册表中都只依赖于父模块传递完整的策略语句,但我的目标是模块的用户不需要了解如何编写正确的 IAM 策略。

我的想法是最简单的方法是合并策略文档的 .json 版本,并将其传递给 iam_policy 资源,但这似乎与通过计数条件控制策略文档不太搭配,而且我意识到这可能完全是错误的方法。

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

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

9

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表达式,以有条件地过滤掉不想包含在结果中的任何策略。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接