如何获取使用 Terraform 部署的功能应用程序中的“功能网址”?

Posted

技术标签:

【中文标题】如何获取使用 Terraform 部署的功能应用程序中的“功能网址”?【英文标题】:How to get the "Function Url" which is with in a Function-App deployed using Terraform? 【发布时间】:2021-11-14 04:50:54 【问题描述】:

作为 IaC 的一部分,一个 Function App,我们将其命名为 FuncAppX 是使用 Terraform 部署的,它具有内置功能。

我需要在使用 Terraform 的函数应用程序中访问同一函数的 Url。我在这里分享相同的屏幕截图以供参考,其中很容易获得“GetFunction Url”,但使用 terraform,我没有办法返回相同的内容,需要传递为另一个函数应用的输入。

Function App Function within FunctionApp

【问题讨论】:

不要链接到外部图像服务。将它们添加到此帖子中,以便将来该问题仍然可以理解。 【参考方案1】:

您需要自己构建特定函数端点的 URL。由于具体的函数名称是通过function.json 定义的,因此您需要将其复制到您的 Terraform 脚本中。

locals 
  function_foo = "foo"

URL 包含一个秘密作为查询参数,您可以通过数据源azurerm_function_app_host_keys 获取。

data "azurerm_function_app_host_keys" "example" 
  name                = azurerm_function_app.example.name
  resource_group_name = azurerm_function_app.example.resource_group_name

  depends_on = [azurerm_function_app.example]

现在您可以自己构建 URL。

output "url" 
  value = "https://$azurerm_function_app.example.default_hostname/api/$local.function_foo?code=$data.azurerm_function_app_host_keys.example.default_function_key"

请注意,azurerm_function_app_host_keys 值可能不会立即可用,因为具体 Function App 的部署与 azurerm_function_app 服务创建是分离的。根据您的情况,您可能需要添加一些手动同步(例如使用null_resource)。

【讨论】:

【参考方案2】:

考虑通过 azure 中的 API 管理 资源向您公开 http 触发函数。不过你也可以直接调用函数。

要获取函数应用的 url,您可以使用 azurerm_function_app 上的 default_hostname 属性,例如使用 azurerm_key_vault_secret 放入 keyvault。

该属性在 terraform 文档here 中列出。

当然这不会链接到具体功能,也不会包含所需的密钥。

要提取访问该功能所需的密钥,您可以使用function_app_host_keys。您在哪里获得默认功能键

然后您可以检索 default_function_key

然后你需要结合这些东西来调用函数(注意你只能调用带有http触发器的函数)。

函数的 url 将是 default_hostname/api/functionname?code=default_function_key

【讨论】:

以上是关于如何获取使用 Terraform 部署的功能应用程序中的“功能网址”?的主要内容,如果未能解决你的问题,请参考以下文章

使用 terraform 获取和更新特定字段

如何使用一个 terraform 脚本和不同的变量值管理多个不同环境的部署

使用 terraform 和 arm 模板通过工作流部署逻辑应用程序的最佳方法?

如何使用 Terraform 为 Azure 资源创建警报

Terraform + AWS ECS,持续部署流程?

使用Terraform部署代码和管理配置