问题描述
在使用terraform时,使用了terraform资源tls_private_key
生成了一个私钥,并将其推送到AWS,但是没有给出私钥的使用方法来访问相关资源。用户想知道如何恢复该私钥。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
如果你需要在后续步骤中使用这个私钥,常见的做法是将其作为根模块输出值返回。由于私钥是敏感信息,你可以将其标记为敏感信息,以防止Terraform默认在屏幕上显示它:
output "private_key" {
value = tls_private_key.example.private_key_pem
sensitive = true
}
当你运行terraform apply
时,Terraform会对该值进行遮蔽,因为它是敏感信息。然而,你仍然可以通过运行terraform output -raw private_key
从脚本中访问它,因为该值仍然存储在状态中,而sensitive
选项只是防止它在人类可读的输出中显示。(-raw
选项用于脚本中使用。)
方案2
使用
terraform state
命令可以显示资源,但敏感值不会在屏幕上显示。如果使用-json
选项,可以解除此限制,以json格式转储整个状态。
然后,你可以使用jq
来解析输出以找到该值。该值将带有引号和转义的换行符,你需要清理它们以获得正确格式的PEM密钥。jq
的-r
选项可以很好地处理这个问题,以原始格式转储该值。
terraform show -json | jq -r '.values.root_module.resources[].values | select(.private_key_pem) |.private_key_pem' > ~/.ssh/terraform_private_key.pem
在上面的jq
命令中,有三个部分。第一个部分将过滤到每个资源的值。第二个部分仅选择具有private_key_pem
键的值集。第三个部分打印这些特定键的值。select
防止对没有private_key_pem
键/值对的值集进行打印。
方案3
使用
private_key_openssh
选项
另一种选择是使用以下命令:
terraform show -json | jq -r '.values.root_module.resources[] | select(.address=="tls_private_key.ssh").values.private_key_openssh'
这个命令也使用了root_module.resources
,因为这是私钥创建的位置。这个地址对应于main.tf
中的以下内容:
resource "tls_private_key" "ssh" {
algorithm = "ECDSA"
ecdsa_curve = "P384"
}
在你的情况下,密钥可能有不同的名称和资源。你可以通过以下命令找出它在哪个资源中:
terraform show -json | jq -r | less
我选择不使用PEM格式,因为OpenSSH有自己的密钥格式,在某些情况下与PKCS#9(PEM)不同。例如,目前OpenSSH无法读取PKCS#9(PEM)格式的ed25519密钥。