Terraform过滤器以检索键值

时间:2020-08-30 06:45:05

标签: terraform terraform-provider-aws

从状态文件中的Terraform代码块中,我需要 编写一个指向“ dev-devic-efs”的过滤条件,并提取值“ arn:aws:kms:eu-east-1:144382646821:key / e1652537-a360-4086-813d-4fc6668425a6” 任何有关如何执行此过滤器的帮助将不胜感激。谢谢

--no-edit

1 个答案:

答案 0 :(得分:0)

Terraform在配置的状态存储后端中存储的状态快照主要用于其自身使用,而不是用于外部使用。您在此处共享的值使用一种特殊的值编码,该编码保留值旁边的Terraform语言类型(嵌套对象),Terraform使用它来解决Terraform Language类型系统是JSON的超集这一事实。

我建议在此处解决基本问题的方法是将数据显式发布到与该配置的状态快照分开的某个位置。例如,您可以将这些信息以JSON格式直接发布到为此单独指定的单独的S3存储桶/密钥中:

resource "aws_s3_bucket_object" "example" {
  bucket = "example"
  key    = "efs_keys"

  content = jsonencode({
    alias = { for k, o in aws_kms_alias.efs : k => o.arn }
  })
}

您正在编写的用于消耗这些数据的程序可以从efs_keys存储桶中读取example对象,并直接获取所需的数据,而不必首先从Terraform的内部状态快照中提取数据格式。


话虽如此,如果您对状态文件格式进行反向工程,则可以 从状态文件中提取该文件。该复合对象的value属性将与上面的示例中生成的jsonencode相匹配,因此一旦将其放置在状态快照中,就可以用相同的方式使用它。

这里的警告是,将来的Terraform版本可能会以影响下游程序的方式更改此格式的详细信息。这种格式不会频繁更改,但是在Terraform的生命周期内,由于对输出值在Terraform语言中的工作方式进行了更改,因此输出值的存储已发生了至少三倍的更改,因此它可能会在出于类似原因的未来。如果是这样,则作为升级Terraform的一部分,您需要更新使用此数据的程序以支持新格式。