【问题标题】:Azure Function "Host keys" not created with Terraform未使用 Terraform 创建的 Azure 函数“主机密钥”
【发布时间】:2021-02-19 03:11:03
【问题描述】:

如果我通过门户手动创建 Azure 函数,则会创建应用密钥:

如果我通过 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
  }

没有创建应用密钥:

Terraform documentation 中没有如何创建这些密钥,但您可以将它们读为data

谁能指出正确的方向是如何创建键的?!

【问题讨论】:

    标签: function terraform terraform-provider-azure


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      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】:

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

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

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

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

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

        【讨论】:

          【解决方案4】:

          我也遇到过同样的问题,就我而言,不同之处在于删除了版本参数:

          version = "~3"
          

          删除它会重新生成密钥。

          【讨论】:

            【解决方案5】:

            对我来说,问题在于之前已从资源组中删除了同名的函数应用,并且存储帐户中的旧密钥“阻止”了新密钥的创建和/或找到。从存储中删除旧密钥并通过 Terraform 重新创建函数应用解决了该问题。

            【讨论】:

              猜你喜欢
              • 2022-11-19
              • 1970-01-01
              • 2021-08-09
              • 1970-01-01
              • 1970-01-01
              • 2021-03-17
              • 1970-01-01
              • 2017-09-01
              • 2019-09-25
              相关资源
              最近更新 更多