Вопрос или проблема
У меня возникла проблема с ARM-шаблоном для развертывания или обновления ресурса Azure Function App. Я использовал следующий ARM-шаблон.
{
"type": "Microsoft.Web/sites/config",
"apiVersion": "2022-03-01",
"name": "[format('{0}/{1}', variables('functionAppName'), 'appsettings')]",
"properties": {
"AzureWebJobsStorage": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};AccountKey={2}', variables('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2021-09-01').keys[0].value)]",
"APPINSIGHTS_INSTRUMENTATIONKEY": "[reference(resourceId('Microsoft.Insights/components', variables('applicationInsightsName')), '2020-02-02').InstrumentationKey]",
"FUNCTIONS_EXTENSION_VERSION": "~4",
"ftpsState": "Disabled",
"minTlsVersion": "1.2"
},
"dependsOn": [
"[resourceId('Microsoft.Insights/components', variables('applicationInsightsName'))]",
"[resourceId('Microsoft.Web/sites', variables('functionAppName'))]",
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
]
}
]
}
Я использую Azure DevOps pipeline для развертывания этого шаблона, однако у меня возникает следующая ошибка: Статус сообщения: Невозможно обработать языковые выражения шаблона для ресурса ‘/subscriptions/subscriptionID/resourceGroups/DE3/providers/Microsoft.Web/sites/functionap-DE3/config/appsettings’ на строке ‘176’ и столбце ‘9’. ‘Невозможно оценить языковую функцию ‘format’: формат неверный: ‘Индекс (начиная с нуля) должен быть больше или равен нулю и меньше размера списка аргументов. С идентификатором корреляции без явной причины.
Я протестировал шаблон непосредственно в Azure portal, и он успешно прошел проверки валидации, но при развертывании через Azure pipeline он потерпел неудачу. Можете ли вы подсказать, как это исправить?
Я пытался изменить форматирование для этой строки кода "name": "[format('{0}/{1}', variables('functionAppName'), 'appsettings')]",
на "name": "[concat('{0}/{1}', variables('functionAppName'), 'appsettings')]",
при развертывании ошибка осталась прежней.
.
Ответ или решение
При развертывании или обновлении Azure Function App с использованием ARM-шаблона, вы столкнулись с ошибкой, связанной с выражениями языковой модели, что часто указывает на проблемы с форматированием или параметрами внутри шаблона. В приведенной вами информации ошибка гласит: "Unable to evaluate language function ‘format’: the format is invalid; Index (zero based) must be greater than or equal to zero and less than the size of the argument list". Давайте разберем, как можно устранить эту ошибку и улучшить ваш шаблон.
Важные моменты в вашем случае:
-
Проблема с функцией форматирования:
Ваша строка"name": "[format('{0}/{1}', variables('functionAppName'), 'appsettings')]"
использует функциюformat
, которая требует, чтобы количество переданных аргументов соответствовало количеству заполнительных маркеров (в данном случае,{0}
и{1}
). Проверьте, корректно ли определяется переменнаяfunctionAppName
. Это означает, что переменная должна быть инициализирована и содержать значение, не равноеNULL
или пустой строке. -
Проверка переменных:
Убедитесь, что переменнаяfunctionAppName
объявлена в разделеvariables
вашего шаблона и что она правильно инициализируется. Например:"variables": { "functionAppName": "имяВашегоFunctionApp", "storageAccountName": "имяВашегоStorageAccount", "applicationInsightsName": "имяВашегоApplicationInsights" }
-
Ошибки, связанные с параметрами Azure компонента:
Убедитесь, что ресурсы, от которых зависит ваш шаблон, успешно развёрнуты и имеют корректные имена. Если один из ресурсов, таких какapplicationInsightsName
, отсутствует или неправильно инициализирован, это также может вызвать подобную ошибку. -
Тестирование на локальном уровне:
Если вы тестируете шаблон в Azure Portal и там он проходит валидацию, но при развертывании через Azure DevOps возвращает ошибку, возможно, необходимо проверить, как значения переменных передаются в pipeline. Убедитесь, что pipeline не влияет на инициализацию переменных. -
Использование альтернатив:
Если функцияformat
продолжает выдавать ошибки, попробуйте альтернативный способ конкатенации строк с помощью функцииconcat
, однако строка должна быть правильно отформатирована:"name": "[concat(variables('functionAppName'), '/appsettings')]"
Рекомендации по устранению ошибки
- Проверьте все переменные, используемые в
format
илиconcat
. Убедитесь, что они не содержатNULL
или пустые значения. - Попробуйте добавить блоки
output
в ваш шаблон для вывода значений переменных, чтобы проверить их на этапе развертывания. - Убедитесь, что вы используете последнюю стабильную версию API для всех ресурсов в шаблоне, так как устаревшие версии могут иметь изменения в обработке.
Заключение
Каждая ошибка при развертывании Azure ресурса может быть вызвана многими факторами, связанными с типографическими ошибками или неверными зависимостями. Тщательный подход к диагностике и инспекции переменных и зависимостей поможет вам успешно развернуть ваш ARM-шаблон. Если ошибки продолжают возникать, рекомендуется очень внимательно просматривать все логи развертывания в Azure DevOps для выявления возможных дополнительных подсказок о причине сбоя.