使用Terraform Apply时Azure功能消失了

时间:2019-02-15 15:07:02

标签: azure azure-functions terraform terraform-provider-azure

我们在天蓝色下提供了带有terraform的解决方案 步骤之一是配置功能应用程序

单独的管道将软件功能安装在功能应用程序中

当我重新运行Terraform时应用(用于更新某些内容) 软件功能已从天蓝色功能应用程序中删除

使用Terraform版本1.22 这是预期的行为吗?

从原始问题扩展。 我相信今天从terraform 1.21变为1.22 向功能应用程序添加了额外的应用程序设置。 似乎重新部署了整个功能应用程序,而不仅仅是添加了应用程序设置,并且由于功能消失而破坏了功能。

我不确定这是错误还是预期的行为,但至少这不是我们所期望的。

因为我不想仅仅因为更改appsetting而再次部署某些东西。是有人遇到这个问题吗?您有没有解决的方法?我在terraform文档中错过了他们的工作流程吗?

其他信息编辑2:

这样创建的天蓝色函数

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}”

在检查appsetting键时添加的很好 但是部署的软件不见了。

非常欢迎您提出任何建议。

3 个答案:

答案 0 :(得分:1)

除非我遗漏了什么,否则就是这样:

  1. 您使用 Terraform 部署基础设施。函数应用具有 "WEBSITE_RUN_FROM_PACKAGE" = "1" 设置(如您的 TF 脚本中所定义)。

  2. 您使用 Azure Functions 核心工具或 VSCode 部署代码。它会将您的代码上传到存储帐户并将其挂载到 FA 主机的 /home/site/wwwroot 文件夹。部署工具更新应用程序设置。现在是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
    ]
  }

完整说明here

答案 1 :(得分:0)

看起来,您的部署使用Packages。 如果您通过Terraform部署应用程序,然后再通过VS进行部署,则会设置一个应用程序设置:WEBSITE_RUN_FROM_PACKAGE为1。 如果您通过Terraform更新功能,则安装将不会到wwwroot。因此,通过Terraform更新功能将导致未正确安装软件包。 为了避免这种情况,请在Terraform部署中将WEBSITE_RUN_FROM_PACKAGE添加为1。 这应该解决它。 让我知道是否有帮助,并将其标记为答案:)

答案 2 :(得分:0)

遇到类似的问题,有助于在Terraform中将WEBSITES_ENABLE_APP_SERVICE_STORAGE设置为false

如果未指定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