Azure Container Instances に Azure ファイル共有をマウントする
既定では、Azure Container Instances はステートレスです。 コンテナーが再起動されるか、クラッシュまたは停止すると、そのすべての状態が失われます。 コンテナーの有効期間後も状態を保持するには、外部ストアからボリュームをマウントする必要があります。 この記事に示すように、Azure Container Instances では Azure Files で作成された Azure ファイル共有をマウントすることができます。 Azure Files は、Azure Storage でホストされ、業界標準の Server Message Block (SMB) プロトコルを介してアクセスできる、完全に管理されたファイル共有を提供します。 Azure Container Instances で Azure ファイル共有を使用することで、 Azure 仮想マシンで Azure ファイル共有を使用するのと同様のファイル共有機能を提供します。
制限事項
- Azure Storage では、マネージド ID を使用したファイル共有の SMB マウントはサポートされていません
- Azure Files 共有は、Linux コンテナーにのみマウントできます。 Linux と Windows コンテナー グループの機能サポートの違いについての詳細は、概要に関するページを参照してください。
- Azure ファイル共有ボリュームのマウントでは、Linux コンテナーを "ルート" として実行している必要があります。
- Azure ファイル共有ボリュームのマウントは、CIFS サポートに限定されています。
Note
Azure Files 共有をコンテナー インスタンスにマウントすることは、Docker のバインド マウントに似ています。 ファイルまたはディレクトリが存在するコンテナー ディレクトリに共有をマウントする場合、ファイルまたはディレクトリはマウントによって隠され、コンテナーの実行中はアクセスできなくなります。
重要
委任されたサブネットでインターネットへの送信接続がブロックされている場合は、委任されたサブネット上の Azure Strorage にサービス エンドポイントを追加する必要があります。
Azure ファイル共有を作成する
Azure Container Instances で Azure ファイル共有を使用するには、まず、ファイル共有を作成する必要があります。 次のスクリプトを実行して、ファイル共有および共有自体をホストするためのストレージ アカウントを作成してください。 ストレージ アカウント名はグローバルに一意にする必要があるため、このスクリプトは、ベース文字列にランダムな値を追加します。
# Change these four parameters as needed
ACI_PERS_RESOURCE_GROUP=myResourceGroup
ACI_PERS_STORAGE_ACCOUNT_NAME=mystorageaccount$RANDOM
ACI_PERS_LOCATION=eastus
ACI_PERS_SHARE_NAME=acishare
# Create the storage account with the parameters
az storage account create \
--resource-group $ACI_PERS_RESOURCE_GROUP \
--name $ACI_PERS_STORAGE_ACCOUNT_NAME \
--location $ACI_PERS_LOCATION \
--sku Standard_LRS
# Create the file share
az storage share create \
--name $ACI_PERS_SHARE_NAME \
--account-name $ACI_PERS_STORAGE_ACCOUNT_NAME
ストレージの資格情報の取得
Azure Container Instances で Azure ファイル共有をボリュームとしてマウントするには、ストレージ アカウント名、共有名、ストレージ アクセス キーの 3 つの値が必要です。
ストレージ アカウント名 - 前出のスクリプトを使用した場合、ストレージアカウント名は
$ACI_PERS_STORAGE_ACCOUNT_NAME
変数に格納されました。 アカウント名を表示するには、次のように入力します。echo $ACI_PERS_STORAGE_ACCOUNT_NAME
共有名 - この値は既にわかっています (前出のスクリプトで
acishare
として定義されています)ストレージ アカウント キー - この値は次のコマンドを使用して確認できます。
STORAGE_KEY=$(az storage account keys list --resource-group $ACI_PERS_RESOURCE_GROUP --account-name $ACI_PERS_STORAGE_ACCOUNT_NAME --query "[0].value" --output tsv) echo $STORAGE_KEY
コンテナーのデプロイとボリュームのマウント - CLI
Azure CLI を使用して Azure ファイル共有をコンテナー内のボリュームとしてマウントするには、az container create でコンテナーを作成する際に、共有とボリュームのマウント ポイントを指定します。 前述の手順に従った場合、次のコマンドを使ってコンテナーを作成すれば、先ほど作成した共有をマウントすることができます。
az container create \
--resource-group $ACI_PERS_RESOURCE_GROUP \
--name hellofiles \
--image mcr.microsoft.com/azuredocs/aci-hellofiles \
--dns-name-label aci-demo \
--ports 80 \
--azure-file-volume-account-name $ACI_PERS_STORAGE_ACCOUNT_NAME \
--azure-file-volume-account-key $STORAGE_KEY \
--azure-file-volume-share-name $ACI_PERS_SHARE_NAME \
--azure-file-volume-mount-path /aci/logs/
--dns-name-label
値は、コンテナー インスタンスを作成する Azure リージョン内で一意である必要があります。 コマンドを実行したときに DNS 名ラベルのエラー メッセージが表示された場合は、前述のコマンドの値を更新してください。
マウントしたボリューム内のファイルの管理
コンテナーが起動したら、Microsoft aci-hellofiles イメージ経由でデプロイされる Web アプリを使用して、指定したマウント パスにある Azure ファイル共有内に小さいテキスト ファイルを作成できます。 az container show コマンドを使用して、Web アプリの完全修飾ドメイン名 (FQDN) を取得します。
az container show --resource-group $ACI_PERS_RESOURCE_GROUP \
--name hellofiles --query ipAddress.fqdn --output tsv
アプリを使用してテキストを保存したら、Azure portal または Microsoft Azure Storage Explorer などのツールを使用して、ファイル共有に書き込まれる 1 つ以上のファイルを取得および検査することができます。
コンテナーのデプロイとボリュームのマウント - YAML
Azure CLI と YAML テンプレートを使用して、コンテナー グループをデプロイしてコンテナー内にボリュームをマウントすることもできます。 複数のコンテナーから成るコンテナー グループをデプロイするときは、YAML テンプレートによるデプロイ方法が推奨されます。
以下の YAML テンプレートは、aci-hellofiles
イメージで作成されたコンテナーを 1 つ含むコンテナー グループを定義しています。 コンテナーでは、以前にボリュームとして作成された Azure ファイル共有 acishare がマウントされます。 示されているように、ファイル共有をホストするストレージ アカウントの名前とストレージ キーを入力します。
CLI の例のように、dnsNameLabel
値は、コンテナー インスタンスを作成する Azure リージョン内で一意である必要があります。 必要に応じて、YAML ファイル内の値を更新します。
apiVersion: '2019-12-01'
location: eastus
name: file-share-demo
properties:
containers:
- name: hellofiles
properties:
environmentVariables: []
image: mcr.microsoft.com/azuredocs/aci-hellofiles
ports:
- port: 80
resources:
requests:
cpu: 1.0
memoryInGB: 1.5
volumeMounts:
- mountPath: /aci/logs/
name: filesharevolume
osType: Linux
restartPolicy: Always
ipAddress:
type: Public
ports:
- port: 80
dnsNameLabel: aci-demo
volumes:
- name: filesharevolume
azureFile:
sharename: acishare
storageAccountName: <Storage account name>
storageAccountKey: <Storage account key>
tags: {}
type: Microsoft.ContainerInstance/containerGroups
この YAML テンプレートを使ってデプロイするには、上記の YAML を deploy-aci.yaml
という名前のファイルに保存し、--file
パラメーターを指定して az container create コマンドを実行します。
# Deploy with YAML template
az container create --resource-group myResourceGroup --file deploy-aci.yaml
コンテナーのデプロイとボリュームのマウント - Resource Manager
CLI と YAML によるデプロイに加え、Azure Resource Manager テンプレートを使って、コンテナー グループをデプロイしてコンテナー内にボリュームをマウントすることもできます。
最初に、テンプレートのコンテナー グループ properties
セクションに volumes
配列を入力します。
次に、ボリュームをマウントする各コンテナーに対して、コンテナー定義の properties
セクションで volumeMounts
配列を設定します。
以下の Resource Manager テンプレートは、aci-hellofiles
イメージで作成されたコンテナーを 1 つ含むコンテナー グループを定義しています。 コンテナーでは、以前にボリュームとして作成された Azure ファイル共有 acishare がマウントされます。 示されているように、ファイル共有をホストするストレージ アカウントの名前とストレージ キーを入力します。
前の例のように、dnsNameLabel
値は、コンテナー インスタンスを作成する Azure リージョン内で一意である必要があります。 必要に応じて、テンプレート内の値を更新します。
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"container1name": "hellofiles",
"container1image": "mcr.microsoft.com/azuredocs/aci-hellofiles"
},
"resources": [
{
"name": "file-share-demo",
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2019-12-01",
"location": "[resourceGroup().location]",
"properties": {
"containers": [
{
"name": "[variables('container1name')]",
"properties": {
"image": "[variables('container1image')]",
"resources": {
"requests": {
"cpu": 1,
"memoryInGb": 1.5
}
},
"ports": [
{
"port": 80
}
],
"volumeMounts": [
{
"name": "filesharevolume",
"mountPath": "/aci/logs"
}
]
}
}
],
"osType": "Linux",
"ipAddress": {
"type": "Public",
"ports": [
{
"protocol": "tcp",
"port": "80"
}
],
"dnsNameLabel": "aci-demo"
},
"volumes": [
{
"name": "filesharevolume",
"azureFile": {
"shareName": "acishare",
"storageAccountName": "<Storage account name>",
"storageAccountKey": "<Storage account key>"
}
}
]
}
}
]
}
この Resource Manager テンプレートを使ってデプロイするには、上記の JSON を deploy-aci.json
という名前のファイルに保存し、--template-file
パラメーターを指定して az deployment group create コマンドを実行します。
# Deploy with Resource Manager template
az deployment group create --resource-group myResourceGroup --template-file deploy-aci.json
複数ボリュームのマウント
コンテナー インスタンスに複数のボリュームをマウントするには、Azure Resource Manager テンプレート、YAML ファイル、またはその他のプログラムによる方法を使用してデプロイを行う必要があります。 テンプレートまたは YAML ファイルを使用するには、ファイルの properties
セクションで volumes
配列を設定することにより、共有の詳細を指定し、ボリュームを定義します。
たとえば、share1 および share2 という 2 つの Azure Files 共有をストレージ アカウント myStorageAccount に作成した場合、Resource Manager テンプレート内の volumes
配列は次の例のようになります。
"volumes": [{
"name": "myvolume1",
"azureFile": {
"shareName": "share1",
"storageAccountName": "myStorageAccount",
"storageAccountKey": "<storage-account-key>"
}
},
{
"name": "myvolume2",
"azureFile": {
"shareName": "share2",
"storageAccountName": "myStorageAccount",
"storageAccountKey": "<storage-account-key>"
}
}]
次に、ボリュームをマウントするコンテナー グループ内の各コンテナーに対して、コンテナー定義の properties
セクションで volumeMounts
配列を設定します。 たとえば、以下は、前に定義した 2 つのボリューム myvolume1 と myvolume2 をマウントします。
"volumeMounts": [{
"name": "myvolume1",
"mountPath": "/mnt/share1/"
},
{
"name": "myvolume2",
"mountPath": "/mnt/share2/"
}]
次のステップ
Azure Container Instances にその他の種類のボリュームをマウントする方法について学習してください。