Terraform 12如何将for_each数据源转换为列表和地图



我使用的是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 bucket,并关联它们的特定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 bucketfor_each循环中看到,我使用了一个局部变量,看起来像:

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

这就是我被挡住的地方。我尝试了很多方法,但都没用。我需要的是有一个映射,它的关键字是合作伙伴列表中的值(例如测试(,而关键字是数据kms_key中关键字的ARN。

你能帮我吗?

我得到的错误表明,数据kms_key不被视为列表,而是被视为具有attributs的对象。我如何从中获得一个列表来制作一个包含我想要的键/值对的映射?

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

最新更新