【问题标题】:Use Azure Container Instances via ARM to create an indeterminate number of containers通过 ARM 使用 Azure 容器实例来创建不确定数量的容器
【发布时间】:2019-06-26 22:31:11
【问题描述】:

我正在尝试通过 ARM 模板部署 Azure 存储帐户以及不确定数量的表。

由于 MS 尚未为 ARM 提供表资源类型,我改为使用 Azure 容器实例来启动运行 azure-cli 的容器,然后以这种方式创建表。

正如您在下面的示例中所见,我使用property iteration 创建多个容器 - 每个表一个容器。这似乎一直有效,直到要创建的表数量发生变化,然后我开始收到错误。

容器组“your-aci-instance”的更新无效。如果您要更新容器组的操作系统类型、重启策略、网络配置文件、CPU、内存或 GPU 资源,则必须先将其删除,然后再创建一个新的。

我明白它在说什么,但对我来说,您可以创建一个容器组但不能更改其中的容器组,这确实让我感到奇怪。

由于 ARM 不允许您删除资源,因此我必须在我的部署过程中添加一个手动步骤,以确保 ACI 不存在,这并不理想。

同样不可取的是使用resource iteration 创建多个 ACI - 可能会有许多 ACI 散布在永远不会再次使用的资源组中。

是否有一些我还不知道的 ARM 魔法可以帮助我创建满足以下条件的表?

  • 仅创建一个 ACI。
  • 要创建的表数可以更改。

注意事项

我曾尝试使用variable iteration 为单个容器创建单个“命令”数组,但似乎 ACI 将所有命令视为一个行,因此导致错误。

进一步阅读表明只能在容器启动时运行一个命令。

How do I run multiple commands when deploying a container group?

当前尝试

这是我的 ARM 模板中的一个 sn-p,展示了我如何使用 property iteration 来尝试实现我的目标。

{
    "condition": "[not(empty(variables('tables')))]",
    "type": "Microsoft.ContainerInstance/containerGroups",
    "name": "[parameters('containerInstanceName')]",
    "apiVersion": "2018-10-01",
    "location": "[resourceGroup().location]",
    "properties": {
        "copy": [
            {
                "name": "containers",
                "count": "[max(length(variables('tables')), 1)]",
                "input": {
                    "name": "[toLower(variables('tables')[copyIndex('containers')])]",
                    "properties": {
                        "image": "microsoft/azure-cli",
                        "command": [
                            "az",
                            "storage",
                            "table",
                            "create",
                            "--name",
                            "[variables('tables')[copyIndex('containers')]]"
                        ],
                        "environmentVariables": [
                            {
                                "name": "AZURE_STORAGE_KEY",
                                "value": "[listkeys(parameters('storageAccount_Application_Name'), '2019-04-01').keys[0].value]"
                            },
                            {
                                "name": "AZURE_STORAGE_ACCOUNT",
                                "value": "[parameters('storageAccount_Application_Name')]"
                            },
                            {
                                "name": "DATETIME",
                                "value": "[parameters('dateTime')]"
                            }
                        ],
                        "resources": {
                            "requests": {
                                "cpu": "1",
                                "memoryInGb": "1.5"
                            }
                        }
                    }
                }
            }
        ],
        "restartPolicy": "OnFailure",
        "osType": "Linux"
    },
    "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccount_Application_Name'))]"
    ],
    "tags": {
        "displayName": "Application Storage Account - Tables",
        "Application": "[parameters('tagApplication')]",
        "environment": "[parameters('tagEnvironment')]",
        "version": "[parameters('tagVersion')]"
    }
}

【问题讨论】:

  • 为什么要通过 ARM 创建 ACI 并在 ACI 中运行 Azure CLI?为什么不只运行 Azure CLI?有什么原因吗?

标签: azure azure-resource-manager arm-template azure-container-instances


【解决方案1】:

如果它说该字段是不可变的 - 确实如此,那么您真的无能为力。您始终可以为该容器实例创建一个唯一名称并使用完整的部署模式,并且仅将 ACI 部署到此特定资源组,这样它将始终只有此 ACI 实例,而其他实例将被删除,它将解决不变性。

例如,您可以从模板(HTTP 触发器)内部调用一个 azure 函数并传入存储表的名称来创建,它会执行此操作。

但无论哪种方式,它都是一个黑客。

【讨论】:

  • 感谢您的回复。看起来选项1必须是我要走的路。很遗憾,因为这意味着我必须将我的 ARM 模板一分为二。希望 MS 能尽快解决 ARM 模板缺乏表格资源的问题!
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 2023-04-04
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多