[英]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:
~2
有同樣的問題。更新 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 中創建一個密鑰,然后在兩個不同的地方使用這個密鑰:
一些示例代碼:
從 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.