Dra*_*l15 6 amazon-web-services amazon-iam terraform
我正在尝试使用 Terraform 0.13 编写一个内部模块,允许调用者在调用时选择一个或多个预先编写的策略文档。我想做的是将每个策略定义为 data.iam_policy_document,并有条件地将它们作为多个语句包含/合并到结果策略中。我发现的所有示例似乎都没有做到这一点,并且注册表中的大多数 IAM 相关模块仅依赖于父模块传递完整的策略声明,但我的目标是模块的用户不需要了解如何编写正确的 IAM 策略。
我的想法是最简单的方法是合并策略文档的 .json 版本并将其传递给 iam_policy 资源,但这似乎不适用于通过计数三元组控制策略文档,我意识到这可能是完全错误的做法。
使用该模块的预期结果是创建具有适当信任策略的单个角色,该角色可以访问所选服务组,并且不会创建任何未使用和不需要的资源(保持未附加的额外策略等)
主要aws_iam_policy_document是为了定义全新的策略,但是对于这种争论现有策略的任务(我想可能是也可能不是用 来创建的),我认为使用解码策略 JSON然后使用这些策略aws_iam_policy_document会更容易jsondecode再次将结果合并在一起之前生成的数据结构。
如果策略可能相互依赖或相互冲突,那么情况可能会变得复杂,但如果您可以假设所有策略将彼此独立,那么您可能只需将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
})
}
Run Code Online (Sandbox Code Playgroud)
上面只是无条件地将它们全部合并在一起,但是一旦您拥有像这里这样的数据结构,local.iam_policy_statements您就可以使用其他 Terraform 表达式构造(例如for带子句的表达式if)来有条件地过滤掉您不想包含在结果中的任何策略。
| 归档时间: |
|
| 查看次数: |
8716 次 |
| 最近记录: |