如何向私有隔离子网中的Aurora RDS实例应用迁移变更
方案与最佳实践:在私有子网Aurora PostgreSQL上应用Drizzle迁移
核心方案
1. 基于Bastion主机(Session Manager免公网方式)
私有子网的Aurora无法直接从公网访问,用Session Manager管理的Bastion主机是最直观的方式,无需给Bastion分配公网IP:
- 用CDK创建部署在目标私有子网的EC2实例,确保实例预装SSM Agent(Amazon Linux 2默认自带),并给实例IAM角色附加
AmazonSSMManagedInstanceCore权限。 - 本地通过AWS CLI执行
aws ssm start-session --target <实例ID>进入Bastion终端。 - 在Bastion上安装PostgreSQL客户端(
sudo yum install postgresql15)和Drizzle CLI(npm install -g drizzle-kit)。 - 从代码仓库拉取迁移SQL文件,或通过SSM上传文件到Bastion。
- 结合Aurora端点与Secrets Manager中的凭证执行迁移:
# 方式1:直接用psql执行SQL文件 psql -h <aurora-endpoint> -U <username> -d <db-name> -f ./migrations/xxx.sql # 方式2:用Drizzle CLI执行 drizzle-kit migrate --config ./drizzle.config.ts
2. 用AWS Lambda自动化执行迁移
适合CI/CD流程中的自动化迁移,无需手动介入:
- 用CDK定义Lambda函数,配置其运行在Aurora所在的VPC私有子网,安全组允许访问Aurora的5432端口。
- 给Lambda执行角色添加权限:读取Secrets Manager数据库凭证、写入CloudWatch日志、VPC网络访问权限。
- 将Drizzle迁移文件与依赖打包到Lambda部署包(可通过CDK的
NodejsFunction自动处理依赖打包)。 - Lambda代码示例(Node.js):
import { drizzle } from 'drizzle-orm/node-postgres'; import { migrate } from 'drizzle-orm/node-postgres/migrator'; import { Client } from 'pg'; import { SecretsManager } from '@aws-sdk/client-secrets-manager'; const secretsManager = new SecretsManager(); export const handler = async () => { const secret = await secretsManager.getSecretValue({ SecretId: '<你的Aurora凭证Secret ARN>' }); const dbConfig = JSON.parse(secret.SecretString); const client = new Client({ host: dbConfig.host, port: dbConfig.port, user: dbConfig.username, password: dbConfig.password, database: dbConfig.dbname, }); await client.connect(); const db = drizzle(client); await migrate(db, { migrationsFolder: './migrations' }); await client.end(); return { statusCode: 200, body: '迁移执行完成' }; }; - 可通过CDK的
CustomResource在基础设施部署完成后自动触发Lambda,或手动在控制台/CLI触发。
3. CI/CD管道通过SSM端口转发执行迁移
适合开发团队的自动化流程,无需额外长期资源:
- 在GitHub Actions/GitLab CI中配置AWS凭证(推荐用IAM角色而非Access Key)。
- 用SSM建立端口转发,将本地5432端口映射到Aurora端点:
aws ssm start-session --target <bastion实例ID> --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"host":["<aurora-endpoint>"],"portNumber":["5432"],"localPortNumber":["5432"]}' - 在CI环境安装Drizzle CLI或psql,直接执行本地迁移命令:
drizzle-kit migrate --config ./drizzle.config.ts
最佳实践
- 迁移文件幂等性:每个SQL迁移语句要确保可重复执行,比如创建表时加
IF NOT EXISTS,修改字段前先检查存在性,避免重复执行报错。 - 凭证安全管理:绝不硬编码数据库密码,用AWS Secrets Manager存储Aurora凭证,CDK中通过
secretsmanager.Secret.fromSecretArn引用,Lambda/Bastion通过IAM权限读取。 - 最小权限安全组:
- Aurora的安全组仅允许来自Bastion/Lambda安全组的5432端口流量。
- Bastion/Lambda的安全组仅开放必要出站规则(如访问npm仓库拉取依赖)。
- 迁移前自动备份:执行迁移前,通过CDK或Lambda调用Aurora快照API创建数据库快照,防止迁移失败导致数据丢失。
- 分环境测试:先在staging环境的Aurora实例上执行迁移,验证无误后再部署到生产环境。
- 日志监控:将Bastion操作日志、Lambda执行日志收集到CloudWatch Logs,方便排查迁移问题。
内容的提问来源于stack exchange,提问作者Crade47
相关产品推荐
相关产品推荐

