【问题标题】:Terraform 12 How to convert for_each data sources into list and mapTerraform 12 如何将for_each数据源转换成list和map
【发布时间】:2020-08-22 10:46:54
【问题描述】:

我正在使用 terraform 12,我的问题是我猜我误解了一个纯粹的 terraform 语法。

我正在从数据源对象中的 for_each 循环中获取 AWS KMS 密钥,如下所示:

data "aws_kms_key" "kms_key" {
  for_each = toset(var.partners) //partners is a list of string ["test","test2"]
  key_id = "alias/aws/s3" //just for the example, it really gets cutom KMS key here
}

然后,我尝试为合作伙伴列表中的每个值创建一个 S3 存储桶,并关联其特定的 KMS 密钥:

resource "aws_s3_bucket" "bucket" {
  for_each = local.kms_key_binding
  bucket   = "bucket-${each.key}"
  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        kms_master_key_id = each.value.arn
        sse_algorithm     = "aws:kms"
      }
    }
  }
}

您可以在 s3 存储桶 for_each 循环中看到我使用的局部变量如下所示:

locals {
  kms_key_binding = zipmap(var.partners,data.aws_kms_key.kms_key)
}

这是我被阻止的地方。我尝试了很多东西,但没有任何效果。我需要的是一张地图,其中的键是合作伙伴列表中的值(例如测试),键的 ARN 是数据 kms_key 中的键。

你能帮我吗?

我得到的错误表明数据 kms_key 不被视为列表,而是具有属性的对象。如何从中获取列表以使用所需的键/值对制作地图?

|----------------
    | data.aws_kms_key.kms_key is object with 2 attributes
    | var.partners is list of string with 2 elements

Call to function "zipmap" failed: number of keys (2) does not match number of
values (1).

谢谢!

【问题讨论】:

    标签: amazon-web-services amazon-s3 foreach terraform terraform0.12+


    【解决方案1】:

    我通过创建一个局部变量来解决这个问题,如下所示:

    kms_key_list = [
      for kms_key in data.aws_kms_key.kms_key : {
        arn = kms_key.arn
      }
    ]
    
    kms_key_binding = zipmap(var.partners,local.kms_key_list)
    

    【讨论】:

      猜你喜欢
      • 2020-08-31
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多