为什么在通过 Azure DevOps 部署 Serverless Linux Function App 之前需要启动插槽?

问题描述 投票:0回答:1

我正在尝试使用 Azure DevOps 部署无服务器 Linux 函数应用程序,但遇到了部署失败的问题,除非我先启动函数应用程序(或插槽)。这似乎只发生在 Linux 上,而不是 Windows 函数应用程序中。

这是我的设置:

  • 我在 Linux 消费应用服务计划上使用 Azure Functions,没有其他应用程序
  • 我有一个单独的部署槽用于我们的“临时”环境。
  • 该应用程序通过 Terraform 进行管理和配置
  • 我正在使用 Azure CLI 任务通过 Azure DevOps 管道进行部署。
  • 如果槽已停止(或手动停止应用程序),部署步骤将失败。但是,如果我在运行部署之前启动插槽,一切都会正常工作。

我在 DevOps Pipeline 中遇到的错误如下:

##[错误]错误:无法同步函数应用“my-func-app”的触发器。错误:未经授权 - 遇到来自扩展 API 的错误(禁止)。 (代码:400)

我有几个问题:

  • 为什么我需要在部署到部署槽或功能应用程序之前启动它?
  • 有没有办法部署到 Linux 函数应用程序上已停止的插槽,或者这只是 Linux 函数应用程序的限制?我在文档中看不到任何相关内容

任何见解或建议将不胜感激,谢谢

我已经尝试过Windows和Linux,这在部署Windows函数应用程序时似乎不是问题。

linux azure azure-devops deployment azure-functions
1个回答
0
投票

当插槽处于停止状态时,当我尝试在插槽中部署函数应用程序时,我也遇到了相同的错误。

当我将

Storage Account Contributor role
分配给与功能相关的存储中的服务连接服务主体并将
Contibutor
分配给功能应用程序时,它对我有用。

下面给出了对我有用的

.yml
文件。

DevOps
是我使用服务主体的服务连接名称。

trigger:
- Dev

variables:
  # Function app name
  functionAppName: 'pyfunc31aug'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

  # Working Directory
  workingDirectory: '.'

stages:
- stage: Build
  displayName: Build stage

  jobs:
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)

    steps:
    - bash: |
        if [ -f extensions.csproj ]
        then
            dotnet build extensions.csproj --runtime ubuntu.16.04-x64 --output ./bin
        fi
      workingDirectory: $(workingDirectory)
      displayName: 'Build extensions'

    - task: UsePythonVersion@0
      displayName: 'Use Python 3.11'
      inputs:
        versionSpec: 3.11 # Functions V2 supports Python 3.6 as of today

    - bash: |
        pip install --target="./.python_packages/lib/site-packages" -r ./requirements.txt
      workingDirectory: $(workingDirectory)
      displayName: 'Install application dependencies'

    - task: ArchiveFiles@2
      displayName: 'Archive files'
      inputs:
        rootFolderOrFile: '$(workingDirectory)'
        includeRootFolder: false
        archiveType: zip
        archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
        replaceExistingArchive: true

    - publish: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
      artifact: drop

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  condition: succeeded()

  jobs:
  - deployment: Deploy
    displayName: Deploy
    environment: 'development'
    pool:
      vmImage: $(vmImageName)

    strategy:
      runOnce:
        deploy:

          steps:
          - task: AzureFunctionApp@1
            displayName: 'Azure functions app deploy'
            inputs:
              azureSubscription: 'DevOps'
              appType: functionAppLinux
              appName: $(functionAppName)
              package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'
              deployToSlotOrASE: true
              slotName: staging

OUTPUT

© www.soinside.com 2019 - 2024. All rights reserved.