如何在 Terraform 中传递凭据?

Ale*_*nov 5 terraform

我有两个选项可以将凭据传递给 terraform 提供商:

  1. 设置 ENV 变量,如FOO_PROVIDER_USERNAME& FOO_PROVIDER_PASSWORD。更新:并从提供者源代码中的 ENV 读取它们,这样*.tf文件中就没有用户名/密码变量。
  2. 在提供程序中显式设置它:
provider "foocloud" {
  username = "admin@foocloud.org"
  password = "coolpass"
}
Run Code Online (Sandbox Code Playgroud)

我应该选择#1 还是#2?我对#2 的担忧是这些用户名/密码可能会保存到状态文件中,这是一个安全问题。

Laz*_*val 6

编辑:这通常用于管理资源中的秘密:

几周前,我看到了 Yevgeniy Brikman 写的这篇很棒的文章:

https://blog.gruntwork.io/a-compressive-guide-to-managing-secrets-in-your-terraform-code-1d586955ace1

在您提到的两个选项中,请选择选项 1(如您所说,选项 2 会将它们写入状态文件),但您应该将变量设置为敏感。

例子:

# main.tf

resource "foocloud" {
  name     = "foobar"
  
  username = var.username
  password = var.password
}

# variables.tf

variable "username" {
  description = "foobar"
  type        = string
  sensitive   = true
}

variable "password" {
  description = "foobar"
  type        = string
  sensitive   = true
}

# command line or in text file

export TF_VAR_username=foo
export TF_VAR_password=bar
Run Code Online (Sandbox Code Playgroud)

编辑:在对 AWS 等云提供商进行身份验证的情况下,您可以在其他选项中使用凭证文件,如下所述:

https://blog.gruntwork.io/authenticating-to-aws-with-the-credentials-file-d16c0fbcbf9e

  • 这回答了提供程序或资源不自动支持使用没有“TF_VAR_”前缀的环境变量的情况,但没有说明当提供程序支持本机环境变量时为什么要这样做,很大程度上遵循底层 SDK(例如AWS提供商)。对于这种情况,几乎总是最好选择第一个选项,根本不定义变量,因为这样它还可以利用提供凭证的整个链(例如 EC2 IMDS、“~/.aws/credentials”、AWS SSO 或 AWS-避难所) (2认同)