You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 10:43:07