【问题标题】:How would you restart an Azure Function when the content of the WEBSITE_RUN_FROM_PACKAGE changes?当 WEBSITE_RUN_FROM_PACKAGE 的内容发生变化时,如何重新启动 Azure 函数?
【发布时间】:2020-10-13 08:59:47
【问题描述】:

我们有多个 (Java) Azure Functions,我们使用 Terraform 多次部署(目前约 10 个,未来可能有数百个)(针对不同客户的环境)。

这些功能正在使用我们的 CI/CD 管道构建和部署。在管道的最后,我们有一个 ZIP 文件,我们将其放入 Azure Blob 存储(例如 myFunction-latest.zip)。

当我们部署一个函数(使用 Terraform)时,我们在函数的“WEBSITE_RUN_FROM_PACKAGE”应用设置中为这个 zip (myFunction-latest.zip) 提供一个 SAS-URL(长期有效)。 这很好用。使用 SAS-url,该函数从 BLOB-storage 中提取 zip 并启动​​该函数。

我的问题是我们应该如何处理函数源的更新。我们的 CI/CD 将覆盖 blob 存储中的 myFunction-latest.zip,但是这些(可能数百个)函数如何知道它发生了变化?根据the documentation,我们需要“同步触发器”。同步触发器可以通过

  1. 使用它的“主密钥”在特定端点上调用函数的 URL。
  2. 在特定端点上调用 Azure 资源管理器 API。可以使用托管身份进行身份验证。
  3. 重新启动函数(在 Azure 门户中)。

在特定的 e 上调用函数的 URL

我有几个选项可以做到这一点,哪个最好?我们想要一种“基于拉动”的方法,这样我们就不必将更改推送到 100 多个客户的环境。

  1. 在部署时,Terraform 可以读取/计算 blob 的哈希值,并将其添加到 appsettings。当函数的内容发生变化时,这将有效地重新启动函数。但是,每次函数应用更改时,我们都需要为每个客户端运行 Terraform 计划/应用。此外,我们需要对我们在其中部署功能的(客户的)环境进行长期访问。
  2. 我们可以有一个单独的“管理”功能(每个客户环境),定期轮询所有 blob 并检查它们是否更改(基于散列或 updatedAt 字段)。此管理功能具有有权同步该环境中所有功能的触发器的身份。我认为这可行。
  3. 在函数本身中,函数应该轮询 SAS-URL,并检查它是否发生了变化(基于 hash 或 updatedAt 字段)。如果函数注意到 zip 更改,他应该在函数运行后“同步触发器”。

最好的选择是什么?我害怕使用选项 3 的开销,所以我正在考虑使用选项 2。

【问题讨论】:

    标签: azure azure-functions terraform


    【解决方案1】:

    选项二是一个不错的选择。正如您所提到的,它有足够的权限来完成其工作,而无需外部服务访问环境。

    您可以通过在每个实现webhook trigger pattern 的客户环境中部署一个逻辑应用程序来增强它以避免轮询(特别是如果您没有定期看到大量更新或想要近乎即时的更新)。

    根据上述文档,自定义 API(可能是 durable function)将在您的环境中运行,所有客户逻辑应用都将订阅该 API。

    上传较新版本的函数应用包时,CI/CD 管道将触发自定义 API,进而触发所有订阅的逻辑应用。

    这些逻辑应用只会在它们各自的函数应用上调用同步触发器

    您也可以使用durable functions 及其external events 功能为选项三实现类似的功能,同时确保安全性。


    以下内容目前在Public Preview

    另一个有趣的方法是使用Azure Event Grid Partner Topics。您将在订阅中拥有setup the Event Grid Partner 方面的内容,并拥有一个站点/表单,您的客户可以在其中注册活动,从而在他们的订阅中创建一个合作伙伴主题。

    然后逻辑应用或函数可以监听此主题的事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 2022-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多