使用 terraform-config-inspect 从 terraform 中提取原始(非字符串)参数值

Posted

技术标签:

【中文标题】使用 terraform-config-inspect 从 terraform 中提取原始(非字符串)参数值【英文标题】:Extracting raw (non string) parameter values from terraform using terraform-config-inspect 【发布时间】:2022-01-12 01:49:54 【问题描述】:

我正在尝试使用 terraform-config-inspect (https://github.com/hashicorp/terraform-config-inspect) 从 terraform 模块生成 json。

注意:从 terraform-docs 开始,但后来发现它在下面使用的是 terraform-config-inspect 库。

问题是我想超越 terraform-config-inspect 目前提供的开箱即用功能:

例如,我想获取 aws_ssm_parameter 资源的名称。

例如,我有这样的资源:

resource "aws_ssm_parameter" "service_security_group_id" 
  name      = "/$var.deployment/shared/$var.service_name/security_group_id"
  type      = "String"
  value     = aws_security_group.service.id
  overwrite = "true"
  tags      = var.tags

我想提取 name 参数的值,但默认情况下它不输出此参数。我试图通过修改资源架构和其他部分来破解代码,但最终得到的是空字符串而不是名称值或错误,因为它包含像 $var.deployment 这样的部分。

当我将它设置为纯字符串时,我修改后的代码会返回我所期望的

"aws_ssm_parameter.service_security_group_id": 
  "mode": "managed",
  "type": "aws_ssm_parameter",
  "name": "service_security_group_id",
  "value": "/test-env/shared/my-service/security_group_id",
  "provider": 
    "name": "aws"
  

但在正常情况下它会失败并出现以下错误

 
  "severity": "error",
  "summary": "Unsuitable value type",
  "detail": "Unsuitable value: value must be known",
  ...
 

我知道我可以为我的特定用例构建完全定制的东西,但我希望有一些东西可以重复使用:)

所以问题是:

是否有可能从 terraform 资源中获取真正的原始值,以便我可以在 json 输出中获得 "/$var.deployment/shared/$var.service_name/security_group_id" ? 也许还有其他工具?

提前致谢!

【问题讨论】:

【参考方案1】:

Terraform 中的输入变量是 planning option,因此要完全解决它们需要创建 Terraform 计划。如果您能够创建 Terraform 计划,则可以使用以下步骤在 the JSON serialization of the plan 中找到已解析的值:

terraform plan -out=tfplan(如果您需要为这些变量设置特定值,可以选择包括 -var=...-var-file=...terraform show -json tfplan 获取计划的 JSON 表示形式。

或者,如果您已经应用了要分析的配置,那么您可以从最新状态快照的 JSON 表示中获得类似的信息:

terraform show -json 获取最新状态快照的 JSON 表示。

如您所见,terraform-config-inspect 仅用于***声明的静态分析,因此它不包含评估表达式的功能。

为了在此处正确评估表达式创建 Terraform 计划或从 Terraform 状态快照读取将需要重新实现 Terraform Core 运行时,至少在某种程度上是这样。但是,对于这个 特定 表达式(仅依赖于输入变量值),您可能会直接将 HCL API 与这些变量的一些硬编码占位符值一起使用,以获得 a em> 该参数的值,源自您在自己构造的 hcl.EvalContext 中碰巧将 var.deploymentvar.service_name 设置为的任何值。

【讨论】:

但是,TF 计划或表演对我不起作用。真正的情况是,我不希望变量被 TF 状态或计划中的真实值替换 -> 我完全想要相反的情况 - 完全不需要替换任何东西,就可以准确地获取 TF 代码中写的内容。如果我有“value = aws_security_group.service.id”,我不想从某个环境中看到真正的 SG ID -> 我想获得简单的字符串“aws_security_group.service.id” 原始源代码作为解析的一部分被丢弃,因此内存中没有数据结构可以直接为您提供,但如果您编写代码以找到相关的hcl.Expression,您可以调用@987654335 @ 方法找到它的源位置,然后使用 Range.SliceBytes 从原始源代码中获取该片段,您必须自己将其保留在内存中。这不是 HCL 旨在支持的东西,因此这是一种解决方法而不是解决方案。 会试一试,谢谢!目前我能够获得资源从资源“Pos”参数(类型:SourcePos)开始的TF文件名和行号。这样很容易从该行读取文件直到资源结束并解析相关数据。

以上是关于使用 terraform-config-inspect 从 terraform 中提取原始(非字符串)参数值的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)