繁体   English   中英

Terraform 12 如何将for_each数据源转换成list和map

[英]Terraform 12 How to convert for_each data sources into list and map

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

我从数据源 object 中的 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)
}

这是我被阻止的地方。 我尝试了很多东西,但没有任何效果。 我需要的是有一个 map 作为密钥合作伙伴列表中的值(例如测试),并作为密钥的 ARN,它在数据 kms_key 中。

你能帮我吗?

我得到的错误表明数据 kms_key 不被视为列表,而是带有属性的 object。 我如何从中获取列表以使用我想要的键/值对制作 map?

|----------------
    | 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).

谢谢 !

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

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM