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

如何向私有隔离子网中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:42:42