Azure Функция ARM Deployment с использованием списка ключей приводит к ошибке BadRequest - PullRequest
2 голосов
/ 27 февраля 2020

У меня есть простой шаблон ARM, который развертывает две Azure функции, план обслуживания приложения и учетную запись хранения:

enter image description here

Only " Особая особенность заключается в том, что функция function-key-issue-two добавляет ключ хоста по умолчанию из функции function-key-issue-one в качестве настройки приложения:

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

Если я разверну этот шаблон в новая группа ресурсов, работает с первого раза. Каждое последующее развертывание завершается с ошибкой Bad Request на ресурсе function-key-issue-one / default :

enter image description here

Вот так выглядят подробности операции:

{
    "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 командлет:

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

Обновление 1:

Причина ошибки ServiceUnavailable, вероятно, связана с тем, что Kudu добавляет веб. config с правилом перезаписи (потому что я использую WEBSITE_RUN_FROM_PACKAGE, но не развернул функцию):

enter image description here

<?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 (см .: Не трогайте web.config в конце развертывания ). И теперь похоже, что последующие развертывания иногда завершаются успешно:

enter image description here

Но все еще не является надежным решением: - /.


Обновление 2:

  • Та же проблема с Azure Функция Runtime ~2.
  • Переключение функции Azure до Linux также не решает проблему.

Обновление 3:

  • Я открываю проблему GitHub относительно этой топи c.

Есть идеи, что здесь не так? Есть обходные пути?

Ответы [ 4 ]

1 голос
/ 27 февраля 2020

Прежде всего, я бы предложил использовать 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

Надеюсь, это полезно.

1 голос
/ 18 марта 2020

У меня была такая же проблема в шаблоне, как при развертывании подписчиков EventGrid Topi c на Topi c. Преследование функции listkey () в шаблоне json привело к тому же самому неописательному сообщению об ошибке.

Я заставил его работать, обновив схему шаблона ARM до самой новой поддерживаемой схемы Azure: 2019-08-01

Примерно так: Верхняя строка в файле: "$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentParameters.json#",

и inline, в функции listkeys:

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

Теперь несколько последующих развертываний снова работают, по крайней мере, для меня.

1 голос
/ 27 февраля 2020

Я думаю, что вы можете изменить способ установления связи между вашими функциями, и вы также исправите свою проблему. Я бы порекомендовал вам использовать Azure Managed Identity для настройки связи между вашими функциями вместо использования функциональных клавиш. Пожалуйста, посмотрите на эту статью , чтобы получить более подробную информацию о том, что я говорю.

0 голосов
/ 16 апреля 2020

Я столкнулся почти с той же проблемой. Мне нужно передать функцию Azure, которая имеет свой собственный ключ хоста. После нескольких разных тестовых сценариев ios я пришел к выводу, что существует некоторая задержка между окончанием Azure развертывания функционального приложения sh и моментом появления ключей хоста.

Мой текущий обходной путь - это предварительно создать ключ в KeyVault. Используйте этот ключ в двух разных местах:

  1. Для создания нового ключа хоста в Azure Функция
  2. Для подачи Azure Настройки приложений функций

Некоторые примеры кодов:

Генерация ключа в KeyVault из PS

$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 с вашим новый ключ хоста не получит значение. Первый раз он потерпит неудачу, и в следующий раз он получит предыдущее значение, если оно изменилось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...