【问题标题】:terraform .12 - add multiple inline policiesterraform .12 - 添加多个内联策略
【发布时间】:2020-11-23 02:02:40
【问题描述】:

我想知道是否有一种简单的方法可以添加多个 json 文件策略

mypolicy1.json, mypolicy2.json, mypolicy3.json

到目前为止,这是我的代码.. 适用于一项政策

variable "iam_policy_path" {
  default = "./mypolicy.json"  
}

resource "aws_iam_role_policy" "role" {
  name   = var.name
  role   = var.role
  policy = file(var.iam_policy_path)
}

module "aws_iam_role_policy" {
   source = "../modules/mypolicypolicy/"
   name = "mypolicy"
   role = module.myrole.myroleout
   iam_policy_path = "new_policy_path.json"
}

【问题讨论】:

  • 正确的方法不是拥有一个包含所有需要的策略声明的策略吗?
  • 仍在学习 terraform 的最佳方法。对于非 terraform,我们为角色添加了许多内联。我有点喜欢这种方法,因为它一目了然更容易理解。不知道我是否能做到这一点,但它就是这样。
  • @bsapaka 在我看来,对于一般软件而言,任何阻止您创建合理抽象的方法都不是“正确的”,即使创建该工具的人或该工具的主要社区说否则。但这不是这里的情况。如果您拥有许多其他资源使用的资源,那么为该资源制定由其他资源共享的策略是非常明智的,并且大量 AWS 托管策略表明他们完全希望人们这样做。跨度>

标签: amazon-web-services terraform-provider-aws terraform0.12+


【解决方案1】:

一种方法是使用 for_each 并将您的 iam_policy_path 作为路径列表。

例如:

variable "iam_policy_path" {
  default = ["./mypolicy.json", "./mypolicy2.json"]  
}

resource "aws_iam_role_policy" "role" {
  
  for_each = toset(var.iam_policy_path) # for each requires set. 
 
  name   = var.name
  role   = var.role

  policy = file(each.key)
}

那么在使用模块时:

module "aws_iam_role_policy" {
   source = "../modules/mypolicypolicy/"
   name = "mypolicy"
   role = module.myrole.myroleout
   iam_policy_path = ["new_policy_path.json", "new_policy_path2.json"]
}

基于额外信息。完整的解决方案可能还需要使用aws_iam_role_policy_attachment,它将托管策略附加到角色。

【讨论】:

  • 当我添加这段代码时,它将添加两个 json 文件之一,当我执行 TF 应用时,只添加了两个 json 文件之一。如果我再次运行应用程序,它会看到变化,而不是用列表中的下一个替换第一个 json 文件,如果我运行应用程序,它会一遍又一遍地替换。
  • 所以我能够使用您的确切代码..在这里和那里进行调整以使用“aws_iam_role_policy_attachment”资源添加 >1 AWS 托管策略。很明显你的代码很好,但它在内联策略中的处理方式很奇怪。
  • @Randal 感谢您告诉我。我添加了一个关于aws_iam_role_policy_attachment 的注释,带有一个链接。如果答案有帮助,我们将不胜感激。
  • 好的,我看看我能想出什么...感谢所有帮助
猜你喜欢
  • 2023-01-05
  • 2021-05-20
  • 2020-04-02
  • 1970-01-01
  • 2022-12-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
相关资源
最近更新 更多