问题描述
我在Terraform代码中具有以下Terraform配置
data "external" "region" {
program = ["sh","test.sh"]
query = {
aws_region = var.aws_region
vault_url = var.vault_url
vault_role = var.vault_role
}
}
provider "vault" {
address = "http://3.218.2.138:8200"
token = data.external.region.result["vault_token"]
}
外部程序运行命令库登录-method = aws role = test-role,然后返回库令牌。
有没有一种方法可以避免此外部程序,并在我执行terraform apply和terraform show时使库令牌生成。
因此,基本上,有一种方法可以使外部脚本不被执行,并在不执行外部脚本的情况下获取库令牌。
解决方法
一种典型的方法是在运行Terraform之前先运行vault login
(或其他等效过程) ,然后让Terraform以与Vault客户端本身相同的方式读取这些环境凭证会。
尽管Terraform提供程序通常接受凭据作为其配置的一部分,以允许更复杂的情况,但是将凭据传递给Terraform提供程序的理想方法是通过所讨论系统的标准机制间接地传递。例如,Terraform AWS提供程序以与aws
CLI相同的方式理解如何读取凭证,并且Vault提供程序在与Vault CLI使用相同的环境变量中查找凭证。
使用集中式系统(如带有Terraform的Vault的系统)的团队通常会run Terraform in automation,以便可以对这些系统的配置进行集中化,而不是为在本地运行的每个用户重新实现。因此,即使Terraform操作本身失败,您的自动化脚本也可以在运行Terraform之前从Vault获取临时令牌,然后在Terraform返回后显式撤消该令牌。