【问题标题】:ARM Template - Deploying function using MSDeploy with zipped code in Azure Storage BlobARM 模板 - 在 Azure 存储 Blob 中使用 MSDeploy 和压缩代码部署函数
【发布时间】:2023-03-03 23:21:01
【问题描述】:

我正在尝试部署一个 Azure 函数,该函数的压缩内容已放置在另一个订阅和资源组的 blob 中。函数应用已部署,但其下没有函数,MSDeploy 失败并超时 -

"provisioningOperation": "Create",
  "provisioningState": "Failed",
  "timestamp": "2021-07-23T15:10:45.9602877Z",
  "duration": "PT2H11.3363166S",
  "serviceRequestId": "17787274-8592-465b-a11e-10aada76286e",
  "statusCode": "RequestTimeout",
  "statusMessage": {
    "error": {
      "code": "ResourceDeploymentFailure",
      "message": "The resource provision operation did not complete within the allowed timeout period."
    }
  },
  "targetResource": {
    "id": "/subscriptions/<sub-id>/resourceGroups/rg-7ND96/providers/Microsoft.Web/sites/FnAppubjba74tmczo4/Extensions/MSDeploy",
    "resourceName": "FnAppubjba74tmczo4/MSDeploy",
    "resourceType": "Microsoft.Web/sites/Extensions"

我假设这是因为 MSDeploy 无法访问 blob 中的 zip 文件。我没有提供任何明确的访问权限,我无法弄清楚如何做到这一点。下面是我的函数应用的 ARM 模板 -

{
      "type": "Microsoft.Web/sites",
      "apiVersion": "2020-06-01",
      "name": "[variables('functionAppName')]",
      "location": "[parameters('location')]",
      "kind": "functionapp",
      "properties": {
        "name": "[variables('functionAppName')]",
        "clientAffinityEnabled": false
      },
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
        "[resourceId('Microsoft.Insights/components', variables('appInsightsName'))]"
      ],
      "resources": [
        {
          "apiVersion": "2018-11-01",
          "name": "appsettings",
          "type": "config",
          "dependsOn": [
            "[resourceId('Microsoft.Web/sites', variables('functionAppName'))]",
            "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
            "[resourceId('Microsoft.Insights/components', variables('appInsightsName'))]"
          ],
          "properties": {
            "AzureWebJobsStorage": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';EndpointSuffix=', environment().suffixes.storage, ';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value)]",
            "FUNCTIONS_EXTENSION_VERSION": "~3",
            "FUNCTIONS_WORKER_RUNTIME": "dotnet",
            "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';EndpointSuffix=', environment().suffixes.storage, ';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value)]",
            "FileStorageAccountConnectionString": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';EndpointSuffix=', environment().suffixes.storage, ';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value)]",
            "FileShareName": "[variables('fileShareName')]",
            "APPINSIGHTS_INSTRUMENTATIONKEY": "[reference(resourceId('microsoft.insights/components/', variables('appInsightsName')), '2015-05-01').InstrumentationKey]"
          }
        },
        {
          "name": "MSDeploy",
          "type": "Extensions",
          "apiVersion": "2018-11-01",
          "dependsOn": [
            "[resourceId('Microsoft.Web/Sites', variables('functionAppName'))]"
          ],
          "properties": {
            "packageUri": "https://storage-name.blob.core.windows.net/Function.zip",
            "appOffline": true
          }
        }
      ]
    }

我能否在 MSDeploy 资源运行之前使用 ARM 模板中的托管标识动态地为函数应用提供对 blob 的访问权限?如果没有,我可以在 ARM 模板中生成一个 SAS 令牌以供访问吗?

UPADTE - 我在 ..\home\LogFiles\SiteExtensions\MSDeploy - appManagerLog.xml -

中检查了已部署函数应用程序中的日志
<?xml version="1.0" encoding="utf-8"?>
<entries>
    <entry time="2021-07-23T15:13:08.5448175+00:00" type="Message">
        <message>Downloading package path 'Function.zip' from blob 'https://storage-name.blob.core.windows.net'</message>
    </entry>
    <entry time="2021-07-23T15:13:09.0604383+00:00" type="Message">
        <message>No parameters were populated.</message>
    </entry>
    <entry time="2021-07-23T15:13:09.0604383+00:00" type="Message">
        <message>AppOffline enabled</message>
    </entry>
    <entry time="2021-07-23T15:13:09.0604383+00:00" type="Message">
        <message>Calling SyncTo() on package.</message>
    </entry>
    <entry time="2021-07-23T15:13:09.3104411+00:00" type="Message">
        <message>Adding file (.\FunctionApp.csproj).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.3104411+00:00" type="Message">
        <message>Adding file (.\FunctionApp.csproj).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.3729946+00:00" type="Message">
        <message>Deleting file (.\host.json).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.3729946+00:00" type="Message">
        <message>Deleting file (.\host.json).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.4199523+00:00" type="Message">
        <message>Adding file (.\local.settings.json).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.4199523+00:00" type="Message">
        <message>Adding file (.\local.settings.json).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.4823395+00:00" type="Message">
        <message>Adding directory (.\Models).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.4823395+00:00" type="Message">
        <message>Adding directory (.\Models).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.529223+00:00" type="Message">
        <message>Adding file (.\Models\RequestModel.cs).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.529223+00:00" type="Message">
        <message>Adding file (.\Models\RequestModel.cs).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.5917233+00:00" type="Message">
        <message>Adding file (.\Models\State.cs).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.5917233+00:00" type="Message">
        <message>Adding file (.\Models\State.cs).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.654252+00:00" type="Message">
        <message>Adding file (.\Models\StateInfo.cs).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.654252+00:00" type="Message">
        <message>Adding file (.\Models\StateInfo.cs).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.716655+00:00" type="Message">
        <message>Adding file (.\ResponseFunction.cs).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.716655+00:00" type="Message">
        <message>Adding file (.\ResponseFunction.cs).</message>
    </entry>
    <entry time="2021-07-23T15:13:09.8729031+00:00" type="Message">
        <message>Total Changes: 8 (7 added, 1 deleted, 0 updated, 0 parameters changed, 7989 bytes copied)</message>
    </entry>
    <entry time="2021-07-23T15:13:09.8729031+00:00" type="Message">
        <message>[Information] [user: F8C3B4564BD880EEFBE19EBA84667977B183FC6B] [324886c5-3416-4866-b8b4-5c3a2ed83394] WebDeploy operation complete. Performing post-deployment operations.</message>
    </entry>
    <entry time="2021-07-23T15:13:10.6130904+00:00" type="Message">
        <message>[Verbose] [user: F8C3B4564BD880EEFBE19EBA84667977B183FC6B] Begin HttpPost https://adobefnappubjba74tmczo4.azurewebsites.net/admin/host/synctriggers, x-ms-request-id: 324886c5-3416-4866-b8b4-5c3a2ed83394</message>
    </entry>
    <entry time="2021-07-23T15:16:47.9939772+00:00" type="Message">
        <message>Downloading package path 'Function.zip' from blob 'https://storage-name.blob.core.windows.net'</message>
    </entry>
    <entry time="2021-07-23T15:16:48.0721032+00:00" type="Message">
        <message>No parameters were populated.</message>
    </entry>
    <entry time="2021-07-23T15:16:48.0721032+00:00" type="Message">
        <message>AppOffline enabled</message>
    </entry>
    <entry time="2021-07-23T15:16:48.0721032+00:00" type="Message">
        <message>Calling SyncTo() on package.</message>
    </entry>
    <entry time="2021-07-23T15:16:48.1502509+00:00" type="Message">
        <message>Deleting file (.\host.json).</message>
    </entry>
    <entry time="2021-07-23T15:16:48.1502509+00:00" type="Message">
        <message>Deleting file (.\host.json).</message>
    </entry>
    <entry time="2021-07-23T15:16:48.2596268+00:00" type="Message">
        <message>Total Changes: 1 (0 added, 1 deleted, 0 updated, 0 parameters changed, 0 bytes copied)</message>
    </entry>
    <entry time="2021-07-23T15:16:48.2596268+00:00" type="Message">
        <message>[Information] [user: F8C3B4564BD880EEFBE19EBA84667977B183FC6B] [ae7d2678-ec79-476b-8e72-e3a4e4cc0d70] WebDeploy operation complete. Performing post-deployment operations.</message>
    </entry>
    <entry time="2021-07-23T15:16:48.3221254+00:00" type="Message">
        <message>[Verbose] [user: F8C3B4564BD880EEFBE19EBA84667977B183FC6B] Begin HttpPost https://adobefnappubjba74tmczo4.azurewebsites.net/admin/host/synctriggers, x-ms-request-id: ae7d2678-ec79-476b-8e72-e3a4e4cc0d70</message>
    </entry>
    <entry time="2021-07-23T15:21:42.6541756Z" type="Message">
        <message>Downloading package path 'Function.zip' from blob 'https://storage-name.blob.core.windows.net'</message>
    </entry>
    <entry time="2021-07-23T15:21:42.7318456Z" type="Message">
        <message>No parameters were populated.</message>
    </entry>
    <entry time="2021-07-23T15:21:42.7318456Z" type="Message">
        <message>AppOffline enabled</message>
    </entry>
    <entry time="2021-07-23T15:21:42.7318456Z" type="Message">
        <message>Calling SyncTo() on package.</message>
    </entry>
    <entry time="2021-07-23T15:21:42.8099044Z" type="Message">
        <message>Deleting file (.\host.json).</message>
    </entry>
    <entry time="2021-07-23T15:21:42.8099044Z" type="Message">
        <message>Deleting file (.\host.json).</message>
    </entry>
    <entry time="2021-07-23T15:21:42.8880416Z" type="Message">
        <message>Total Changes: 1 (0 added, 1 deleted, 0 updated, 0 parameters changed, 0 bytes copied)</message>
    </entry>
    <entry time="2021-07-23T15:21:42.8880416Z" type="Message">
        <message>[Information] [user: F8C3B4564BD880EEFBE19EBA84667977B183FC6B] [6b7c0ba0-8504-4525-9f99-a5e7d787693f] WebDeploy operation complete. Performing post-deployment operations.</message>
    </entry>
    <entry time="2021-07-23T15:21:42.9505549Z" type="Message">
        <message>[Verbose] [user: F8C3B4564BD880EEFBE19EBA84667977B183FC6B] Begin HttpPost https://adobefnappubjba74tmczo4.azurewebsites.net/admin/host/synctriggers, x-ms-request-id: 6b7c0ba0-8504-4525-9f99-a5e7d787693f</message>
    </entry>
</entries>

从日志看来,MSDeploy 确实有权访问 blob,因为正在读取所有文件夹。 但是,我的部署失败,当我转到已部署函数应用的 Azure 门户时,它下面没有任何函数。 我在这里遗漏了什么吗?

【问题讨论】:

  • 嗨@kruti Joshi,您用于部署的邮政编码有多大?
  • 大小只有1.3Mb。
  • 您可以尝试在此推文@AzureSupport...

标签: azure-functions azure-blob-storage azure-resource-manager msdeploy


【解决方案1】:

您的包 URI 应包含共享访问签名 (SAS)

"packageUri": "https://storage-name.blob.core.windows.net/Function.zip?sv=yourSAS",

为此,在 Azure 存储资源管理器中,创建一个共享访问签名 (SAS) 存储容器的令牌,然后将令牌附加到 WDP URL。记下包 URL 以供以后在 ARM 中使用 模板。

在您的情况下,wdp 是一个 zip 文件,相同但不同。

SAS URI 如下所示:

https://contoso.blob.core.windows.net/container01?sv=2020-04-08&st=2021-03-02T00%3A30%3A33Z&se=2020-03-03T00%3A30%3A33Z&sr=c&sp=rl&sig=z9VFdWffrV6FXU51T8b8HVfipZPOpYOFLXuQw6wfkFY%3F

在“连接到 Azure 存储”对话框的“选择资源”面板中, 选择要连接的资源。选择共享访问 签名 (SAS) 并选择下一步。输入您的显示名称 连接和资源的 SAS URI。选择下一步。查看您的 “摘要”面板中的连接信息。如果连接 信息正确,选择连接。

来自microsoft doc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-28
    • 2019-07-23
    • 2019-02-11
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多