コンテナー インスタンスを Azure 仮想ネットワークにデプロイする

Azure Virtual Network では、Azure リソースやオンプレミス リソースのセキュアなプライベート ネットワーキングが提供されます。 Azure 仮想ネットワークにコンテナー グループをデプロイすれば、それらのコンテナーで、仮想ネットワーク内の他のリソースと安全に通信することができます。

この記事では、Azure CLI で az container create コマンドを使用して、新しい仮想ネットワークまたは既存の仮想ネットワークにコンテナー グループを展開する方法について説明します。

重要

仮想ネットワークにコンテナー グループをデプロイする前に、まず制限事項を確認することをお勧めします。 ネットワークのシナリオと制限事項については、Azure Container Instances の仮想ネットワークのシナリオとリソースに関するページを参照してください。

重要

仮想ネットワークへのコンテナー グループのデプロイは、一般に Azure Container Instances が利用可能なほとんどのリージョンでは、Linux および Windows コンテナーで使用できます。 詳細については、「available-regions」を参照してください。

重要

ネットワーク プロファイルは、2021-07-01 API バージョンで廃止されました。 このバージョンまたはより新しいバージョンを使用している場合は、ネットワーク プロファイルに関連する手順とアクションは無視してください。

この記事の例は、Bash シェル形式で示してあります。 PowerShell やコマンド プロンプトなど、別のシェルを使用する場合は、行継続文字を適切に調整してください。

新しい仮想ネットワークへのデプロイ

Note

サブネット IP 範囲 /29 を使用して 3 つの IP アドレスのみを持つ場合。 常に上記の 1 つの範囲に移動することをお勧めします (以下は行わない)。 たとえば、サブネット IP 範囲 /28 を使用すると、コンテナー グループごとに 1 つ以上の IP バッファーを使用できます。 こうすることで、スタックした状態、開始できない状態、起動できない状態、さらには停止できない状態のコンテナーも回避することができます。

新しい仮想ネットワークにデプロイして、ネットワーク リソースを自動的に作成するには、az container create を実行するときに次の項目を指定します。

  • 仮想ネットワーク名
  • 仮想ネットワーク アドレスのプレフィックス (CIDR 形式)
  • サブネット名
  • サブネット アドレスのプレフィックス (CIDR 形式)

仮想ネットワークとサブネットのアドレス プレフィックスでは、仮想ネットワークとサブネットそれぞれのアドレス空間を指定します。 これらの値は、CIDR (Classless Inter-domain Routing) 表記法で表されます (例: 10.0.0.0/16)。 サブネットの操作について詳しくは、「仮想ネットワーク サブネットの追加、変更、削除」をご覧ください。

この方法を使用して最初のコンテナー グループをデプロイした後は、仮想ネットワーク名とサブネット名を指定するか、Azure によって自動作成されたネットワーク プロファイルを指定して、同じサブネットへのデプロイを実行できます。 サブネットは Azure によって Azure Container Instances に委任されるので、サブネットにデプロイできるのは、コンテナー グループのみとなります。

次の az container create コマンドは、新しい仮想ネットワークとサブネットの設定を指定します。 仮想ネットワーク内のコンテナー グループのデプロイが利用できるリージョンで作成されたリソース グループの名前を指定します。 このコマンドにより、パブリックの Microsoft aci-helloworld コンテナーがデプロイされます。これは、静的 Web ページを提供する小規模な Node.js Web サーバーを実行するコンテナーです。 次のセクションでは、同じサブネットに 2 つ目のコンテナー グループをデプロイし、2 つのコンテナー インスタンス間の通信をテストします。

az container create \
  --name appcontainer \
  --resource-group myResourceGroup \
  --image mcr.microsoft.com/azuredocs/aci-helloworld \
  --vnet aci-vnet \
  --vnet-address-prefix 10.0.0.0/16 \
  --subnet aci-subnet \
  --subnet-address-prefix 10.0.0.0/24

この方法を使って新しい仮想ネットワークへのデプロイを実行する際には、ネットワーク リソースの作成に数分かかることがあります。 最初のデプロイが済んだら、同じサブネットへの追加のコンテナー グループはより短時間でデプロイできます。

既存の仮想ネットワークへのデプロイ

コンテナー グループを既存の仮想ネットワークにデプロイするには:

  1. 既存の仮想ネットワーク内にサブネットを作成し、コンテナー グループが既にデプロイされている既存のサブネットを使用するか、または、他のリソースや構成がいっさい入っていない空の既存のサブネットを使用します。
  2. az container create を使用してコンテナー グループをデプロイし、次のいずれかを指定します。
    • 仮想ネットワーク名とサブネット名
    • 仮想ネットワーク リソース ID、およびサブネット リソース ID (これにより、別のリソース グループから仮想ネットワークを使用できます)
    • ネットワーク プロファイルの名前または ID (これは、az network profile list を使用して取得できます)

次の例では、前に作成した同じサブネットに 2 つ目のコンテナー グループをデプロイし、2 つのコンテナー インスタンス間の通信を検証します。

まず、デプロイした 1 つ目のコンテナー グループ (appcontainer) の IP アドレスを取得します。

az container show --resource-group myResourceGroup \
  --name appcontainer \
  --query ipAddress.ip --output tsv

出力には、プライベート サブネット内にあるコンテナー グループの IP アドレスが表示されます。 次に例を示します。

10.0.0.4

次に、CONTAINER_GROUP_IPaz container show コマンドで取得した IP アドレスに設定し、次の az container create コマンドを実行します。 この 2 つ目のコンテナー (commchecker) は、Alpine Linux ベースのイメージを実行し、最初のコンテナー グループのプライベート サブネット IP アドレスに対して wget を実行します。

CONTAINER_GROUP_IP=<container-group-IP-address>

az container create \
  --resource-group myResourceGroup \
  --name commchecker \
  --image alpine:3.5 \
  --command-line "wget $CONTAINER_GROUP_IP" \
  --restart-policy never \
  --vnet aci-vnet \
  --subnet aci-subnet

この 2 つ目のコンテナーのデプロイが完了したら、実行された wget コマンドの出力を確認するために、ログを取得します。

az container logs --resource-group myResourceGroup --name commchecker

2 つ目のコンテナーが最初のコンテナーと正常に通信できた場合、出力は次のようになります。

Connecting to 10.0.0.4 (10.0.0.4:80)
index.html           100% |*******************************|  1663   0:00:00 ETA

ログ出力を見ると、wget が最初のコンテナーに接続し、ローカル サブネット上のプライベート IP アドレスを使用して、最初のコンテナーからインデックス ファイルをダウンロードできたことがわかります。 2 つのコンテナー グループ間のネットワーク トラフィックは、仮想ネットワーク内に維持されたことになります。

例 - YAML

YAML ファイル、Resource Manager テンプレート、またはその他のプログラムによる方法 (Python SDK など) を使用して、既存の仮想ネットワークにコンテナーグループをデプロイすることもできます。

たとえば、YAML ファイルを使用する場合、Azure Container Instances に委任されたサブネットを持つ仮想ネットワークにデプロイできます。 次のプロパティを指定します。

  • ipAddress: コンテナー グループのプライベート IP アドレス設定。
    • ports:開くポート (もしあれば)。
    • protocol:開いたポートのプロトコル (TCP または UDP)。
  • subnetIds: デプロイ先のサブネットのリソース ID
    • id: サブネットのリソース ID
    • name: サブネットの名前

この YAML は、appcontaineryaml という名前のコンテナー グループを仮想ネットワーク内に作成します。

apiVersion: '2021-07-01'
location: westus
name: appcontaineryaml
properties:
  containers:
  - name: appcontaineryaml
    properties:
      image: mcr.microsoft.com/azuredocs/aci-helloworld
      ports:
      - port: 80
        protocol: TCP
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
  ipAddress:
    type: Private
    ports:
    - protocol: tcp
      port: '80'
  osType: Linux
  restartPolicy: Always
  subnetIds:
    - id: <subnet-id>
      name: default
tags: null
type: Microsoft.ContainerInstance/containerGroups

az container create コマンドを使って、--file パラメーターに YAML ファイル名を指定して、コンテナー グループをデプロイします。

az container create --resource-group myResourceGroup \
  --file vnet-deploy-aci.yaml

デプロイが完了したら、az container show コマンドを実行して状態を表示します。 サンプル出力:

Name              ResourceGroup    Status    Image                                       IP:ports     Network    CPU/Memory       OsType    Location
----------------  ---------------  --------  ------------------------------------------  -----------  ---------  ---------------  --------  ----------
appcontaineryaml  myResourceGroup  Running   mcr.microsoft.com/azuredocs/aci-helloworld  10.0.0.5:80  Private    1.0 core/1.5 gb  Linux     westus

リソースをクリーンアップする

コンテナー インスタンスの削除

作成したコンテナー インスタンスの操作が完了したら、次のコマンドを使ってそれらを削除します。

az container delete --resource-group myResourceGroup --name appcontainer -y
az container delete --resource-group myResourceGroup --name commchecker -y
az container delete --resource-group myResourceGroup --name appcontaineryaml -y

ネットワーク リソースの削除

現在このフィーチャーでは、先ほど作成したネットワーク リソースを削除するために、いくつかの追加コマンドが必要です。 この記事の前のセクションに示したサンプル コマンドを使って仮想ネットワークとサブネットを作成した場合は、次のスクリプトを使ってそれらのネットワーク リソースを削除できます。 このスクリプトは、単一のネットワーク プロファイルを持つ単一の仮想ネットワークがリソース グループに含まれていることを前提としています。

スクリプトを実行する前に、RES_GROUP 変数を、削除する仮想ネットワークとサブネットを含んだリソース グループの名前に設定してください。 以前に提案された aci-vnet の名前を使用しなかった場合は、仮想ネットワークの名前を更新します。 スクリプトは Bash シェル用に書式設定されています。 別のシェル (PowerShell やコマンド プロンプトなど) を使用する場合は、変数の割り当てとアクセサーを適宜調整する必要があります。

警告

このスクリプトを実行すると、リソースが削除されます。 仮想ネットワークと、それに含まれているすべてのサブネットが削除されます。 このスクリプトを実行する前に、仮想ネットワーク (およびそれに含まれるすべてのサブネット) 内のいずれのリソースも、今後必要でないことを確認してください。 一度削除すると、それらのリソースを復旧することはできません

# Replace <my-resource-group> with the name of your resource group
# Assumes one virtual network in resource group
RES_GROUP=<my-resource-group>

# Get network profile ID
# Assumes one profile in virtual network
NETWORK_PROFILE_ID=$(az network profile list --resource-group $RES_GROUP --query [0].id --output tsv)

# Delete the network profile
az network profile delete --id $NETWORK_PROFILE_ID -y

# Delete virtual network
az network vnet delete --resource-group $RES_GROUP --name aci-vnet

次のステップ