Рубрики
Uncategorized

Развернуть код функций Azure с террафом

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

Для пошагового руководства на Предоставление облачных ресурсов Нужно управлять функциями 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, используйте этот подход.

использованная литература

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

Если вам нравится этот тип контента, вы жестяная банка Подписывайтесь на меня В Twitter для последних обновлений.

Оригинал: «https://dev.to/maxivanov/deploy-azure-functions-code-with-terraform-1h8b»