首页 > 解决方案 > 在向 FQDN 发出 Web 请求时启动容器实例

问题描述

假设我们有一个(容器化的)后端,它只是很少使用。可能每隔几天左右,(静态)Web 前端调用该后端的 API 端点。

后端恰好是无状态的。没有数据存储或任何东西。

我们希望将托管成本降至最低,理想情况下希望按秒计费。它每个月只会运行几分钟,我们只想为这种使用付费。基本上,我们想要功能即服务 (FaaS),但需要整个后端,而不仅仅是单个功能。

Azure 容器实例似乎非常适合这种情况。它可以在需要时在容器中启动后端。然后,后端可以在一段时间不使用后再次自行关闭。

所以,让我们创建一个容器实例......

az container create \
    --resource-group myResourceGroup \
    --name mycontainer \
    --image mycontainerimage \
    --restart-policy Never
    --dns-name-label mybackend123 
    --ports 80

太好了,我们的后端在其 FQDN 上运行http://mybackend123.eastus.azurecontainer.io

如上所述,它会在一段时间不使用后自行关闭。多亏了--restart-policy Never,ACI 不会重新启动容器,而是将其保持在状态Stopped

我的问题是:如果对 FQDN 的 Web 请求到达,有什么方法可以再次自动启动容器?

当然,我们可以通过跑步自己唤醒它……

az container start --resource-group myResourceGroup --name mycontainer

...或使用等效的 API 调用。但是这样做的服务需要一直运行!理想情况下,我希望容器在收到请求时自行启动。

标签: azureazure-container-instances

解决方案


Azure 容器实例没有启动它们的 webbook 或 HTTP 触发器。但是,您可以使用可以为您有效运行的 Azure 函数或逻辑应用程序,az container start然后使用 HTTP 调用它。使用这两种方法中的任何一种,您都必须设置一些 IAM 权限,才能将函数或逻辑应用程序权限授予 ACI 资源以启动它。

一种方法是:

  1. 使用 HTTP 触发器和托管标识创建 Azure 函数
  2. 授予托管身份参与者访问 ACI 容器组的权限
  3. 在函数内运行az container start或等效的 REST 调用以启动 ACI 容器
  4. 调用 Azure 函数(使用函数令牌)来启动容器。

推荐阅读