Terraform创建MongoDB Atlas集群无法生成标准格式连接字符串
如何用Terraform生成完整的MongoDB Atlas连接字符串
问题场景
用Terraform创建MongoDB Atlas集群后,输出的连接字符串缺少用户名、密码、数据库名和必要参数,格式如下:
mongodb+srv://esc-app-dbcluster-devel.b59mwv7.mongodb.net
而实际需要的完整格式为:
mongodb+srv://admin:admin@esc-app-dbcluster-devel.b59mwv7.mongodb.net/development?retryWrites=true&w=majority
用户的Terraform代码:
terraform { required_providers { mongodbatlas = { source = "mongodb/mongodbatlas" version = "1.4.6" } } } provider "mongodbatlas" { public_key = var.atlas_public_key private_key = var.atlas_private_key } resource "mongodbatlas_cluster" "db-cluster" { project_id = var.atlas_project_id name = var.db_cluster_name # Provider Settings "block" provider_name = "TENANT" //free tier backing_provider_name = "AWS" provider_region_name = "US_EAST_1" //free tier provider_instance_size_name = "M0" //free tier } resource "mongodbatlas_database_user" "dbuser" { username = var.db_user password = var.db_password project_id = var.atlas_project_id auth_database_name = "admin" roles { role_name = "readWrite" database_name = var.environment } } resource "mongodbatlas_project_ip_access_list" "test" { project_id = var.atlas_project_id cidr_block = var.cidr } output "db_cn_string" { value = mongodbatlas_cluster.db-cluster.connection_strings.0.standard_srv }
连接代码示例:
const environment = process.env.ENVIRONMENT; const uridb = "mongodb+srv://admin:admin@esc-app-dbcluster-devel.b59mwv7.mongodb.net/development?retryWrites=true&w=majority" // working format //dburi = "mongodb+srv://esc-app-dbcluster-devel.b59mwv7.mongodb.net" --- format from terraform console.log('environment:::::', environment); let ENVIRONMENT_VARIABLES = { 'process.env.ENVIRONMENT': JSON.stringify(environment), 'process.env.PORT': JSON.stringify('80'), 'process.env.MONGO_CONNECTION_STRING': JSON.stringify(uridb) };
解决方案
通过Terraform的字符串插值或format函数,将用户名、密码、目标数据库名和参数拼接进基础连接字符串即可:
方法1:字符串直接插值
修改output块为:
output "db_cn_string" { value = "mongodb+srv://${var.db_user}:${var.db_password}@${replace(mongodbatlas_cluster.db-cluster.connection_strings.0.standard_srv, "mongodb+srv://", "")}/${var.environment}?retryWrites=true&w=majority" }
这里用replace函数去掉原连接字符串的mongodb+srv://前缀,避免重复拼接。
方法2:使用format函数(更易读)
output "db_cn_string" { value = format( "mongodb+srv://%s:%s@%s/%s?retryWrites=true&w=majority", var.db_user, var.db_password, replace(mongodbatlas_cluster.db-cluster.connection_strings.0.standard_srv, "mongodb+srv://", ""), var.environment ) }
特殊字符处理
如果密码包含@、:、/等特殊URL字符,需要用urlencode函数转义,防止连接字符串失效:
output "db_cn_string" { value = format( "mongodb+srv://%s:%s@%s/%s?retryWrites=true&w=majority", var.db_user, urlencode(var.db_password), replace(mongodbatlas_cluster.db-cluster.connection_strings.0.standard_srv, "mongodb+srv://", ""), var.environment ) }
验证
执行terraform apply后,输出的db_cn_string就会是符合要求的完整连接字符串,可直接用于代码中的MONGO_CONNECTION_STRING变量。
内容的提问来源于stack exchange,提问作者randomuser
相关产品推荐
相关产品推荐

