从GitHub Actions连接AWS私有VPC内Oracle RDS超时问题求助
问题:GitHub Actions无法连接AWS私有VPC内的Oracle数据库(超时错误)
问题描述
我有一个Node.js脚本,在本地和AWS Lambda环境中都能正常连接位于AWS私有VPC内的Oracle数据库。但当我通过GitHub Actions运行该脚本时,尽管已经将DB_USER、DB_PASSWORD、DB_CONNECTION存储在Secrets中并正确传入,连接始终超时,60秒后报错:
"Request exceeded 'transportConnectTimeout' of 60 seconds"
请问仅持有数据库凭证的情况下,从GitHub Actions访问该私有VPC内的数据库是否还需要其他配置?
附相关代码
GitHub Actions工作流YAML:
name: DB Connection on: workflow_dispatch: jobs: build: runs-on: ubuntu-latest environment: dev steps: - name: Checkout code uses: actions/checkout@v2 - name: Set up Node.js uses: actions/setup-node@v2 # Set up Node.js with: node-version: '20.9' - name: Install dependencies run: npm install - name: Run JS env: DB_USER: ${{ secrets.DB_USER }} DB_PASSWORD: ${{ secrets.DB_PASSWORD }} DB_CONNECTION: ${{ secrets.DB_CONNECTION }} run: node ./src/test-db-connection.js
Node.js连接脚本(test-db-connection.js):
import oracledb from 'oracledb'; async function testConnection() { let connection; try { connection = await oracledb.getConnection({ user: process.env.DB_USER, password: process.env.DB_PASSWORD, connectString: process.env.DB_CONNECTION, }); console.log("Database connection successful!", connection); } catch (err) { console.error("Database connection failed:", err.message); } finally { if (connection) { try { await connection.close(); } catch (err) { console.error('Error closing the connection:', err); } } } } testConnection();
核心结论与解决方案
仅靠数据库凭证完全无法实现访问,因为GitHub Actions的默认运行环境是GitHub托管的公网虚拟机,而AWS私有VPC内的资源默认拒绝所有公网来源的访问,这是导致超时的根本原因。必须配置VPC访问通道,以下是几种可行方案:
1. 通过Bastion主机建立SSH隧道
- 操作步骤:
- 在VPC的公有子网部署一台Bastion主机,分配弹性IP,确保其安全组允许GitHub Actions的IP范围通过22端口访问。
- 在GitHub Actions工作流中添加SSH隧道步骤,将本地端口转发到Oracle数据库的1521端口。
- 示例工作流步骤:
- name: 建立SSH隧道到Bastion主机 uses: fredrikekre/ssh-tunnel-action@v1 with: host: ${{ secrets.BASTION_PUBLIC_IP }} port: 22 username: ${{ secrets.BASTION_USER }} private_key: ${{ secrets.BASTION_PRIVATE_KEY }} tunnel: "localhost:1521:${{ secrets.DB_PRIVATE_IP }}:1521" - 修改Node.js连接字符串:将
DB_CONNECTION改为localhost:1521/[你的数据库服务名]
2. 使用自托管GitHub Actions Runner
- 操作步骤:
- 在AWS VPC内的EC2实例上部署GitHub自托管Runner,该Runner直接处于VPC网络内,可直接访问数据库。
- 修改工作流的
runs-on字段为自托管Runner的标签,比如runs-on: self-hosted-aws-vpc。
- 优势:无需额外隧道配置,复用原有连接字符串即可,安全性更高(避免公网暴露Bastion主机)。
3. 通过AWS PrivateLink配置VPC端点(进阶方案)
- 原理:创建Interface类型的VPC端点服务,将Oracle数据库所在的子网暴露给PrivateLink,然后创建对应的VPC端点,允许外部环境通过PrivateLink访问数据库。该方案复杂度较高,适合大规模生产环境。
额外排查点
- 确认
DB_CONNECTION中的主机地址是VPC内部私有IP/域名,公网无法解析和访问这类地址; - 检查Oracle数据库的安全组是否允许上述方案中来源的IP/端口访问(比如Bastion主机的私有IP、自托管Runner的IP)。
内容的提问来源于stack exchange,提问作者Michelle La
相关产品推荐
相关产品推荐

