目标: 将 Terraform 项目重新初始化到另一个工作站。
问题: Terraform 想要重新创建我的一个 TLS 密钥,因为它认为私钥存在差异。但是由于它是一个敏感文件,我无法看到差异,所以我很困惑。
- 我公司的Terraform repo 安装 TLS/SSL 证书/密钥进入 AWS 负载均衡器。
- 我必须将 Terraform 项目恢复到新的工作站(旧工作站已退役)。
- 证书和链存储在 repo 中。
- 私钥本身不会被签入到 git repo 中,但我们保留了多个安全备份。
证书声明如下:
resource "aws_iam_server_certificate" "test1_cert_renewed" {
name = "test1_cert_renewed"
certificate_body = file("${path.cwd}${var.test1_cert_renewed_cert}")
private_key = file("${path.cwd}${var.test1_cert_renewed_key}")
certificate_chain = file("${path.cwd}${var.test1_cert_renewed_chain}")
lifecycle {
create_before_destroy = true
}
}
一切都进展顺利,Terraform 项目在新工作站上恢复正常运行。但是,它想重新创建我的证书安装,因为它认为私钥不同。
在计划中,它只是说它会因为以下原因而重新创建:
~ private_key = (sensitive value)
这仅影响 5 个不同证书包中的一个这是关于这个文件的一些具体内容。
是否可以在 Terraform 输出中看到更多详细信息,以便我至少可以看到部分差异片段?
关于如何区分状态中的内容和文件中的内容,有什么建议吗?
我试过了terraform state pull
,确实看到了输出,但这是一个编码字符串。不太确定如何解码(如果可能的话)。
{
"mode": "managed",
"type": "aws_iam_server_certificate",
"name": "<<SCRUBBED>>",
"provider": "provider.aws",
"instances": [
{
"schema_version": 0,
"attributes": {
"arn": "arn:aws:iam::<<SCRUBBED>>",
"certificate_body": "<<SCRUBBED>>",
"certificate_chain": "<<SCRUBBED>>",
"id": "ASCA4DNFUOPYAQICRDU7O",
"name": "<<SCRUBBED>>",
"name_prefix": null,
"path": "/",
"private_key": "<<SCRUBBED string that was here (looked like encoded string), but it wasn't private key text>>"
},
"private": "<<SCRUBBED 5 character string SCRUBBED>>"
}
]
}
更多细节:
我已经检查了一些明显的事情,例如文件末尾/开头的换行符:
-----END PRIVATE KEY-----
相对
-----END PRIVATE KEY-----
答案1
如果 TF 存在差异,那是因为状态中被认为重要的字段与资源呈现的基础设施不同步。
AWS 中的此资源可能存在一些不同之处 - 也许它是在 TF 之外更改的?这可以解释为什么这个证书资源存在问题。
除此之外,请备份您的 TF 状态,然后使用以下命令从状态中删除此资源:
terraform state rm <resource path>
删除后,使用资源路径和 AWS 对象 ID(在您发布的状态文件中,该 ID 为 ASCA4DNFUOPYAQICRDU7O)导入所需的资源。这将使用 AWS 中描述的状态更新 TF,从而有效地将更改推向相反方向。如果您想要有关导入命令应该是什么样子的提示,请提供与此资源相关的清单代码,或通过以下方式显示已创建资源的当前路径:
terraform state list | grep test1_cert_renewed
通常,您需要导入路径和 ID。如果您未在此清单中使用任何子模块结构,则以下内容可能足以提示您:
terraform import aws_iam_server_cerificate.test1_cert_renewed ASCA4DNFUOPYAQICRDU7O
答案2
如您所见,正常terraform plan
输出隐藏了资源类型架构中标记为“敏感”的任何属性的实际值。
但是,隐藏该值纯粹是为了避免该值被保存在 Terraform 运行的日志等中。如果您将计划保存到计划文件中,然后要求 Terraform 将其呈现为 JSON,则可以查看它:
terraform plan -out=tfplan
terraform show -json tfplan
JSON 计划输出默认没有人类可读的布局,因此您可能希望通过类似的工具将其jq
解释为可读的形状,并且可能 - 如果您熟悉jq
表达式语法 - 仅提取您关心的特定部分。
请注意,tfplan
第一个命令创建的文件是二进制文件,其格式仅对 Terraform 有意义,但它做包含您的密钥值,因此您应该小心谨慎,仅在文件位于磁盘上不会导致值被泄露的系统上运行此命令。同样,JSON 计划输出将包含未隐藏的敏感值,因此如果您打算在终端中查看它,则应确保没有人“偷看”您的屏幕。