如何让GitHub Action访问禁止外部连接的RDS数据库?
通过EC2 SSH隧道执行Prisma迁移的解决方案
由于RDS仅允许内部IP或关联EC2实例访问,GitHub Action的外部IP无法直接连接数据库,通过EC2建立SSH隧道是可行的解决办法,以下是具体实现步骤:
准备工作
先在GitHub仓库的「Settings → Secrets and variables → Actions」中添加以下机密变量:
EC2_SSH_KEY:EC2实例的PEM格式私钥EC2_HOST:EC2实例的公网IP或域名EC2_USER:EC2的登录用户名(如ubuntu或ec2-user)RDS_HOST:RDS实例的内网地址RDS_PORT:RDS的服务端口(PostgreSQL默认5432,MySQL默认3306)DATABASE_URL:修改为隧道本地地址,例如postgresql://用户名:密码@localhost:5432/数据库名
修改后的GitHub Action配置
替换原有的Action文件为以下内容:
name: Deploy Prisma Migration on: push: branches: - master pull_request: branches: - master jobs: deploy: runs-on: ubuntu-latest steps: - name: 检出代码仓库 uses: actions/checkout@v3 - name: 配置Node环境 uses: actions/setup-node@v3 with: node-version: 20 # 替换为你的项目使用的Node.js版本 - name: 安装项目依赖 run: npm install - name: 建立EC2 SSH隧道 run: | # 配置SSH环境,跳过首次连接的主机密钥验证 mkdir -p ~/.ssh echo "${{ secrets.EC2_SSH_KEY }}" > ~/.ssh/ec2_key.pem chmod 600 ~/.ssh/ec2_key.pem echo -e "Host ec2-tunnel\n HostName ${{ secrets.EC2_HOST }}\n User ${{ secrets.EC2_USER }}\n IdentityFile ~/.ssh/ec2_key.pem\n StrictHostKeyChecking no" > ~/.ssh/config # 将本地端口转发到RDS内网地址,后台运行隧道 ssh -f -N -L localhost:${{ secrets.RDS_PORT }}:${{ secrets.RDS_HOST }}:${{ secrets.RDS_PORT }} ec2-tunnel - name: 执行Prisma迁移 run: npx prisma migrate deploy env: DATABASE_URL: ${{ secrets.DATABASE_URL }}
关键注意事项
- EC2安全组配置:确保EC2的安全组入站规则允许GitHub Actions的IP访问22端口(SSH)。如果嫌手动维护IP段麻烦,可临时开放0.0.0.0/0(不推荐生产环境),或查询GitHub官方公布的Actions IP范围添加到规则中。
- EC2与RDS的网络连通性:EC2实例的安全组需允许访问RDS的服务端口,且两者处于同一VPC内(或通过VPC peering连通)。
- 私钥格式验证:确保
EC2_SSH_KEY是完整的PEM格式,无多余换行或格式错误。
内容的提问来源于stack exchange,提问作者n9p4
相关产品推荐
相关产品推荐

