当使用terraform构建mongodb atlas集群时,如何通过vault使用动态秘密



当terraform连接到atlas时,我试图让我的terraform(管理我们的mongo atlas基础设施)使用动态秘密(通过vault,目前在本地主机上运行),但我似乎无法让它工作。

我找不到任何关于如何做到这一点的例子,所以我把一个示例github repo放在一起,展示了我到目前为止尝试做的几件事。

所有的魔力都包含在这3个提供程序文件中。我有使用静态密钥连接到atlas的标准方法(即使这些密钥通过vault作为临时API密钥生成),请参见provider1.tf

问题来了,当我试图使用地图库秘密引擎的地形与蒙古地图库提供程序。根本没有例子!

我的问题是如何使用atlas vault秘密引擎来生成和使用临时密钥,当使用terraform提供基础设施时?

我已经尝试了两种不同的方式来连接提供程序,参见fileprovider2。Tf和provider3。Tf,代码复制到这里:

provider2.tf

provider "mongodbatlas" {
public_key = vault_database_secrets_mount.db.mongodbatlas[0].public_key
private_key  = vault_database_secrets_mount.db.mongodbatlas[0].private_key
}
provider "vault" {
address = "http://127.0.0.1:8200"
}
resource "vault_database_secrets_mount" "db" {
path = "db"
mongodbatlas {
name = "foo"
public_key = var.mongodbatlas_org_public_key
private_key = var.mongodbatlas_org_private_key
project_id = var.mongodbatlas_project_id
}
}

provider3.tf

provider "mongodbatlas" {
public_key = vault_database_secret_backend_connection.db2.mongodbatlas[0].public_key
private_key  = vault_database_secret_backend_connection.db2.mongodbatlas[0].private_key
}
resource "vault_mount" "db1" {
path = "mongodbatlas01"
type = "database"
}
resource "vault_database_secret_backend_connection" "db2" {
backend       = vault_mount.db1.path
name          = "mongodbatlas02"
allowed_roles = ["dev", "prod"]
mongodbatlas {
public_key = var.mongodbatlas_org_public_key
private_key = var.mongodbatlas_org_private_key
project_id = var.mongodbatlas_project_id
}
}

两种方法给出相同类型的错误:

mongodbatlas_cluster.cluster-terraform01: Creating...
╷
│ Error: error creating MongoDB Cluster: POST https://cloud.mongodb.com/api/atlas/v1.0/groups/10000000000000000000001/clusters: 401 (request "") You are not authorized for this resource.
│
│   with mongodbatlas_cluster.cluster-terraform01,
│   on main.tf line 1, in resource "mongodbatlas_cluster" "cluster-terraform01":
│    1: resource "mongodbatlas_cluster" "cluster-terraform01" {

任何指示或示例将不胜感激

多谢

一旦你设置并启动了vault,启用了mongodbatlas,添加了配置和角色到vault,使用vault创建的动态临时密钥将terraform连接到atlas实际上相当容易。

首先运行以下命令在本地启动和配置vault:

vault server -dev
export VAULT_ADDR='http://127.0.0.1:8200'
vault secrets enable mongodbatlas
# Write your master API keys into vault
vault write mongodbatlas/config public_key=org-api-public-key private_key=org-api-private-key
vault write mongodbatlas/roles/test project_id=100000000000000000000001 roles=GROUP_OWNER ttl=2h max_ttl=5h cidr_blocks=123.45.67.1/24

现在将保险库提供程序和数据源添加到您的地形配置:

provider "vault" {
address = "http://127.0.0.1:8200"
}
data "vault_generic_secret" "mongodbatlas" {
path = "mongodbatlas/creds/test"
}

最后,使用保险库数据源提供的密钥添加mongodb提供程序:

provider "mongodbatlas" {
public_key  = data.vault_generic_secret.mongodbatlas.data["public_key"]
private_key = data.vault_generic_secret.mongodbatlas.data["private_key"]
}

完整的示例如下:github repo