top of page
ccf代表

Azure Container AppsでAP-DB構成を組んでみる

目的

前回「Azure Container InstancesでAP-DB構成を組んでみる」で、ACIを使ったコンテナ構成を組んでみましたが、Dockerよりの機能がためか、スポット的な利用であればいいのですが、絶えず動かしておくには少しコストが掛かりすぎる印象です。

そこで、Azure Container Appsも試してみました。


ACIとACAの違い

※あくまで私の印象です。

比較項目

Azure Container Instance

Azure Container Apps

利用頻度が低い場合のコスト

高い ※インスタンスの起動時間単位の課金

安い ※アクセス頻度に応じた従量課金

カスタムドメインの利用

可能 ただし、デフォルトドメインに対するCNAME等の設定が必要

可能 ただし、Azure内部でカスタムドメイン設定が必要

証明書の管理

Azure上で管理不可

Azure上で管理可能

プロビジョニング方法

Yamlファイルで可能Dockerライクな方法

ARM Templateファイル JSON等Azure独自な方法

手順の複雑さ

簡易

複雑Azure Container 環境等を作る必要がある


作業の流れ

※1−5は、ACIとおなじのため、省略します。

  1. Dockerfileの作成

    コンテナ単体で起動できるDockerfileを作成します。ここにはプログラムソースや必要なコンポーネントのインストールが含まれます。

  2. ローカル用のYAMLファイルの作成

    複数のDockerfileからYAMLファイルを使用して、一度にプロビジョニングを行ったり、環境情報(特にDB周りの初期設定)を登録します。

  3. ローカルデプロイと検証

    ローカル上での動作検証をします。

  4. コンテナレポジトリの作成

    Azure上のコンテナレポジトリを作成し、ローカルで作成したイメージをタグごとに保管する場所とします。

  5. イメージビルドとコンテナレポジトリへのアップロード

    イメージビルドを行い、一度起動し、その後止めます。止まっているイメージに対して、イメージの取得、Azureコンテナレポジトリへイメージのアップロードを行います。

  6. Azure Container 環境を作成

    ACAの利用には、Azure Container 環境が必須のため、事前作成する

  7. Azure FilesをAzure Container 環境へ紐づけ

    Azure FilesのSMB領域を”/docker-entrypoint-initdb.d”としてマウントする

  8. ACI用のパラメータファイルの作成

    Azure Container Apps(ACA)用のJSONファイルを作成する。

  9. Azureへのデプロイ

    作成したACA用のJSONファイルを引数として、Azure上にコンテナを作成する。

  10. 検証

    Azure上のコンテナの動作検証する。


6.Azure Container 環境を作成

ACA作成時に同時に作成できますが、今回は事前に作っておきます。

az containerapp env create --name ${Azure Container 環境名} --resource-group ${リソースグループ名} --location "Japan East"

その後、Azure Container 環境のIDを取得します。

az containerapp env show --name ${Azure Container 環境名} --resource-group ${リソースグループ名} --query id --output tsv

このIDは一括作成用のパラメータに転記するので、記録しておきます。


7.Azure FilesをAzure Container 環境へ紐づけ

前回「Azure Container InstancesでAP-DB構成を組んでみる」で使ったAzure Filesをそのまま利用します。

az containerapp env storage set --name ${Azure Container 環境名} --resource-group ${リソースグループ名} \
    --storage-name ${ストレージ名(任意)} \
    --storage-type AzureFile \
    --azure-file-account-name ${ストレージアカウント名} \
    --azure-file-account-key ${アクセスキー} \
    --azure-file-share-name ${ストレージアカウント内の共有したいフォルダ} \
    --access-mode ReadWrite

8.ACI用のパラメータファイルの作成

まずはテンプレートファイルの作成します。


以下のサイトを参考にしています。


想定通りのパラメータをどのように記載すべきかがよくわからなかったので、一度portal上で作成したうえで、以下のように作ったものがどういった表記になるかを確認しました。

az containerapp show -n ${Azure Container Apps名} -g ${リソースグループ名} -o json > app.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"
        },
        "volumes": {
	    "type": "array"
	}
    },
    "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')]",
                    "volumes": "[parameters('volumes')]"
                },
                "managedEnvironmentId": "[parameters('environmentId')]"
            },
            "apiVersion": "2024-10-02-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": "サブスクリプションID"
        },
        "name": {
            "value": "Azure Container Apps名"
        },
        "location": {
            "value": "japaneast"
        },
        "environmentId": {
            "value": "/subscriptions/${サブスクリプションID}/resourceGroups/${リソースググループ名}/providers/Microsoft.App/managedEnvironments/${Azure Container 環境}"
        },
        "containers": {
            "value": [
                {
                    "name": "db",
                    "image": "${コンテナレポジトリ名}.azurecr.io/php-test_db:1.0.3",
                    "command": [],
                    "resources": {
                        "cpu": ".25",
                        "memory": ".5Gi"
                    },
		    "volumeMounts": [
			{
				"mountPath": "/docker-entrypoint-initdb.d",
				"volumeName": "data"
			}
		    ]
                },
                {
                    "name": "ap",
                    "image": "${コンテナレポジトリ名}.azurecr.io/php-test_ap:1.0.3",
                    "command": [],
                    "resources": {
                        "cpu": ".25",
                        "memory": ".5Gi"
                    }
                }
            ]
        },
        "registries": {
            "value": [
		{
            		"server": "${コンテナレポジトリ名}.azurecr.io",
	    		"username": "${コンテナレポジトリ名}",
	    		"passwordSecretRef": "my-registory-password"
		}
	    ]
        },
        "secrets": {
            "value": [
	    	{
			"name": "my-registory-password",
			"value": "パスワード"
	    	}
	    ]
        },
	"volumes": {
	    "value": [
		{
			"name": "data",
			"storageType": "AzureFile",
			"storageName": "${ストレージ名(任意)}"
		}
	    ]
	},
        "ingress": {
            "value": {
                "external": true,
                "targetPort": "80",
                "transport": "auto",
                "allowInsecure": true
            }
        }
    }
}

Azureへのデプロイ

作成したテンプレートファイルとパラメータファイルを引数にして、リソースを一括作成する。

az deployment group create --resource-group ${リソースグループ名} --template-file template.json --parameters @parameters.json

検証

ACIと同様に想定通り、動きました。



閲覧数:0回0件のコメント

最新記事

すべて表示

Comments


bottom of page