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

从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隧道

  • 操作步骤:
    1. 在VPC的公有子网部署一台Bastion主机,分配弹性IP,确保其安全组允许GitHub Actions的IP范围通过22端口访问。
    2. 在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

  • 操作步骤:
    1. 在AWS VPC内的EC2实例上部署GitHub自托管Runner,该Runner直接处于VPC网络内,可直接访问数据库。
    2. 修改工作流的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:55:14