如何通过AWS CDK/Terraform/CloudFormation将AWS Secrets传递给Elastic DocumentDB集群?
如何通过AWS CDK/Terraform/CloudFormation将AWS Secrets传递给Elastic DocumentDB集群?
我完全懂你的困惑——Elastic DocumentDB的L1构造(不管是CDK还是CloudFormation)文档确实没讲透authType和密码配置这块,我之前踩过类似的坑,给你梳理清楚所有关键点:
先搞懂authType两个值的本质
- PLAIN_TEXT:就是直接明文传递管理员密码,这时候
adminUserPassword要填实际的密码字符串(确实不安全,不建议在生产环境用)。 - SECRET_ARN:用AWS Secrets Manager存储的凭证来管理密码,这时候
adminUserPassword不是填密码本身,而是填Secrets Manager密钥的ARN——但有个前提:这个密钥的结构必须符合Elastic DocDB的要求,得包含username和password两个字段。
解决CloudFormation的必填字段报错
你遇到的“省略adminUserPassword就报错”的问题,是因为CloudFormation的实际要求比CDK文档更严格:不管authType选哪个,adminUserPassword都是必填项——选PLAIN_TEXT时填明文密码,选SECRET_ARN时填密钥ARN。CDK文档标注为“可选”是滞后了,以CloudFormation的实际要求为准。
CDK的正确实现步骤
1. 创建符合要求的Secrets Manager密钥
首先要生成包含username和password字段的密钥,Elastic DocDB会自动读取这两个值配置集群管理员:
import * as cdk from 'aws-cdk-lib'; import * as secretsmanager from 'aws-cdk-lib/aws-secretsmanager'; import * as docdbelastic from 'aws-cdk-lib/aws-docdbelastic'; export class DocDbElasticStack extends cdk.Stack { constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); // 创建符合Elastic DocDB格式的密钥 const docDbSecret = new secretsmanager.Secret(this, 'DocDbElasticSecret', { secretName: 'docDbElasticClusterSecret', generateSecretString: { // 固定用户名模板 secretStringTemplate: JSON.stringify({ username: 'myAdmin' }), // 自动生成密码字段 generateStringKey: 'password', passwordLength: 16, // 排除DocDB密码不允许的特殊字符 excludeCharacters: '"@/\\', }, });
2. 配置Elastic DocDB集群
把authType设为SECRET_ARN,adminUserPassword填密钥的ARN,同时确保adminUserName和密钥里的用户名一致(避免冲突):
// 创建Elastic DocDB集群 const elasticCluster = new docdbelastic.CfnCluster(this, 'ElasticCluster', { clusterName: 'myCluster', shardCapacity: 2, shardCount: 2, authType: 'SECRET_ARN', // 这里填密钥ARN,不是密码 adminUserPassword: docDbSecret.secretArn, // 和密钥里的用户名保持一致 adminUserName: 'myAdmin', }); // 可选:授予集群读取密钥的权限(部分场景下默认已有,但保险起见加上) docDbSecret.grantRead(elasticCluster.grantPrincipal); } }
Terraform的对应实现
步骤和CDK一致,核心是确保密钥结构正确,传递ARN而非密码:
1. 创建密钥
# 生成随机密码 resource "random_password" "docdb_elastic" { length = 16 special = true override_special = "@_-" } # 创建Secrets Manager密钥 resource "aws_secretsmanager_secret" "docdb_elastic" { name = "docDbElasticClusterSecret" } # 写入符合要求的密钥内容 resource "aws_secretsmanager_secret_version" "docdb_elastic" { secret_id = aws_secretsmanager_secret.docdb_elastic.id secret_string = jsonencode({ username = "myAdmin" password = random_password.docdb_elastic.result }) }
2. 创建集群
resource "aws_docdb_elastic_cluster" "example" { cluster_name = "myCluster" shard_capacity = 2 shard_count = 2 auth_type = "SECRET_ARN" # 传递密钥ARN admin_user_password = aws_secretsmanager_secret.docdb_elastic.arn admin_username = "myAdmin" }
常见误区提醒
- 不要把
adminUserPassword填成密码字符串(在SECRET_ARN模式下),必须填密钥ARN; - 密钥必须包含
username和password两个字段,否则集群创建会失败; - 不要依赖CDK文档里的“可选”标注,CloudFormation实际要求
adminUserPassword必填。
备注:内容来源于stack exchange,提问作者Exter
相关产品推荐
相关产品推荐

