【发布时间】: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,我们需要“同步触发器”。同步触发器可以通过
- 使用它的“主密钥”在特定端点上调用函数的 URL。
- 在特定端点上调用 Azure 资源管理器 API。可以使用托管身份进行身份验证。
- 重新启动函数(在 Azure 门户中)。
在特定的 e 上调用函数的 URL
我有几个选项可以做到这一点,哪个最好?我们想要一种“基于拉动”的方法,这样我们就不必将更改推送到 100 多个客户的环境。
- 在部署时,Terraform 可以读取/计算 blob 的哈希值,并将其添加到 appsettings。当函数的内容发生变化时,这将有效地重新启动函数。但是,每次函数应用更改时,我们都需要为每个客户端运行 Terraform 计划/应用。此外,我们需要对我们在其中部署功能的(客户的)环境进行长期访问。
- 我们可以有一个单独的“管理”功能(每个客户环境),定期轮询所有 blob 并检查它们是否更改(基于散列或 updatedAt 字段)。此管理功能具有有权同步该环境中所有功能的触发器的身份。我认为这可行。
- 在函数本身中,函数应该轮询 SAS-URL,并检查它是否发生了变化(基于 hash 或 updatedAt 字段)。如果函数注意到 zip 更改,他应该在函数运行后“同步触发器”。
最好的选择是什么?我害怕使用选项 3 的开销,所以我正在考虑使用选项 2。
【问题讨论】:
标签: azure azure-functions terraform