我正在尝试使用Terraform0.13编写一个内部模块,它允许调用者在调用时选择一个或多个预先编写的策略文档。我想要做的是将每个策略定义为一个data.iam_policy_document,并有条件地将它们作为多个语句包含/合并到结果策略中。我找到的示例似乎都不能很好地做到这一点,注册表中的大多数IAM相关模块只是依赖于传递完整策略声明的父模块,但我的目标是让模块的用户不需要了解如何编写正确的IAM策略。
我认为最简单的方法是合并策略文档的.json版本并将其传递给iam_policy资源,但是通过计数三元来控制策略文档似乎并不能很好地工作,我意识到这可能是完全错误的方法。
使用该模块的期望结果是创建具有适当信任策略的单个角色,该角色可以访问所选的服务组,并且不创建任何未使用和未成功的资源(保持未附加的额外策略,等等)
发布于 2020-11-24 06:12:51
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表达式,来有条件地过滤掉您不想包含在结果中的任何策略。
https://stackoverflow.com/questions/64976695
复制相似问题