如何通过 terraform 中的 mongodbatlas 提供程序获取完整的 uri,包括用户名和密码

And*_*ral 7 mongodb continuous-deployment continuous-delivery terraform mongodb-atlas

当我尝试使用 Terraform 和 mongodb atlas 提供程序输出 mongodb uri 时,我无法获取包含用户名和密码的完整 uri。例如,当我做类似的事情时:

terraform {
  required_version = "~> 0.14.7"

  required_providers {
    mongodbatlas = {
      source  = "mongodb/mongodbatlas"
      version = "0.8.2"
    }
  }
}

provider "mongodbatlas" {
  public_key  = var.mongodbatlas_public_key
  private_key = var.mongodbatlas_private_key
}

data "mongodbatlas_cluster" "db" {
  project_id = var.mongodbatlas_project_id
  name       = format("some-db-name-%s", var.env)
}

output "db_url" {
  value = data.mongodbatlas_cluster.db.connection_strings[0].address_srv
}
Run Code Online (Sandbox Code Playgroud)

我总是得到以下形式的 uri:mongodb+srv://some-db-name-staging.xjcol.mongodb.net 将其作为环境变量添加到我的 Web 应用程序中以连接到数据库不起作用,因为它需要使用用户名和密码进行身份验证。手动将用户名和密码添加到该字符串中mongodb+srv://[username]:[password]@some-db-name-staging.xjcol.mongodb.net,应用程序可以正常连接到数据库。

小智 2

虽然我明白你想要实现的目标,但我怀疑你在这里混合了东西。让我解释:

  • MongoDB 允许您创建能够使用密码进行身份验证的数据库用户。这些可以使用mongodbatlas_database_user资源创建。
  • 您可以按照您尝试实现的方式使用资源或数据源来创建集群(或源集群信息)。

但是,集群创建独立于数据库和数据库用户创建,这意味着您从 Terraform 获得的只是 Mongo 的通用连接字符串,甚至 Mongo 都不知道您想要连接到哪个用户/数据库。

我建议您编写自己的连接字符串,并使用配置后脚本将其传递到您的应用程序,可以使用集群和数据库用户的 Terraform 输出,或者如果您已经预先了解信息,则可以自行编写。

如果您使用 AWS,MongoDB Atlas 支持使用 IAM 用户和 IAM 角色的连接字符串。与处理密码以及管理密码所带来的所有额外负担相比,这是一种更好、更安全的方法。如果这听起来像您想探索的东西,请告诉我。