在 Bicep 文件中使用 MSDeploy 的 Azure 函数部署错误

Azure function deploy error using MSDeploy in Bicep file

提问人:ValeriaN 提问时间:8/29/2023 更新时间:8/31/2023 访问量:127

问:

我正在使用二头肌文件来部署 Azure 资源,其中包括一个 FunctionApp 和 3 个 Functions

FunctionApp 部署工作正常。

我正在使用从之前创建的 FunctionApp 和 Functions 上的“下载应用内容”按钮创建并上传到 git 存储库的 zip 文件部署 Functions

这是二头肌内容:

resource funcAppDeploy 'Microsoft.Web/sites/extensions@2020-12-01' = {
  parent: funcApp
  name: 'MSDeploy'
  properties: {
    packageUri: funcPackageUri
  }
}

其中 funcPackageUri 是这样的

var funcPackageUri = 'https://github.com/<repoorg>/<reponame>/raw/main/<foldername>/funcapp-deploy.zip'

我在部署过程中遇到此错误:

{“code”:“失败”,“message”:“ARM-MSDeploy 部署失败: 'Microsoft.Web.Deployment.DeploymentDetailedException:类型的对象 “package”和路径 “C:\local\Temp\f5e1b1e4-1a43-4567-95d7-d4ae670fd17f.zip”不能是 创建。如需了解更多信息,请访问:http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_EXCEPTION_WHILE_CREATING_OBJECT。 ---> Microsoft.Web.Deployment.DeploymentException:Zip 包“C:\local\Temp\f5e1b1e4-1a43-4567-95d7-d4ae670fd17f.zip”不能 加载。---> System.IO.EndOfStreamException:无法读取超出 流的末尾。\r\n 在 System.IO.BinaryReader.FillBuffer(Int32 numBytes)\r\n 在 System.IO.BinaryReader.ReadInt32()\r\n 在 Microsoft.Web.Deployment.ZipFile.Load()\r\n 位于 Microsoft.Web.Deployment.ZipPackageProvider..ctor(DeploymentProviderContext) providerContext、DeploymentBaseContext baseContext、字符串路径)\r\n --- 内部异常堆栈跟踪结束---\r\n 位于 Microsoft.Web.Deployment.ZipPackageProvider.GetAttributes(DeploymentAddAttributeContext) addContext)\r\n 在 Microsoft.Web.Deployment.DeploymentObject.EnsureValidAttributes()\r\n --- 内部异常堆栈跟踪结束---\r\n 位于 Microsoft.Web.Deployment.DeploymentManager.CreateObjectPrivate(DeploymentProviderContext) providerContext、DeploymentBaseOptions baseOptions、DeploymentObject sourceObject,字符串 serverVersion)\r\n 在 Microsoft.Web.Deployment.DeploymentManager.CreateObject(DeploymentProviderOptions providerOptions、DeploymentBaseOptions baseOptions)\r\n 位于 Microsoft.Web.Deployment.DeploymentManager.CreateObject(字符串) provider、String 路径、DeploymentBaseOptions baseOptions)\r\n 位于 Microsoft.Web.Deployment.DeploymentManager.CreateObject(DeploymentWellKnownProvider provider、String 路径、DeploymentBaseOptions baseOptions)\r\n 位于 Microsoft.Web.Deployment.WebApi.AppGalleryPackage.Deploy(字符串) deploymentSite, String siteSlotId, Boolean doNotDelete) C:__w\1\s\src\hosting\wdeploy\Microsoft.Web.Deployment.WebApi\AppGalleryPackage.cs:line 250\r\n 在 Microsoft.Web.Deployment.WebApi.DeploymentController.d__25.MoveNext() 在 C:__w\1\s\src\hosting\wdeploy\Microsoft.Web.Deployment.WebApi\Controllers\DeploymentController.cs:line 492'"}

你能帮我了解问题所在吗?

azure-functions web部署 azure-bicep

评论

0赞 Stuart.Sklinar 8/30/2023
运行器是否有权获取该 zip 来部署它?
0赞 Jahnavi 8/30/2023
您是否只想使用二头肌来实现它?或者,我建议使用 bicep 创建一个函数应用,并使用 CLI 上传 zip 内容。如果它以这种方式适合您,社区可以帮助您完成详细步骤。@ValeriaN
0赞 ValeriaN 8/31/2023
@Stuart.Sklinar 如何检查运行器是否有权获取 zip 文件?
0赞 ValeriaN 8/31/2023
@Jahnavi,是的,我尝试使用 bicep 创建函数应用并使用“az functionapp deployment”部署 zip 文件,它可以正常工作
0赞 Jahnavi 8/31/2023
函数是否也与函数应用一起部署?@ValeriaN

答:

0赞 Jahnavi 8/31/2023 #1

在尝试使用 bicep 将 zip 推送部署到函数应用时,我遇到了类似的问题。解决方法后,似乎 zip 部署推送存在问题。但是,如果我们关注错误消息,则意味着 zip 文件已损坏,因此无法加载以进行部署。MSDeploy

我还尝试通过创建一个新的存储库来通过 bicep 部署它。这同样是失败的。因此,我尝试了以下方法来满足您的要求。

我为函数应用部署创建了一个 bicep 文件,然后使用该命令将函数部署到该特定函数应用。AzCLI

Functionapp.bicep:

param functionAppName string = 'func-${uniqueString(resourceGroup().id)}'
param storageAccountType string = 'Standard_LRS'
param location string = resourceGroup().location
param appInsightsLocation string = resourceGroup().location
param functionWorkerRuntime string = 'node'
@allowed([
  'Windows'
  'Linux'
])
param functionPlanOS string = 'Windows'
param planSku string = 'S1'
var hostingPlanName = functionAppName
var applicationInsightsName = functionAppName
var storageAccountName = '${uniqueString(resourceGroup().id)}functions'
resource storageAccount 'Microsoft.Storage/storageAccounts@2021-02-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: storageAccountType
  }
  kind: 'Storage'
}

resource hostingPlan 'Microsoft.Web/serverfarms@2021-02-01' = {
  name: hostingPlanName
  location: location
  sku: {
    tier: 'Standard'
    name: PlanSku
    family: 'S'
    capacity: 1
  }
  properties: {}
}

resource applicationInsights 'microsoft.insights/components@2020-02-02' = {
  name: applicationInsightsName
  location: appInsightsLocation
  properties: {
    Application_Type: 'web'
  }
  kind: 'web'
}
resource functionApp 'Microsoft.Web/sites@2021-02-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    reserved: isReserved
    serverFarmId: hostingPlan.id
    siteConfig: {
      alwaysOn: true
      appSettings: [
        {
          name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
          value: reference(applicationInsights.id, '2015-05-01').InstrumentationKey
        }
        {
          name: 'AzureWebJobsStorage'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${listKeys(storageAccount.id, '2019-06-01').keys[0].value}'
        }
        {
          name: 'FUNCTIONS_EXTENSION_VERSION'
          value: '~4'
        }
        {
          name: 'FUNCTIONS_WORKER_RUNTIME'
          value: functionWorkerRuntime
        }
        {
          name: 'WEBSITE_NODE_DEFAULT_VERSION'
          value: '~14'
        }
        {
          name: 'WEBSITE_RUN_FROM_PACKAGE'
          value: '0'
        }
      ]
    }
  }
}

CLI 命令:

az functionapp deployment source config-zip -g <resourcegroup> -n warriorfunc --src Firstrepojahnavi-main.zip

部署成功:

enter image description here

enter image description here

或者,也可以尝试将 zip 文件或文件夹上传到 blob 存储容器,上传后,从中获取容器 URL,并将其粘贴到 bicep 代码中的包 uri 位置,如 MSDoc 中所述。

如果需要,您可以参考此处了解其他 Zip 部署方式

评论

0赞 ValeriaN 9/6/2023
谢谢你的回答。我已经尝试将“az functionapp deployment”cli 命令与相同的 zip 文件一起使用并且它可以工作,这意味着在我的情况下,zip 文件似乎是有效的。顺便说一句,仅使用创建函数应用创建二头肌文件,然后使用 az cli 部署函数不适用于我的情况。我正在尝试自动部署多个资源,其中一个资源需要创建函数
0赞 Jahnavi 9/8/2023
如果尝试将其作为 zip 部署推送,则 MsDeploy 过程存在问题。您必须选择其他方式,正如我在上面的答案中给出的那样,直到该问题得到解决。@ValeriaN