【问题标题】:How. to iterate list(map(list)) in terraform如何。在 terraform 中迭代 list(map(list))
【发布时间】:2021-05-26 12:15:03
【问题描述】:

我想在 s3 中创建文件(密钥)。通过以下代码,我可以在 s3 中成功创建文件 -

locals {
  rules = [
  {
    user = "user-1",
    roles = "test"
  }
}

resource "aws_s3_bucket_object" "this" {

  for_each    = zipmap(local.rules.*.user, local.rules.*)
   bucket      = "test-09129"
   acl         = "private"
   source      = "/dev/null"
   key         = "${each.value.roles}/${each.key}"
}

s3 中的文件 - 创建了 test/user-1

但角色可以是多个,所以我为角色创建列表。

locals {
  rules = [
  {
    user = "user-1",
    roles = ["test"]
  },
  {
    user = "user-2",
    roles = ["test", "dev", "prd"]
  }]
}

现在我想根据上面的列表创建文件。如何迭代列表(角色)以根据用户和角色创建文件? 渴望输出 -

file in s3 -
test/user-1 
test/user-2 
dev/user-2
prd/user-2

【问题讨论】:

  • 该错误与您的本地无关。您在roles_associate 中使用的全部资源是什么?
  • 我正在使用 aws_s3_bucket_object 资源。
  • 如果勾选docs,则aws_s3_bucket_object中没有roles_associate,这会导致你的错误。
  • 我想,动态块可以在任何资源中使用。我正在更新问题,请问您有什么解决方案。
  • 动态块只能用于给定资源支持的块。在您的情况下,您在 aws_s3_bucket_object 中使用未知块。

标签: list amazon-web-services amazon-s3 foreach terraform


【解决方案1】:

您可以将您的 rules 扁平化为 helper_rules(假设我正确理解您想要的结果):


locals {
  rules = [
  {
    user = "user-1",
    roles = ["test"]
  },
  {
    user = "user-2",
    roles = ["test", "dev", "prd"]
  }]
  
  
  helper_rules = merge([
      for user, rules in zipmap(local.rules.*.user, local.rules.*.roles):
         { for rule in rules:
           "${user}-${rule}" => {user = user, rule = rule}
         }
  ]...)
}

这将导致helper_rules:

{
  "user-1-test" = {
    "rule" = "test"
    "user" = "user-1"
  }
  "user-2-dev" = {
    "rule" = "dev"
    "user" = "user-2"
  }
  "user-2-prd" = {
    "rule" = "prd"
    "user" = "user-2"
  }
  "user-2-test" = {
    "rule" = "test"
    "user" = "user-2"
  }
}

这样,您的对象可能是:

resource "aws_s3_bucket_object" "this" {

  for_each     = local.helper_rules
   bucket      = "test-09129"
   acl         = "private"
   source      = "/dev/null"
   key         = "${each.value.role}/${each.value.user}"
}

【讨论】:

  • @lucy 这意味着您在问题中的local.rules 可能与您实际拥有的不同。我自己运行代码,并且展平工作,因此我可以发布它的结果。
  • 很棒的人。你真的是专家。一个问题 helper_rules 中的 3 个点是什么?
  • @lucy 没问题。点是参数扩展。所以merge([a,b,c]...) 变成了merge(a,b,c)
猜你喜欢
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 2019-03-12
相关资源
最近更新 更多