我在Terraform IaC代码中使用Vault提供程序:
provider "vault" {
address = var.vault_address
auth_login {
path = "auth/approle/login"
parameters = {
role_id = var.role_id
secret_id = var.secret_id
}
}
}
传递一个地址,如:https://www.vault.organization.com正确填写role_id和secret_id。当我通过HTTP请求请求令牌时,它工作,但在这个提供程序的情况下,我得到403 permission denied error,如下所示:
│ Error: failed to create limited child token: Error making API request.
│
│ URL: POST https://vault.organization.com/v1/auth/token/create
│ Code: 403. Errors:
│
│ * 1 error occurred:
│ * permission denied
│
│
│
│ with provider["registry.terraform.io/hashicorp/vault"],
│ on providers.tf line 23, in provider "vault":
│ 23: provider "vault" {
我的配置有什么问题?
Terraform version ">= 0.13"
Vault provider version "3.7.0"
这个问题源于Vault Provider需要创建一个中间/子令牌,由于策略在Terraform Provider中的设置方式,它没有权限,因此它总是会失败。
在最近的版本中,他们为skip_child_token
引入了解决这个问题的选项。(https://github.com/hashicorp/terraform-provider-vault/issues/29 # issuecomment - 988121638)
此外,似乎有一个未记录的要求,将名称空间放置在provider
和auth_login
块中,如果我不同时添加它们,我会得到403错误。
provider "vault" {
address = var.vault_address
namespace = "admin"
skip_child_token = true
auth_login {
path = "auth/approle/login"
namespace = "admin"
parameters = {
role_id = var.cms_vault_role_id
secret_id = var.cms_vault_secret_id
}
}
}
403错误不是来自路径auth/approle/login
,而是来自路径auth/token/create
。
Terraform将尝试创建一个子令牌,如果在环境中找到现有令牌。我认为你的脚本捡起了一个旧的令牌,它在到达你的代码之前就失败了。
试试这个(调整到你的环境):
- 从令牌助手(
rm -v ~/.vault-token
)中删除令牌 - 清除令牌环境变量(
unset VAULT_TOKEN
) - 用
vault print token
调试配置