目的
前回「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とおなじのため、省略します。
Dockerfileの作成
コンテナ単体で起動できるDockerfileを作成します。ここにはプログラムソースや必要なコンポーネントのインストールが含まれます。
ローカル用のYAMLファイルの作成
複数のDockerfileからYAMLファイルを使用して、一度にプロビジョニングを行ったり、環境情報(特にDB周りの初期設定)を登録します。
ローカルデプロイと検証
ローカル上での動作検証をします。
コンテナレポジトリの作成
Azure上のコンテナレポジトリを作成し、ローカルで作成したイメージをタグごとに保管する場所とします。
イメージビルドとコンテナレポジトリへのアップロード
イメージビルドを行い、一度起動し、その後止めます。止まっているイメージに対して、イメージの取得、Azureコンテナレポジトリへイメージのアップロードを行います。
Azure Container 環境を作成
ACAの利用には、Azure Container 環境が必須のため、事前作成する
Azure FilesをAzure Container 環境へ紐づけ
Azure FilesのSMB領域を”/docker-entrypoint-initdb.d”としてマウントする
ACI用のパラメータファイルの作成
Azure Container Apps(ACA)用のJSONファイルを作成する。
Azureへのデプロイ
作成したACA用のJSONファイルを引数として、Azure上にコンテナを作成する。
検証
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と同様に想定通り、動きました。
Comments