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

Extracting raw (non string) parameter values from terraform using terraform-config-inspect

我正在尝试使用 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} 等部分。

当我将其设置为纯字符串时,我修改后的代码 returns 符合我的预期

"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 中的输入变量是 planning option and so to resolve them fully requires creating a Terraform plan. If you are able to create a Terraform plan then you can find the resolved values in 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 运行时。但是,对于这个 particular 表达式(仅依赖于输入变量值),您可以直接使用 HCL API 和这些变量的一些硬编码占位符值,以便获取该参数的 a 值,该值源自您在自己构建的 hcl.EvalContext 中碰巧设置 var.deploymentvar.service_name 的任何内容。