使用terraform配置检查从terraform中提取原始(非字符串)参数值



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

注意:从terraform文档开始,但后来发现它在下面使用了什么,以及它的terraform配置检查库。

问题是,我想超越目前terraform配置检查提供的开箱即用功能:

例如,我想获得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.deeployment}的部分。

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

"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",
...
}

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

所以问题是:

  • 有没有可能从地形资源中获得真正的原始价值,这样我就可以获得"${var.deeployment}/shared/${var.service_name}/security_group_id">
  • 也许还有其他工具

提前感谢!

Terraform中的输入变量是一个规划选项,因此要完全解决这些问题,需要创建Terraform计划。如果能够创建Terraform计划,则可以使用以下步骤在计划的JSON序列化中找到解析值:

  • 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和这些变量的一些硬编码占位符值,以便为该参数获得值,该值源自您在自己构造的hcl.EvalContext中设置var.deploymentvar.service_name的任何值。

最新更新