使用 terraform apply 时 Azure Function 消失

Ben*_*eke 6 azure terraform azure-functions terraform-provider-azure

我们在 azure 中使用 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"
Run Code Online (Sandbox Code Playgroud)

}

功能创建得很好我们部署了当前使用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"
Run Code Online (Sandbox Code Playgroud)

}

计划的输出显示更新 1 "APPINSIGHTS_INSTRUMENTATIONKEY" = "${azurerm_application_insights.xxx.instrumentation_key}"

检查时,应用程序设置密钥已很好地添加,但部署的软件消失了。

非常欢迎对此的任何指示。

max*_*x_i 5

除非我遗漏了什么,否则发生的事情是这样的:

  1. 您可以使用 Terraform 部署基础设施。Function App 有"WEBSITE_RUN_FROM_PACKAGE" = "1"设置(如 TF 脚本中定义)。

  2. 使用 Azure Functions Core Tools 或 VSCode 部署代码。它将您的代码上传到存储帐户并将其安装到 FA 主机的/home/site/wwwroot文件夹。部署工具更新应用程序设置。下雪了WEBSITE_RUN_FROM_PACKAGE = <url to the blob storage>

  3. 函数应用程序(云基础设施资源)在那里,代码在那里,并且您的应用程序正在运行。

  4. 您对 TF 脚本进行一些更改并重新部署它。它会WEBSITE_RUN_FROM_PACKAGE使用值 覆盖应用程序设置1

  5. Function App 运行时无法再找到应用程序代码(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
    ]
  }
Run Code Online (Sandbox Code Playgroud)

完整解释在这里


rar*_*003 2

看起来,您的部署使用了包。如果您通过 Terraform 部署应用程序,然后通过 VS 进行部署,应用程序设置将被设置:WEBSITE_RUN_FROM_PACKAGE 为 1。如果您通过 Terraform 更新功能,则安装不会到 wwwroot。因此,通过 Terraform 更新函数将导致包挂载失败。为了避免这种情况 - 在 Terraform 部署中添加 WEBSITE_RUN_FROM_PACKAGE 设置为 1。这应该可以解决它。让我知道这是否有帮助并将其标记为答案:)