Для пошагового руководства на Предоставление облачных ресурсов Нужно управлять функциями Azure, проверьте Развертывание функций Azure с террафом Отказ
Этот пост фокусируется на том, как вы можете Опубликовать код в функциональную приложение с террафом. Здесь развернутое приложение — это функция Hello-World Node.js, но процесс является языком-агностическим.
Использование файла пакета — Рекомендуемый способ управлять функциями Azure. Когда новый код загружен, переключатель — атомный (то есть сейф). Производительность лучше и холодно начинается быстрее Отказ Это Легко откат до предыдущего развертывания, указывая на соответствующий пакет.
Есть 2 режима развертывания пакета: URL и приложение. Мы увидим преимущества и ограничения обоих, а также как для их реализации с террафом.
Код для Linux/Windows + потребления/премиум-конфигурации в Гадость .
Развертывание из пакета
В двух словах, развертывание из пакета означает пакет (zip-файл) и монтирование его содержимого в только для чтения /home/сайт/wwwroot
каталог.
Исходный пакет может быть сохранен в удаленном хранилище или загружено в службу приложения, в /home/data/sitepackages
каталог.
Режим развертывания продиктован Сайт_run_from_package
Настройка приложения.
Пакет в удаленном хранилище
Хранение может быть чем угодно, пока пакет может быть загружен сервисом приложения во время выполнения. Это подчеркивает нижнюю часть этой опции — всякий раз, когда приложение перезапущено, его ZIP должен быть заново загружено из хранения.
Наиболее распространенным подходом состоит в том, чтобы провести пакет в хранении BLOB и генерировать SAS URL Предоставление ограниченного доступа к пакету через функциональную конфигурацию приложения:
WEBSITE_RUN_FROM_PACKAGE = URL with SAS
Это еще один неудобство этого метода развертывания:
- Там сейчас секрет В параметрах приложения для управления (может протечь через конфигурацию/код/код приложения) и
- Токен SAS может Истекает (Приложение не сможет загрузить пакет и не будет начать)
Также документация государства:
При запуске приложения функции в Windows внешний вариант URL дает худшую производительность запуска. При развертывании вашего функционального приложения в Windows вы должны установить веб-сайт_run_from_package на 1 и публикуйте с развертыванием zip.
На хорошей стороне, бегущий из URL-адреса пакета хорошо поддерживается как Linux, так и Windows в области потребления, так и в премиум планах.
Пакет в приложении
В раз развертывания пакет загружается в /home/data/sitepackages
каталог. Этот каталог также имеет packagename.txt
Файл, который содержит ничего, кроме имени пакета, который в настоящее время используется. Вы можете обновить файл вручную, чтобы указать на другой пакет, и приложение функции будет перезапущено в ближайшее время и будет использовать код этого пакета.
Чтобы загрузить пакет на сервис приложения, вы должны использовать Развертывание zip Стратегия в сочетании с настройкой приложения:
WEBSITE_RUN_FROM_PACKAGE = 1
Без настройки приложения Zip Deploy просто извлечет пакет к /home/сайт/wwwroot
Каталог потери всех преимуществ развертывания запуска.
Поскольку нет необходимости загружать пакет по сети, когда запустится приложение функции, он должен привести к Более быстрый холодный старт Отказ
Обратите внимание, что по состоянию на март 2021 года Сайт_run_from_package
все еще не поддерживается в Потребление Linux Отказ Хосты Windows и Linux Premium работают нормально, хотя.
Развертывание кода с террафом
Чтобы поставить, я предполагаю, что у вас есть базовые функции Azure Terraporm Script (согласно этому посту).
Кроме того, обратитесь к этому посту Партспионский репозиторий Для полной настройки пример в разных средах.
Теперь мы можем сосредоточиться на том, что нужно, чтобы опубликовать/загрузить код на Azure.
Сайт_run_from_package =
Есть отличная статья Адриан Холл который описывает процесс развертывания кода из Azure Storage.
Я хотел пересмотреть решение, чтобы выделить новое Azurerm_Storage_account_blob_container_SAS
Ресурс террафора, а также предлагает сжать код с террафом, не полагаясь на NPM. Простые функции могут даже не использовать внешние модули, так что это хорошо для не имеют node.js и npm как зависимости в среде развертывания.
Для обеих режимов развертывания нам нужно Сжатие функционального кода для этого, чтобы быть загруженным. Для этого мы можем использовать Archive_file
тип данных.
data "archive_file" "file_function_app" { type = "zip" source_dir = "../function-app" output_path = "function-app.zip" }
Загрузить архив к Blob хранения Azure:
resource "azurerm_storage_blob" "storage_blob" { name = "${filesha256(var.archive_file.output_path)}.zip" storage_account_name = azurerm_storage_account.storage_account.name storage_container_name = azurerm_storage_container.storage_container.name type = "Block" source = var.archive_file.output_path }
Создать только для чтения SAS для капле. Разум Срок годности — Прошло на дату функциональные операции App Scale Out/Restart, поскольку ссылка Packge больше не будет работать. Используя Сервис SAS Здесь оптимален, так как он обеспечивает ограниченный доступ по сравнению с учетной записью SAS, созданный Azurerm_Storage_account_sas
Отказ
data "azurerm_storage_account_blob_container_sas" "storage_account_blob_container_sas" { connection_string = azurerm_storage_account.storage_account.primary_connection_string container_name = azurerm_storage_container.storage_container.name start = "2021-01-01T00:00:00Z" expiry = "2022-01-01T00:00:00Z" permissions { read = true add = false create = false write = false delete = false list = false } }
Наконец, предоставьте полный URL-адрес пакета в Сайт_run_from_package
Настройка приложения:
resource "azurerm_function_app" "function_app" { name = "${var.project}-function-app" resource_group_name = azurerm_resource_group.resource_group.name location = var.location app_service_plan_id = azurerm_app_service_plan.app_service_plan.id app_settings = { "WEBSITE_RUN_FROM_PACKAGE" = "https://${azurerm_storage_account.storage_account.name}.blob.core.windows.net/${azurerm_storage_container.storage_container.name}/${azurerm_storage_blob.storage_blob.name}${data.azurerm_storage_account_blob_container_sas.storage_account_blob_container_sas.sas}", "FUNCTIONS_WORKER_RUNTIME" = "node", "AzureWebJobsDisableHomepage" = "true", } os_type = "linux" site_config { linux_fx_version = "node|14" use_32_bit_worker_process = false } storage_account_name = azurerm_storage_account.storage_account.name storage_account_access_key = azurerm_storage_account.storage_account.primary_access_key version = "~3" }
Вот и все. Как только вы запустите Террафом применяется
Он подготовит пакет, загрузите его в хранилище, создайте ссылку и поместите ее в настройку приложения. Функциональное приложение перезагрузится, и через несколько секунд ваше приложение будет запустить новый код.
Подготовьте посылку ZIP:
data "archive_file" "file_function_app" { type = "zip" source_dir = "../function-app" output_path = "function-app.zip" }
Настройка функционального приложения, используя Сайт_run_from_package
Установка для ожидания пакета в файловой системе:
resource "azurerm_function_app" "function_app" { name = "${var.project}-function-app" resource_group_name = azurerm_resource_group.resource_group.name location = var.location app_service_plan_id = azurerm_app_service_plan.app_service_plan.id app_settings = { "WEBSITE_RUN_FROM_PACKAGE" = "1", "FUNCTIONS_WORKER_RUNTIME" = "node", "AzureWebJobsDisableHomepage" = "true", } os_type = "linux" site_config { linux_fx_version = "node|14" use_32_bit_worker_process = false } storage_account_name = azurerm_storage_account.storage_account.name storage_account_access_key = azurerm_storage_account.storage_account.primary_access_key version = "~3" }
Код будет толкаться в функциональную приложение с помощью команды Azure CLI:
locals { publish_code_command = "az webapp deployment source config-zip --resource-group ${azurerm_resource_group.resource_group.name} --name ${azurerm_function_app.function_app.name} --src ${var.archive_file.output_path}" }
Мы используем null_resource
Чтобы запустить команду публикации. Обратите внимание, что он будет запускаться каждый раз, когда содержимое файла пакета меняется. Если нет никаких изменений, код не будет загружен (имеет смысл!).
resource "null_resource" "function_app_publish" { provisioner "local-exec" { command = local.publish_code_command } depends_on = [local.publish_code_command] triggers = { input_json = filemd5(var.archive_file.output_path) publish_code_command = local.publish_code_command } }
Как вы можете видеть, этот метод проще, и, как мы обсуждали ранее, это приводит к более быстрому холоду. Так что, если вы не работаете на потреблении Linux, используйте этот подход.
использованная литература
- https://docs.microsoft.com/en-us/azure/azure-functions/run-functions-from-deployment-package
- https://docs.microsoft.com/en-us/azure/azure-functions/deployment-zip-push
- https://github.com/Azure/app-service-announcements/issues/84
- https://github.com/Azure/app-service-announcements-discussions/issues/32
- https://adrianhall.github.io/typescript/2019/10/23/terraform-functions/
- https://github.com/maximivanov/publish-az-func-code-with-terraform
…
Развертывание ресурсов функций Azure, а также код с террафом, когда вы не хотите, чтобы дополнительные зависимости используются только для публикации.
Если вам нравится этот тип контента, вы жестяная банка Подписывайтесь на меня В Twitter для последних обновлений.
Оригинал: «https://dev.to/maxivanov/deploy-azure-functions-code-with-terraform-1h8b»