簡體   English   中英

帶有列表鍵的 Azure 函數 ARM 部署導致 BadRequest 錯誤

[英]Azure Function ARM Deployment with listkeys results in BadRequest Error

我有一個簡單的 ARM 模板,它部署了兩個 Azure 函數、一個應用服務計划和一個存儲帳戶:

在此處輸入圖片說明

唯一“特殊”的是,函數function-key-issue-two將函數function-key-issue-one默認主機密鑰添加為應用程序設置:

"FunctionOneKey": "[listkeys(concat(variables('functionTwoAppId'), '/host/default/'),'2016-08-01').functionKeys.default]",

如果我將此模板部署到新的資源組,它會在第一次運行。 每個后續部署都失敗,並在 Resource function-key-issue-one/default上出現錯誤請求錯誤:

在此處輸入圖片說明

這是操作細節的樣子:

{
    "Code": "BadRequest",
    "Message": "Encountered an error (ServiceUnavailable) from host runtime.",
    "Target": null,
    "Details": [
        {
            "Message": "Encountered an error (ServiceUnavailable) from host runtime."
        },
        {
            "Code": "BadRequest"
        },
        {
            "ErrorEntity": {
                "Code": "BadRequest",
                "Message": "Encountered an error (ServiceUnavailable) from host runtime."
            }
        }
    ],
    "Innererror": null
}

如果我刪除FunctionOneKey應用程序設置,則部署工作。 此外,如果我不指定應用設置WEBSITE_RUN_FROM_PACKAGE ,部署也有效。

稍后使用AzureFunctionApp@1 Azure DevOps 任務作為 Zip 包部署函數代碼(這就是我將WEBSITE_RUN_FROM_PACKAGE設置為1 )。


如何重現:

我正在使用的 ARM 模板可在此處獲得 您可以使用它進行部署。 例如, New-AzResourceGroupDeployment cmdlet:

New-AzResourceGroupDeployment -ResourceGroupName 'function-key-issue-rg' -TemplateFile "D:\sources\issues\functionDeployment\azuredeploy.json" -name "azuredeploy-$(New-Guid)"

更新 1:

ServiceUnavailable錯誤的原因可能是因為 Kudu 添加了一個帶有重寫規則的 web.config(因為我使用了 WEBSITE_RUN_FROM_PACKAGE 但沒有部署該功能):

在此處輸入圖片說明

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name = "Site Unavailable" stopProcessing = "true">
                    <match url = ".*" />
                    <action type = "CustomResponse" statusCode = "503" subStatusCode = "0" statusReason = "Site Unavailable" statusDescription = "Could not download zip" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

我的下一個嘗試是通過將SCM_TOUCH_WEBCONFIG_AFTER_DEPLOYMENT設置為0來阻止 Kudu 這樣做(請參閱: 不要在部署結束時觸摸 web.config )。 現在看起來,后續部署有時會成功:

在此處輸入圖片說明

但仍然不是一個可靠的解決方案:-/。


更新 2:

  • Azure Function Runtime ~2有同樣的問題。
  • 將 Azure Function 切換到 Linux 也不能解決問題。

更新 3:


知道這里有什么問題嗎? 任何解決方法?

我在使用 ARM 模板部署功能應用程序和應用程序設置時也遇到了這個問題。

反復使用 Azure 支持后,我們意識到應用設置的持久性會導致在部署過程中重新啟動 Function App,這會導致 503 Service Unavailable 在它重新啟動時出現。 這種情況發生在部署仍在進行中時,這會導致Microsoft.Web/sites/host出現間歇性故障。 這也是盡管 ARM 部署模式被設置為incremental ,這似乎被功能應用程序設置完全忽略。

功能應用程序的診斷設置將為您列出硬重啟,並可能讓您深入了解導致它的應用程序設置。

Azure 支持人員建議將應用程序設置分離到 ARM 模板中自己的Microsoft.Web/sites/config部分,這dependsOn已完成部署的功能應用程序。 我還沒有嘗試過,這也與 Function App ARM 示例中的內容背道而馳,其中它們是Microsoft.Web/sites的子config資源。

我認為你可以改變你在你的職能之間建立溝通的方式,你也會解決你的問題。 我建議您使用 Azure 托管標識來配置功能之間的通信,而不是使用功能鍵。 請查看這篇文章以獲取有關我所說內容的更多詳細信息。

首先,我建議使用 Azure KeyVault 作為您的密鑰的默認存儲,如此處所述。 但似乎這也與 Appservice 和 Package Deployments 的一些問題有關。 看看這里:https ://github.com/microsoft/azure-pipelines-tasks/issues/10961和這里:https ://github.com/microsoft/azure-pipelines-tasks/issues/11444 該文檔還說明了以下內容: https : //docs.microsoft.com/de-de/azure/azure-functions/run-functions-from-deployment-package

希望這有幫助。

我在模板中遇到了類似的問題,將 EventGrid 主題訂閱者部署到主題。 json 模板中 listkey() 函數的前置導致了相同的、非常非描述性的錯誤消息。

通過將 ARM 模板架構更新為 Azure 上支持的最新架構,我使它工作了:2019-08-01

像這樣:文件中的第一行: "$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentParameters.json#" ,

和內聯,在 listkeys 函數中:

listkeys(concat(resourceId('Microsoft.Web/sites', parameters('functionAppName')), '/host/default'), '2019-08-01').functionKeys.default)

現在,至少對我而言,幾個后續部署再次起作用。

我最近遇到了這個問題並聯系了 Azure Functions 團隊,我從他們那里了解到的是:(我使用的 ARM 模板應該與所有不同方法的邏輯相同)

1- 使用 WEBSITE_RUN_FROM_PACKAGE = 1 必須在部署 Zip 文件之前設置,這意味着在 ZipDeploy 與部署 AppSettings 之間添加依賴關系。

為什么? 如果一開始沒有設置此標志,該函數將獲取 ZipFile 並將其解壓縮到wwroot文件夾,導致空的SitePackage文件夾並破壞部署和功能。 此標志使函數上傳一個 zip 文件到data/SitePackage下的函數共享文件系統中的文件夾,還有一個package.txt具有相關 Zip 的名稱。

這個標志不應該來回更改,因為它會由於混淆是否應該將 zip 上傳到 SitePackages 或將其解壓縮到 wwroot 而破壞部署。

如果第一次轉動您的旗幟,我得到了一個答案,可能會發生第一次部署失敗,您需要再試一次。

2- 使用 WEBSITE_RUN_FROM_PACAKAGE 時,該函數會經歷某種重新啟動,即此處的文檔中所寫,您會看到部署后重新啟動已完成。

所以“listKeys”的步驟可能會因重啟而導致失敗,您需要做的是在功能部署后添加一個“等待”步驟1-2分鍾,以確保一切都完成。

祝你好運

我遇到了幾乎相同的問題。 我需要提供它自己的主機密鑰的 Azure 函數。 在幾個不同的測試場景之后,我的結論是 Azure Function App 部署完成和主機密鑰可用之間存在一些延遲。

我目前的解決方法是之前在 KeyVault 中創建一個密鑰,然后在兩個不同的地方使用這個密鑰:

  1. 在 Azure 函數中創建新的主機密鑰
  2. 提供 Azure Function appsettings

一些示例代碼:

從 PS 在 KeyVault 中生成密鑰

$secureSecret = ConvertTo-SecureString New-Guid.ToString() -AsPlainText -Force

Set-AzureKeyVaultSecret -VaultName $keyVaultName -Name "azure-function-key" -SecretValue $secureSecret

創建主機密鑰並將其傳遞給函數

請注意, parameters('internalKey')將從 KeyVault 參考中獲取

"apiVersion": "2019-08-01",
"type": "Microsoft.Web/sites",
"kind": "functionapp",
"name": "[variables('functionAppName')]",
"location": "[variables('location')]",
"resources": [{
   "dependsOn": ["[resourceId(resourceGroup().name, 'Microsoft.Web/sites', variables('functionAppName'))]"],
   "type": "Microsoft.Web/sites/host/functionKeys",
   "apiVersion": "2018-11-01",
   "name": "[concat(variables('functionAppName'), '/default/internalkey')]",
   "properties": {
      "name": "internalkey",
      "value": "[parameters('internalKey')]"
   }
},
{
   "apiVersion": "2019-08-01",
   "name": "appsettings",
   "type": "config",
   "dependsOn": [
      "[resourceId(resourceGroup().name, 'Microsoft.Web/sites', variables('functionAppName'))]"
   ],
   "properties": {
      "FUNCTIONS_EXTENSION_VERSION": "~3",
      "HostFunctionKey": "[parameters('internalKey')]"
   }
}]

即使您使用新的主機密鑰嘗試listKeys方法,它也不會獲得該值。 第一次它會失敗,如果它發生了變化,它會連續多次獲得以前的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM