通过ARM使用Azure容器实例来创建数量不确定的容器

时间:2019-06-24 14:34:44

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

我正尝试通过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模板中的代码段,显示了我如何使用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')]"
    }
}

1 个答案:

答案 0 :(得分:1)

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

例如,您可以从模板内部调用azure函数(HTTP触发器),并传入要创建的存储表名称,例如,

但是无论哪种方式都是黑客。