如何将HashiCorp Vault的密码传递给Terraform EC2实例

55次阅读
没有评论

问题描述

想知道如何在创建EC2实例时,将HashiCorp Vault的密码传递给Terraform。用户不希望以明文方式传递密码。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

最简单的方法是使用Terraform Vault Provider。这是一个Terraform的插件,可以与HashiCorp Vault集成,用于获取和管理Vault中的机密信息。以下是使用Terraform Vault Provider的示例:
1. 首先,确保已安装Terraform Vault Provider。可以通过在Terraform配置文件中添加以下内容来安装:

provider "vault" {
  # It is strongly recommended to configure this provider through the
  # environment variables described above, so that each user can have
  # separate credentials set in the environment.
  #
  # This will default to using $VAULT_ADDR
  # But can be set explicitly
  # address = "https://vault.example.net:8200"
}
  1. 然后,在Terraform配置文件中定义一个vault_generic_secret资源,用于从Vault中获取机密信息。以下是一个示例:
resource "vault_generic_secret" "example" {
  path      = "secret/foo"
  data_json = <<EOT
{
  "foo":   "bar",
  "pizza": "cheese"
}
EOT
}

在上面的示例中,我们定义了一个名为examplevault_generic_secret资源,它将从Vault的secret/foo路径获取机密信息。你可以根据自己的需求修改路径和数据。

方案2

如果你不想使用Terraform Vault Provider,你可以编写一个脚本来从Vault中获取机密信息,并在Terraform中使用local-exec来调用该脚本。以下是一个示例:
1. 首先,编写一个脚本,使用你熟悉的编程语言从Vault中获取机密信息。例如,使用Python编写一个脚本get_secrets.py

import requests

def get_secrets():
    # Make a request to Vault API to get secrets
    response = requests.get("https://vault.example.com/secrets")
    secrets = response.json()

    # Process the secrets and return them
    return secrets

secrets = get_secrets()
print(secrets)
  1. 然后,在Terraform配置文件中使用local-exec来调用该脚本,并将机密信息传递给Terraform。以下是一个示例:
resource "aws_instance" "web" {
  # ...

  provisioner "local-exec" {
    command = "python get_secrets.py"
    environment = {
      SECRET_USERNAME = "${var.secret_username}"
      SECRET_PASSWORD = "${var.secret_password}"
    }
  }
}

在上面的示例中,我们使用local-exec来调用get_secrets.py脚本,并将机密信息作为环境变量传递给Terraform。你可以根据自己的需求修改脚本和环境变量。
请注意,使用local-exec调用外部脚本可能会增加复杂性,并且需要确保脚本的安全性和正确性。

正文完