Terraform通过Vault动态密钥配置MongoDB Atlas集群方法
配置错误根因
你之前两种配置返回401的核心原因有两个:
- 错误引用了密钥引擎配置块中存储的长期根API密钥字段,没有触发Vault 动态密钥生成逻辑,根本没有拿到临时凭证
- 完全缺失Vault数据库密钥引擎的角色配置环节:没有角色的情况下,Vault不知道要生成什么权限范围、多长有效期的临时密钥,动态密钥流程根本跑不通
正确可运行配置方案
整个配置流程分三步,必须按顺序配置,注意Terraform资源依赖关系:
1. 基础Provider与密钥引擎配置
先初始化Vault Provider,挂载Atlas对应的数据库密钥引擎,配置根API密钥连接,同时必须配置动态密钥角色:
# 初始化Vault Provider,连接本地运行的Vault服务 provider "vault" { address = "http://127.0.0.1:8200" # 本地测试可以直接填root token,生产环境用环境变量或者Vault代理注入 token = var.vault_token } # 挂载数据库类型的密钥引擎 resource "vault_mount" "atlas_engine" { path = "mongodbatlas" type = "database" } # 配置密钥引擎和MongoDB Atlas的连接,写入根级API密钥 resource "vault_database_secret_backend_connection" "atlas_conn" { backend = vault_mount.atlas_engine.path name = "atlas-connection" allowed_roles = ["atlas-terraform-role"] mongodbatlas { public_key = var.mongodbatlas_org_public_key private_key = var.mongodbatlas_org_private_key project_id = var.mongodbatlas_project_id } } # 配置动态密钥角色,定义临时密钥的权限、有效期 resource "vault_database_secret_backend_role" "atlas_role" { backend = vault_mount.atlas_engine.path name = "atlas-terraform-role" db_name = vault_database_secret_backend_connection.atlas_conn.name creation_statements = "{\"roles\": [\"ORG_OWNER\"]}" # 按实际需要缩权限,比如项目级用GROUP_OWNER default_ttl = "1h" max_ttl = "4h" }
2. 拉取动态生成的临时密钥
通过vault_database_secrets数据源,从配置好的角色处读取动态生成的临时API密钥对,注意显式加依赖保证前面的引擎、连接、角色配置先完成:
data "vault_database_secrets" "atlas_temp_creds" { backend = vault_mount.atlas_engine.path role = vault_database_secret_backend_role.atlas_role.name depends_on = [ vault_database_secret_backend_connection.atlas_conn, vault_database_secret_backend_role.atlas_role ] }
3. 配置MongoDB Atlas Provider使用临时密钥
把数据源拿到的动态密钥传给Atlas Provider,注意不要在这里直接引用未创建的Vault资源,必须用数据源输出的凭证:
provider "mongodbatlas" { public_key = data.vault_database_secrets.atlas_temp_creds.public_key private_key = data.vault_database_secrets.atlas_temp_creds.private_key depends_on = [ data.vault_database_secrets.atlas_temp_creds ] } # 后面就可以正常写Atlas集群等资源配置了 # resource "mongodbatlas_cluster" "cluster-terraform01" { ... }
配置注意事项
- 写入Vault的根Atlas API密钥,必须至少拥有目标项目的
Project Owner权限,如果要管理组织级资源需要Organization Owner权限,否则Vault生成的临时密钥会权限不足 - 角色里的
creation_statements要按实际最小权限原则配置,不要一直用ORG_OWNER - 第一次运行需要分阶段执行:先执行
terraform apply -target=vault_mount.atlas_engine -target=vault_database_secret_backend_connection.atlas_conn -target=vault_database_secret_backend_role.atlas_role把Vault侧的配置先推上去,再执行全量terraform apply,避免出现依赖错误 - 不要直接引用
vault_database_secret_backend_connection资源里的public_key/private_key字段,那是你配置进去的根密钥,不是动态生成的临时凭证
内容的提问来源于stack exchange,提问作者Damo
相关产品推荐
相关产品推荐

