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

如何让GitHub Actions访问Azure VNet内的数据库

解决Azure VNet内Postgres无法被GitHub Actions访问的问题

核心思路

你的问题本质是GitHub Actions的Runner(不管是官方托管还是自托管)不在Postgres所在的VNet里,无法穿透VNet访问内网数据库。下面给两种符合你「不移除VNet、不公开数据库」要求的方案:


方案一:部署自托管GitHub Runner到VNet(最推荐,稳定无风险)

直接把Runner放在和Postgres同VNet的子网里,让它通过内网直接访问数据库,完全不需要开公网访问权限:

  1. 在Azure Portal里创建一台VM,选择和Postgres相同的VNet及子网
  2. 登录这台VM,按照GitHub官方指引安装自托管Runner,绑定到你的代码仓库
  3. 修改GitHub Actions工作流文件,指定用这个自托管Runner执行任务:
    jobs:
      deploy:
        runs-on: self-hosted  # 指定使用自托管Runner
        steps:
          - uses: actions/checkout@v4
          # 后续的部署、数据库迁移等步骤
    
  4. 这种方式下,Runner和Postgres处于同一VNet,直接走内网通信,不需要修改任何防火墙或VNet规则,完全满足你不公开数据库的需求

方案二:白名单GitHub托管Runner的IP范围(适合临时场景)

如果一定要用GitHub官方托管的Runner,需要把Runner的公网IP范围加入Postgres的防火墙和VNet安全组的允许列表,但注意:GitHub托管Runner的IP是动态更新的,需要定期维护:

  1. 获取GitHub当前的托管Runner IP范围(从GitHub官方发布的IP列表中获取,会定期更新)
  2. 配置Postgres防火墙规则:
    • 进入Azure Portal的Postgres服务器页面,打开「连接安全性」
    • 添加新的防火墙规则,将获取到的GitHub IP段(CIDR格式)批量加入允许列表
  3. 配置VNet安全组(NSG)规则:
    • 找到Postgres所在子网绑定的NSG,添加入站规则:允许来自GitHub IP段的流量访问5432端口(Postgres默认端口)
  4. 注意:这种方式需要Postgres开启「允许公网访问」(但只放行GitHub的IP),相比方案一还是有一定的暴露风险,且IP范围需要定期更新维护

关于你的疑问:是否需要配置防火墙?

  • 如果用方案一(自托管Runner在VNet内):不需要配置任何公网防火墙规则,内网直接访问即可
  • 如果用方案二(托管Runner IP白名单):需要同时配置Postgres的防火墙规则和VNet安全组的入站规则,双管齐下才能放行流量

另外,你提到的「白名单Runner IP的YAML代码」,如果是临时添加单IP的场景,可以用这种脚本(但有安全隐患,用完要记得删除规则):

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: 获取当前Runner公网IP
        id: get_ip
        run: echo "::set-output name=ip::$(curl -s https://api.ipify.org)"
      - name: 临时添加Postgres防火墙规则
        uses: azure/cli@v1
        with:
          inlineScript: |
            az postgres server firewall-rule create --resource-group 你的资源组名 --server-name 你的Postgres服务器名 --name github-runner-temp --start-ip-address ${{ steps.get_ip.outputs.ip }} --end-ip-address ${{ steps.get_ip.outputs.ip }}
      # 执行部署或数据库操作
      - name: 移除临时防火墙规则
        if: always()
        uses: azure/cli@v1
        with:
          inlineScript: |
            az postgres server firewall-rule delete --resource-group 你的资源组名 --server-name 你的Postgres服务器名 --name github-runner-temp --yes

这个脚本会在任务开始时获取当前Runner的IP并添加防火墙规则,任务结束后自动删除(哪怕失败),但每次Runner的IP可能不同,且需要给GitHub Actions配置Azure服务主体的权限,仅适合临时测试使用。

内容的提问来源于stack exchange,提问作者Qiuzman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:18:15