Terraform:如何使用键值输出

问题描述

我已经为我的问题研究了一个可能的解决方案,但似乎我的更具体。

所以,我有一个由 aws_kms_key 表达式创建的资源 for_each

for_each = { for keys in var.parameters : keys.name => keys if local.secrets.init.self == true }

没什么特别的,一切正常,但是我不知道如何使用已创建密钥的输出 arn。这是我的输出:

output "key" {
   description = "The 'Amazon Resource Name (ARN)' of 'KMS' key(s)"
   value       = zipmap( 
     values(aws_kms_alias.global)[*].name,values(aws_kms_key.global)[*].arn
   )
}

我之前使用过 for 表达式,但在这种情况下,我必须使用索引来分配 kms 键的 arn,这显然不好甚至不可接受的做法。这是我的旧输出方式:

output "key" {
   description = "The 'Amazon Resource Name (ARN)' of 'KMS' key(s)"
   value       = [ for key,value in aws_kms_key.global : value.arn ]
}

Usage

flowlog_encryption  = [{
  keys            = element(module.secrets.*.key,0)[0]
  retention       = 14
}]

“旧” 方式的问题是,创建资源时我只能使用索引访问,并且当某些内容发生变化时,索引的顺序也会发生变化,所以当我创建时dynamodbflowlogs 的密钥,dynamodb 采用 flowlogs 的密钥,flowlogs 采用 dynamodb 的密钥,完全随机行为。

解决方法

您的新输出 key,即使用 zipmap 的输出,将生成一个带有别名键和键 arn 的相应值的映射。这将是以下内容:

output "key" {
   description = "The 'Amazon Resource Name (ARN)' of 'KMS' key(s)"
   value       = {
        alias_name1 = key_arn1
        alias_name2 = key_arn2
        alias_name3 = key_arn3
   }
}

假设 module.secrets.key 是上面的输出键,您可以按如下方式使用它:

flowlog_encryption  = [{
  keys            = module.secrets.key["alias_name1"]
  retention       = 14
}]

或使用lookup

flowlog_encryption  = [{
  keys            = lookup(module.secrets.key,"alias_name1","default_key_arn")
  retention       = 14
}]

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...