Функция Azure исчезает при использовании terraform apply

Мы подготовили решение с terraform в лазурном режиме, одним из шагов является подготовка функционального приложения.

отдельный конвейер устанавливает функцию программного обеспечения в приложении функции

когда я повторно запускаю terraform apply (для обновления чего-либо), функции программного обеспечения удаляются из приложения функции azure

Это ожидаемое поведение при использовании terraform версии 1.22?

Исходя из исходного вопроса. Я считаю, что сегодняшнее изменение с terraform 1.21 на 1.22 добавило дополнительное приложение в приложение-функцию. который, казалось, повторно развернул все приложение-функцию вместо того, чтобы просто добавить настройку приложения и тем самым разрушить функциональность, потому что функции исчезли.

Я не уверен, является ли это ошибкой или ожидаемым поведением, но, по крайней мере, мы этого не ожидали.

Поскольку я не хочу снова что-то развертывать только из-за изменения аппсеттинга. Кто-нибудь сталкивается с этим, и у вас есть работа, или это их рабочий процесс, который я пропустил в документации terraform.

Дополнительная информация Редактировать 2:

Функция Azure создана вот так

resource "azurerm_function_app" "xxx"{
name = "xxx-status2signalr-func"
location = "${var.region}"
resource_group_name = "${azurerm_resource_group.xxx.name}"
app_service_plan_id = "${azurerm_app_service_plan.xxx.id}"
storage_connection_string = "${azurerm_storage_account.xxx.primary_connection_string}"
enable_builtin_logging = "false"
app_settings {      
  "blabladosmomethingEventhub" = "${var.blabla-something-eventhub}"
  "blabladosomethingChangedEventhubConsumer" = "${var.blabla-dosomething-eventhub-consumer}"
  "blablasomethingEventhubConnectionkeyListen" = "${var.xxxblabladosomethingchangedlisten}"
  "AzureSignalRConnectionString" = "${azurerm_signalr_service.xxx.primary_connection_string}"
  "WEBSITE_RUN_FROM_PACKAGE" = "1"
}
enabled="true"
version="~2"

}

Функция создана красиво Мы развернули программную часть функции, которая в настоящее время используется в Visual Studio, развертывание правой кнопкой мыши

Все работает

Теперь мы внесли следующее изменение в ключ appsettings

resource "azurerm_function_app" "xxx"{
name = "xxx-status2signalr-func"
location = "${var.region}"
resource_group_name = "${azurerm_resource_group.xxx.name}"
app_service_plan_id = "${azurerm_app_service_plan.xxx.id}"
storage_connection_string = "${azurerm_storage_account.xxx.primary_connection_string}"
enable_builtin_logging = "false"
app_settings {
  "APPINSIGHTS_INSTRUMENTATIONKEY" = "${azurerm_application_insights.xxx.instrumentation_key}"
  "blabladosmomethingEventhub" = "${var.blabla-something-eventhub}"
  "blabladosomethingChangedEventhubConsumer" = "${var.blabla-dosomething-eventhub-consumer}"
  "blablasomethingEventhubConnectionkeyListen" = "${var.xxxblabladosomethingchangedlisten}"
  "AzureSignalRConnectionString" = "${azurerm_signalr_service.xxx.primary_connection_string}"
  "WEBSITE_RUN_FROM_PACKAGE" = "1"
}
enabled="true"
version="~2"

}

в выходных данных плана было показано обновление 1 "APPINSIGHTS_INSTRUMENTATIONKEY" = "$ {azurerm_application_insights.xxx.instrumentation_key}"

При проверке приложения ключ был красиво добавлен, но развернутого программного обеспечения не было.

Любые указания по этому поводу приветствуются.


person Beneke    schedule 15.02.2019    source источник
comment
Похоже, это повторное развертывание экземпляра функции Azure. Добавьте проверку, чтобы увидеть, существует ли он, а затем оставьте его в покое, если вы не хотите, чтобы его повторно развертывали.   -  person Murray Foxcroft    schedule 15.02.2019
comment
Что ж, раз уж мы храним состояние в лазурном хранилище BLOB-объектов, я ожидал, что terraform знает, что его нельзя повторно развертывать?   -  person Beneke    schedule 15.02.2019
comment
расширил вопрос   -  person Beneke    schedule 15.02.2019
comment
Можете ли вы отредактировать свой вопрос, чтобы поделиться своим кодом Terraform, а также выводом плана, который показывает, что функция собирается удалить?   -  person ydaetskcoR    schedule 15.02.2019
comment
Добавлена ​​дополнительная информация   -  person Beneke    schedule 18.02.2019
comment
Не могли бы вы поделиться фактическим результатом плана?   -  person ydaetskcoR    schedule 18.02.2019
comment
Привет, @Beneke, есть какие-то выводы?   -  person Rostislav V    schedule 06.05.2020


Ответы (3)


Похоже, в вашем развертывании используются пакеты. Если вы развертываете приложение через Terraform, а затем выполняете развертывание через VS, настройка приложения будет установлена: WEBSITE_RUN_FROM_PACKAGE на 1. Если вы обновите функцию с помощью Terraform, монтирование не будет осуществляться в wwwroot. Таким образом, обновление функции через Terraform приведет к неправильному монтированию пакета. Чтобы этого избежать - добавьте WEBSITE_RUN_FROM_PACKAGE, равный 1, в ваше развертывание Terraform. Это должно исправить. Дайте мне знать, если это поможет, и отметьте это как ответ :)

person rari2003    schedule 26.05.2020

Если я чего-то не упускаю, вот что происходит:

  1. Вы развертываете свою инфраструктуру с Terraform. Приложение-функция имеет настройку "WEBSITE_RUN_FROM_PACKAGE" = "1" (как определено в вашем сценарии TF).

  2. Вы развертываете код с помощью основных инструментов Функций Azure или VSCode. Он загружает ваш код в учетную запись хранения и подключает его к папке /home/site/wwwroot хоста FA. Инструмент развертывания обновляет настройки приложения. Сейчас WEBSITE_RUN_FROM_PACKAGE = <url to the blob storage>.

  3. Приложение-функция (облачный ресурс) есть, код есть, и ваше приложение работает.

  4. Вы вносите некоторые изменения в сценарий TF и ​​повторно развертываете его. Он перезаписывает параметр приложения WEBSITE_RUN_FROM_PACKAGE значением 1.

  5. Функция Среда выполнения приложения больше не может найти код приложения (WEBSITE_RUN_FROM_PACKAGE = 1 означает, что код хранится на самом хосте FA). Ваше приложение не работает.

Что вы можете сделать, так это убедиться, что ваш инструмент развертывания кода устанавливает параметр WEBSITE_RUN_FROM_PACKAGE=1 таким образом, чтобы он соответствовал определению TF (примечание: не поддерживается всеми средами выполнения), или указать Terraform игнорировать изменения параметра WEBSITE_RUN_FROM_PACKAGE. :

resource "azurerm_function_app" "function_app" {
  ...
   
  lifecycle {
    ignore_changes = [
      app_settings["WEBSITE_RUN_FROM_PACKAGE"], # prevent TF reporting configuration drift after app code is deployed
    ]
  }

Полное объяснение здесь < / em>.

person Max Ivanov    schedule 19.12.2020

Была аналогичная проблема, помогло установить WEBSITES_ENABLE_APP_SERVICE_STORAGE на false в terraform.

Если параметр WEBSITES_ENABLE_APP_SERVICE_STORAGE не указан или имеет значение true, каталог / home / будет совместно использоваться экземплярами масштабирования, а записанные файлы будут сохраняться при перезапусках. Явная установка для WEBSITES_ENABLE_APP_SERVICE_STORAGE значения false отключит монтирование.

https://docs.microsoft.com/en-us/azure/app-service/containers/app-service-linux-faq.

person Rostislav V    schedule 26.05.2020