如何在 terraform 中提取敏感的输出变量?

Vla*_*mir 5 secret-key terraform

我有一个 terraform 配置,它使用访问密钥创建一个 AWS IAM 用户,并将 id 和 secret 分配给输出变量:

...

resource "aws_iam_access_key" "brand_new_user" {
  user = aws_iam_user.brand_new_user.name
}

output "brand_new_user_id" {
  value = aws_iam_access_key.brand_new_user.id
}

output "brand_new_user_secret" {
  value     = aws_iam_access_key.brand_new_user.encrypted_secret
  sensitive = true
}

Run Code Online (Sandbox Code Playgroud)

这里brand_new_user_secret被声明为敏感的,所以terraform output显然不打印它。

有没有办法在不解析整个状态文件的情况下获取其输出值?尝试直接访问它 ( terraform output brand_new_user_secret) 不起作用(导致错误“在状态文件中找不到请求的输出变量...”)。

地形版本:0.12.18

Yur*_*rik 22

要以交互方式查看敏感值,即出于分析/调试状态的目的,您可以使用 Terraform 的控制台命令nonsensitive()函数:

$ terraform console

> nonsensitive(aws_iam_access_key.brand_new_user.encrypted_secret)
Run Code Online (Sandbox Code Playgroud)

在打印之前,您可能需要使用其他函数来解码/操作该值。


Vla*_*mir 10

我有一些希望避免它,但到目前为止我没有找到比解析 terraform state 更好的方法:

terraform state pull | jq '.resources[] | select(.type == "aws_iam_access_key") | .instances[0].attributes'
Run Code Online (Sandbox Code Playgroud)

这将导致类似于以下的结构:

{
  "encrypted_secret": null,
  "id": "....",
  "key_fingerprint": null,
  "pgp_key": null,
  "secret": "....",
  "ses_smtp_password": "....",
  "ses_smtp_password_v4": null,
  "status": "Active",
  "user": "...."
}
Run Code Online (Sandbox Code Playgroud)


小智 8

如果指定了单个输出,则输出命令会打印敏感输出。这是使用 Terraform v1.1.7 和 0.14.8

terraform output brand_new_user_secret
Run Code Online (Sandbox Code Playgroud)

未指定属性名称时得到的响应是:

brand_new_user_secret = (sensitive)
Run Code Online (Sandbox Code Playgroud)

而问题说这产生了一个错误,因此行为自 0.12 以来可能已经改变。

请参阅https://www.terraform.io/cli/commands/output


小智 6

我在这里使用一个像这样的黑客解决方法......

resource "aws_iam_access_key" "brand_new_user" {
  user = aws_iam_user.brand_new_user.name
}

output "brand_new_user_id" {
  value = aws_iam_access_key.brand_new_user.id
}

data "template_file" "secret" {
  template = aws_iam_access_key.brand_new_user.encrypted_secret
}

output "brand_new_user_secret" {
  value     = data.template_file.secret.rendered
}

Run Code Online (Sandbox Code Playgroud)