使用 terraform 构建 mongodb atlas 集群时,如何通过保管库使用动态机密

When using terraform to build a mongodb atlas cluster how do i use dynamic secrets through vault

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

我找不到有关如何执行此操作的任何示例,因此我整理了一个示例 github repo,展示了到目前为止我尝试过的一些事情。

所有的魔法都包含在 3 个提供程序文件中。我有使用静态密钥连接到 atlas 的标准方法(即使上述密钥通过保险库生成为临时 API 密钥)请参阅 provider1.tf

当我尝试使用 atlas vault secret engine for terraform along with the mongo atlas provider 时出现问题。就是没有例子!

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

我已经尝试了两种不同的连接提供者的方法,请参阅文件 provider2.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

现在将保管库提供程序和数据源添加到您的 Terraform 配置中:

provider "vault" {
  address = "http://127.0.0.1:8200"
}

data "vault_generic_secret" "mongodbatlas" {
  path = "mongodbatlas/creds/test"
}

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

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

example github repo

中的完整示例显示了这一点