使用 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 资源中获取真实的原始值,以便我可以获得 "/${var.deployment}/shared/${var.service_name}/security_group_id" 在 json 输出中?
- 也许还有其他工具?
提前致谢!
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.deployment
和 var.service_name
的任何内容。
我正在尝试使用 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 资源中获取真实的原始值,以便我可以获得 "/${var.deployment}/shared/${var.service_name}/security_group_id" 在 json 输出中?
- 也许还有其他工具?
提前致谢!
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.deployment
和 var.service_name
的任何内容。