根据对 FQDN 的 Web 请求启动容器实例

Start container instance on web request to FQDN

假设我们有一个很少使用的(容器化的)后端。也许每隔几天左右,一个(静态)网络前端调用该后端的一个 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 调用。但是 的服务需要一直 运行!理想情况下,我希望容器在收到请求时自行启动。

Azure 容器实例没有启动它们的 webbook 或 HTTP 触发器。但是,您可以使用 Azure Functions 或 Logic App 为您有效 运行 az container start,然后使用 HTTP 调用它。使用这两种方法中的任何一种,您都必须设置一些 IAM 权限以向 ACI 资源授予 Function 或 Logic App 权限以启动它。

一种方法是:

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