不是使用Terraform创建的Azure函数“主机密钥”

时间:2020-11-06 11:23:21

标签: function terraform terraform-provider-azure

如果我通过门户网站应用程序手动创建Azure功能,则会创建以下密钥: enter image description here

如果我通过terraform尝试相同的操作:

功能应用程序

  resource "azurerm_function_app" "resize_images" {
    name                      = format("%s%s%s%s", module.subscription_prefix.prefix, "pfunctionapp", lower(local.environment), "0001")
    location                  = azurerm_resource_group.azure_functions.location
    resource_group_name       = azurerm_resource_group.azure_functions.name
    app_service_plan_id       = module.app_service_plan.id
  
    # AzureRM 1.x needs this
    #storage_connection_string = local.azure_functions_storage_account_primary_connection_string
  
    # AzureRM 2.x needs this
    storage_account_name       = data.azurerm_storage_account.resize_storage.name
    storage_account_access_key = data.azurerm_storage_account.resize_storage.primary_access_key
  
    app_settings = {
      AzureWebJobsDashboard          = data.azurerm_storage_account.resize_storage.primary_connection_string
      AzureWebJobsStorage            = data.azurerm_storage_account.resize_storage.primary_connection_string
      BLOB_STORAGE_CONNECTION_STRING = data.azurerm_storage_account.resize_storage.primary_connection_string
      CONTAINER_NAME = "images"
      FUNCTIONS_EXTENSION_VERSION = "~3"
      WEBSITE_HTTPLOGGING_RETENTION_DAYS = "3"
      WEBSITE_RUN_FROM_PACKAGE = "1"
    }
  
    version = "~3"
  
    tags = local.tags
  }

未创建任何应用程序密钥: enter image description here

Terraform documentation中,没有什么方法可以创建这些键,但是您可以将它们读为data

有人可以指出正确的方向吗?

4 个答案:

答案 0 :(得分:1)

默认情况下,密钥存储在AzureWebJobsStorage设置提供的帐户的Blob存储容器中。在您的代码中,密钥确实是在该关联的存储帐户上自动生成的,但是没有显示在Azure Function应用程序UI上。

在我验证之后,如果您删除了WEBSITE_RUN_FROM_PACKAGE = "1"中的app_settings,那么您将在Function应用程序中看到默认的App键。将WEBSITE_RUN_FROM_PACKAGE设置添加到功能应用程序设置后,它可使功能应用程序从程序包运行。我认为这或多或少会覆盖默认的Azure功能部署行为。阅读this了解更多详情。

答案 1 :(得分:1)

我不完全确定这是问题的完整解决方案,删除此 app_setting 后我仍然收到它。

对我来说,这看起来像是一个时间问题,terraform 创建了函数,然后我要求提供密钥,但没有密钥,terraform 失败,我等待不到一分钟,密钥就在那里,重新运行 apply 和所有作品...

真的很难找到解决这个问题的方法。

更新: 因此 Azure 提供程序 2.45.1 在检索密钥时超时。 然而,Provider 2.51.0 没有...

似乎已在最新的提供程序上修复了超时。

答案 2 :(得分:1)

我们有这个错误,并且仍然在最新版本的 azurerm (2.54) 上看到它,对我们来说,恢复到 version = "~1" 不是一个选项。应用程序密钥是在 blob 存储中创建的,但生成的 v3 Function App 无法找到它们。我们必须删除包含加密密钥的旧 blob 并将其添加到函数应用程序设置 CONTAINER_NAME = "azure-webjobs-secrets" 地形

Terraformed Function 应用的整个 app_settings 如下

   app_settings = {
     AzureWebJobsDashboard          = data.azurerm_storage_account.sg.primary_connection_string
     AzureWebJobsStorage            = data.azurerm_storage_account.sg.primary_connection_string
     CONTAINER_NAME = "azure-webjobs-secrets"
     FUNCTIONS_EXTENSION_VERSION = "~3"
     WEBSITE_HTTPLOGGING_RETENTION_DAYS = "3"
   }

这为我们修复了

答案 3 :(得分:0)

我遇到了同样的问题,就我而言,区别在于删除了版本参数:

 [main] ERROR org.drools.compiler.kie.builder.impl.KieContainerImpl - Unknown KieSession name: colorSession
 [main] ERROR org.drools.compiler.kie.builder.impl.KieContainerImpl - Unknown KieSession name: rulesSession

删除它会使密钥再次生成。