🎼

Azure Container Apps で、ひとつの Container App に複数のコンテナイメージを構成する

2022/04/14に公開

Azure Container Apps 興味深いですね!

ドキュメントを調べていて、ひとつの Pod (Container App) に複数のコンテナイメージを利用できるという記載を見つけました。

1 つのコンテナー アプリで複数のコンテナーを定義できます。
...
構成の containers 配列に複数のコンテナーを定義して、複数のコンテナーを同時に実行します。

GUI (Azure portal) では、コンテナイメージをひとつしか指定できないため、この操作はできない模様です。

ARM Template からデプロイする必要がありそうということで、実際にやってみました。

環境・準備

  • Azure Container Apps
  • Windows 10
  • Windows PowerShell
  • Azure CLI (v2.30.0)

使ったサンプル

なんとなく、いつもの azure-voting-app-redis を使ってみました。

Kubernetes 用の yaml は、下記のチュートリアルが参考になります。

やってみた

ARM Template の作成

冒頭の通り、ARM Template の containers にて、複数のコンテナイメージ構成を配列で指定することになります。

原型は単一コンテナイメージの Container App で生成される ARM Template を参考に、前述の Kubernetes 用チュートリアルの yaml ファイルも参考にし、下記のように template.json および parameters.json を作成しました。

template.json
{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "subscriptionId": {
            "type": "string"
        },
        "name": {
            "type": "string"
        },
        "location": {
            "type": "string"
        },
        "environmentId": {
            "type": "string"
        },
        "containers": {
            "type": "array"
        },
        "secrets": {
            "type": "array"
        },
        "registries": {
            "type": "array"
        },
        "ingress": {
            "type": "object"
        }
    },
    "resources": [
        {
            "name": "[parameters('name')]",
            "kind": "containerapps",
            "location": "[parameters('location')]",
            "dependsOn": [],
            "properties": {
                "configuration": {
                    "secrets": "[parameters('secrets')]",
                    "registries": "[parameters('registries')]",
                    "ingress": "[parameters('ingress')]"
                },
                "template": {
                    "containers": "[parameters('containers')]"
                },
                "managedEnvironmentId": "[parameters('environmentId')]"
            },
            "apiVersion": "2022-01-01-preview",
            "type": "Microsoft.App/containerapps"
        }
    ]
}
parameters.json
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "subscriptionId": {
            "value": "..." // Subscription ID
        },
        "name": {
            "value": "vote-pod"
        },
        "location": {
            "value": "northeurope"
        },
        "environmentId": {
            "value": "..." // Container Apps Environment ID
        },
        "containers": {
            "value": [
                {
                    "name": "azure-vote-back",
                    "image": "mcr.microsoft.com/oss/bitnami/redis:6.0.8",
                    "command": [],
                    "resources": {
                        "cpu": ".25",
                        "memory": ".5Gi"
                    },
                    "env": [
                        {
                          "name": "ALLOW_EMPTY_PASSWORD",
                          "value": "yes"
                        }
                    ]
                },
                {
                    "name": "azure-vote-front",
                    "image": "mcr.microsoft.com/azuredocs/azure-vote-front:v1",
                    "command": [],
                    "resources": {
                        "cpu": ".25",
                        "memory": ".5Gi"
                    },
                    "env": [
                        {
                          "name": "REDIS",
                          "value": "azure-vote-back"
                        }
                    ]
                }
            ]
        },
        "registries": {
            "value": []
        },
        "secrets": {
            "value": []
        },
        "ingress": {
            "value": {
                "external": true,
                "targetPort": "80",
                "transport": "auto",
                "allowInsecure": true
            }
        }
    }
}

なお、各パラメーターに関しては、下記の公式ドキュメントが参考になります。

デプロイ

Container Apps 環境が作成されていれば、あとは ARM Template をデプロイすれば OK です。

az deployment group create --resource-group <リソースグループ名> --template-file template.json --parameters '@parameters.json'

動作確認

ARM Template を作成していて少し怪しいなと思っていたのですが、現状では「どのコンテナイメージの (どの) ポートにアクセス可能にする」という設定ができない状況であるようで、アプリ自体の動作確認はできませんでした。Log Analytics からログを確認すると、azure-vote-front から Redis (azure-vote-back) へのアクセスができていないようです。

とはいうものの、ちゃんとひとつの Container App において、複数のコンテナが起動していることは確認できました。

同一の ContainerAppName_s にて、複数の ContainerName_s が動作していることがわかります。

まとめ

まずは動作確認できたので満足です🤗

が、相互通信周りは更に勉強していく必要を感じたので、今後も少し試していこうと思います!

Discussion