如何从本地/Cloud9连接VPC公有子网的DocumentDB实例
临时连接DocumentDB的CloudFormation方案及简便测试方法
核心问题梳理
你的DocumentDB为VPC内网部署无公网IP,本地无法直接访问;现有Cloud9 SSM连接失败大概率是VPC缺少SSM端点配置,临时测试推荐以下两种方案:
方案1:CloudFormation创建SSM跳板机(推荐,无密钥,安全)
通过CloudFormation快速部署一台带SSM管理权限的EC2作为跳板,无需暴露SSH端口,直接用SSM端口转发或终端连接DocumentDB。
CloudFormation模板(YAML)
替换模板中的占位符(YourVPCID、DocumentDBSG、YourPublicSubnetID)为实际资源ID,根据AWS区域替换Amazon Linux 2的AMI ID:
AWSTemplateFormatVersion: '2010-09-09' Description: Temporary EC2 Jump Host for DocumentDB Access via SSM Resources: # SSM管理所需IAM角色 EC2SSMRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: ec2.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore Path: "/" EC2SSMInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Roles: - !Ref EC2SSMRole # 跳板机安全组:允许出站访问DocumentDB及SSM服务 JumpHostSG: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Outbound access to DocumentDB and SSM VpcId: !Ref YourVPCID SecurityGroupEgress: - IpProtocol: tcp FromPort: 27017 ToPort: 27017 DestinationSecurityGroupId: !Ref DocumentDBSG - IpProtocol: "-1" CidrIp: 0.0.0.0/0 # 更新DocumentDB安全组,允许跳板机访问27017端口 DocumentDBIngressRule: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: !Ref DocumentDBSG IpProtocol: tcp FromPort: 27017 ToPort: 27017 SourceSecurityGroupId: !Ref JumpHostSG # 临时EC2跳板机(t2.micro免费可用) JumpHostEC2: Type: AWS::EC2::Instance Properties: InstanceType: t2.micro ImageId: ami-0c55b159cbfafe1f0 # Amazon Linux 2 AMI (us-east-1,按需替换区域对应AMI) IamInstanceProfile: !Ref EC2SSMInstanceProfile SecurityGroupIds: - !Ref JumpHostSG SubnetId: !Ref YourPublicSubnetID Tags: - Key: Name Value: DocDB-Temp-JumpHost Outputs: JumpHostInstanceId: Description: EC2 Instance ID for SSM Session Value: !Ref JumpHostEC2
使用步骤
- 部署上述CloudFormation栈,等待EC2实例启动完成。
- 本地端口转发方式(无需进入EC2终端):
- 确保本地安装并配置好AWS CLI(具备SSM操作权限)。
- 执行端口转发命令:
aws ssm start-session --target <EC2实例ID> --document-name AWS-StartPortForwardingSession --parameters '{"portNumber": ["27017"], "localPortNumber": ["27017"]}' - 新开本地终端,执行mongosh连接命令:
(添加# 下载CA证书 wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem # 连接DocumentDB mongosh "mongodb://localhost:27017" --tls --tlsCAFile rds-combined-ca-bundle.pem --username <你的用户名> --password <你的密码> --tlsAllowInvalidHostnames--tlsAllowInvalidHostnames是因为证书绑定DocumentDB端点域名,本地转发到localhost会触发域名校验)
- SSM终端连接方式:
- 进入AWS控制台 -> Systems Manager -> Session Manager,选择跳板机启动会话。
- 在终端内安装mongosh并连接:
# 安装mongosh curl -s https://downloads.mongodb.com/compass/mongosh-1.10.6-linux-x64.tgz | tar -xz -C /usr/local/bin --strip-components=1 mongosh-1.10.6-linux-x64/bin/mongosh # 下载CA证书 wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem # 连接DocumentDB mongosh "mongodb://<DocumentDB集群端点>:27017" --tls --tlsCAFile rds-combined-ca-bundle.pem --username <你的用户名> --password <你的密码>
方案2:临时开启DocumentDB公网访问(仅测试用,用完立即关闭)
直接给DocumentDB添加公网端点,无需跳板,但存在安全风险,测试后必须恢复配置。
CloudFormation修改片段
在现有DocumentDB集群资源中添加PubliclyAccessible: true,并更新安全组出站规则:
# 假设你的DocumentDB集群资源名为DocumentDBCluster DocumentDBCluster: Type: AWS::DocDB::DBCluster Properties: # 保留原有属性 PubliclyAccessible: true # 开启公网访问 # 更新DocumentDB安全组出站规则(原规则仅允许0.0.0.0/32,无法公网通信) DocumentDBEgressRule: Type: AWS::EC2::SecurityGroupEgress Properties: GroupId: !Ref DocumentDBSG IpProtocol: "-1" CidrIp: 0.0.0.0/0
使用步骤
- 更新CloudFormation栈,等待集群配置完成。
- 本地直接用mongosh连接DocumentDB的公网端点:
wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem mongosh "mongodb://<DocumentDB公网端点>:27017" --tls --tlsCAFile rds-combined-ca-bundle.pem --username <你的用户名> --password <你的密码> - 测试完成后,立即将
PubliclyAccessible改回false,并恢复安全组出站规则。
关键注意事项
- 你的DocumentDB已启用TLS,所有连接必须携带
--tls参数并指定CA证书。 - 测试结束后,务必销毁临时跳板机的CloudFormation栈,或恢复DocumentDB的公网访问及安全组配置,避免不必要的成本和安全隐患。
内容的提问来源于stack exchange,提问作者Garret Wilson
相关产品推荐
相关产品推荐

