如何通过GitHub Action部署无全网络公网访问的Azure Function
解决方案
方法1:用Azure存储账户中转部署(无需开启函数公网访问)
核心思路是将代码先上传至Azure存储,再让处于VNet内的函数应用从存储拉取代码,GitHub Action仅与存储账户交互,完全无需访问函数的公网端点:
- 准备一个Azure存储账户,为GitHub Action使用的Azure AD服务主体分配存储Blob数据参与者权限,无需开启存储的公网访问即可完成上传操作。
- GitHub Action流程配置:
- 使用
azure/loginAction以服务主体身份登录Azure。 - 将函数代码打包为zip格式。
- 通过
azure/storage-blob-uploadAction或Azure CLI命令az storage blob upload将zip包上传至存储账户的Blob容器。 - 执行Azure CLI命令
az functionapp deployment source config-zip,指定存储账户内zip包的路径——该命令通过Azure管理API触发函数应用从存储拉取代码,全程无需开启函数的公网访问。
- 使用
方法2:改用Azure AD身份验证的ARM部署
放弃发布配置文件的用户名密码验证方式,改用Azure AD服务主体完成部署,依托Azure管理平面的权限实现代码推送:
- 创建一个Azure AD服务主体,为其分配函数应用的网站参与者角色,确保该主体拥有部署权限。
- GitHub Action流程配置:
- 使用
azure/loginAction传入服务主体的客户端ID、租户ID、客户端密钥完成登录。 - 将函数代码打包为zip格式。
- 使用
azure/arm-deployAction通过ARM模板配置函数应用的代码部署,或直接执行az functionapp deployment source config-zip命令——该命令基于Azure AD身份验证,无需依赖函数的公网SCM端点,全程通过Azure管理API完成部署。
- 使用
方法3:配置SCM站点专用终结点+跳转机(适合已有VNet内跳转资源的场景)
若需保留发布配置文件的部署方式,可为函数应用的SCM(部署)站点创建专用终结点,再通过VNet内的跳转机或Azure Bastion建立隧道完成部署:
- 为函数应用的SCM站点创建专用终结点,并将其纳入目标VNet的子网。
- 在VNet内部署跳转机(或使用Azure Bastion),配置GitHub Action通过SSH隧道连接至跳转机,再访问SCM站点的专用终结点完成部署。
关键注意事项
- 所有方案中,需确保GitHub Action使用的Azure AD服务主体拥有足够的权限(如存储Blob数据参与者、网站参与者等),避免因权限不足导致部署失败。
- 优先使用Azure AD身份验证替代发布配置文件的明文凭据,既提升安全性,又能更好适配VNet的封闭网络环境。
内容的提问来源于stack exchange,提问作者tridy
相关产品推荐
相关产品推荐

