我正在尝试使用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.deployment
和var.service_name
的任何值。