コンテナー グループへの送信と受信トラフィック用の 1 つのパブリック IP アドレスを構成する

外部接続用の IP アドレスを使ってコンテナー グループを設定することにより、外部クライアントはその IP アドレスを使用してグループ内のコンテナーにアクセスすることができます。 たとえば、ブラウザーは、コンテナーで実行されている Web アプリにアクセスできます。 ただし、現在、コンテナー グループでは送信トラフィックに対して異なる IP アドレスが使用されています。 このエグレス IP アドレスはプログラムによって公開されないため、コンテナー グループの監視とクライアント ファイアウォール規則の構成がより複雑になります。

この記事では、Azure Firewall と統合された仮想ネットワークでコンテナー グループを構成する手順について説明します。 コンテナー グループへのユーザー定義ルートとファイアウォール規則を設定することにより、コンテナー グループとの間のトラフィックをルーティングおよび識別できます。 コンテナー グループのイングレスとエグレスでは、ファイアウォールのパブリック IP アドレスが使用されます。 Azure Container Instances に委任された仮想ネットワークのサブネットにデプロイされた複数のコンテナー グループで 1 つのエグレス IP アドレスを使用することができます。

この記事では、Azure CLI を使用して、このシナリオのリソースを作成します。

  • 仮想ネットワーク内の委任されたサブネットにデプロイされたコンテナー グループ
  • 静的パブリック IP アドレスを持つネットワークにデプロイされた Azure ファイアウォール
  • コンテナー グループのサブネット上のユーザー定義ルート
  • ファイアウォール イングレス用の NAT 規則とエグレス用のアプリケーション規則

次に、ファイアウォールを経由するサンプル コンテナー グループからのイングレスとエグレスを検証します。

Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。

前提条件

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

  • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

Azure Cloud Shell を起動する

Azure Cloud Shell は無料のインタラクティブ シェルです。この記事の手順は、Azure Cloud Shell を使って実行することができます。 一般的な Azure ツールが事前にインストールされており、アカウントで使用できるように構成されています。

Cloud Shell を開くには、コード ブロックの右上隅にある [使ってみる] を選択します。 https://shell.azure.com に移動して、別のブラウザー タブで Cloud Shell を起動することもできます。

Cloud Shell が開いたら、お使いの環境に対して Bash が選択されていることを確認します。 後続のセッションでは、Bash 環境で Azure CLI を使用します。[コピー] を選択してコードのブロックをコピーし、Cloud Shell に貼り付けます。その後、Enter キーを押してそれを実行します。

Azure へのサインイン

Cloud Shell は、サインインした最初のアカウントで自動的に認証されます。 別のサブスクリプションを使用してサインインするには、次のスクリプトを使用し、<Subscription ID> をご使用の Azure サブスクリプション ID に置き換えます。 Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。

subscription="<subscriptionId>" # add subscription here

az account set -s $subscription # ...or use 'az login'

詳細については、アクティブなサブスクリプションの設定または対話形式のログインに関する記事を参照してください

注意

完全なスクリプトをダウンロードするには、完全なスクリプトに移動します。

はじめに

このチュートリアルでは、ランダム化された変数を使用します。 既存のリソース グループを使用している場合は、この変数を適切な値を変更します。

resourceGroup=resourceGroup$RANDOM

Azure リソース グループ: Azure リソース グループをまだ持ってない場合は、az group create コマンドを使用してリソース グループを作成します。 必要に応じて、場所の値を変更します。

az group create --name $resourceGroup --location eastus

仮想ネットワークに ACI をデプロイする

一般的なケースでは、コンテナー グループをデプロイする Azure 仮想ネットワークが既に存在している可能性があります。 デモンストレーションを目的として、次のコマンドでは、コンテナー グループの作成時に仮想ネットワークとサブネットを作成します。 サブネットは Azure Container Instances に委任されます。

コンテナー グループは、aci-helloworld イメージから小さな Web アプリを実行します。 ドキュメントの他の記事で示されているように、このイメージには、静的な HTML ページを返す、Node.js で作成された小さな Web アプリがパッケージされています。

az container create コマンドを使用してコンテナー グループを作成します。

az container create \
  --name appcontainer \
  --resource-group $resourceGroup \
  --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

ヒント

--subnet address-prefix の値は、サブネットに必要な IP アドレス空間に合わせて調整します。 サポートされる最小サブネットは /29 で、これにより 8 つの IP アドレスが提供されます。 一部の IP アドレスは、Azure で使用するために予約されています。

後の手順で使用するために、[az container show][az-container-show] コマンドを実行して、コンテナー グループのプライベート IP アドレスを取得します。

aciPrivateIp="$(az container show --name appcontainer \
  --resource-group $resourceGroup \
  --query ipAddress.ip --output tsv)"

Azure Firewall をネットワークにデプロイする

次のセクションでは、Azure CLI を使用して、Azure ファイアウォールを仮想ネットワークにデプロイします。 背景については、「チュートリアル: Deploy and configure Azure Firewall using the Azure portal (チュートリアル: Azure portal を使用して Azure Firewall のデプロイと構成を行う)」を参照してください。

最初に、az network vnet subnet create を使用して、ファイアウォール用の AzureFirewallSubnet という名前のサブネットを追加します。 AzureFirewallSubnet は、このサブネットの "必須" の名前です。

az network vnet subnet create \
  --name AzureFirewallSubnet \
  --resource-group $resourceGroup \
  --vnet-name aci-vnet   \
  --address-prefix 10.0.1.0/26

サブネットにファイアウォールを作成するには、次の Azure CLI コマンドを使用します。

まだインストールされていない場合は、az extension add コマンドを使用して、ファイアウォール拡張機能を Azure CLI に追加します。

az extension add --name azure-firewall

az network firewall create コマンドを使用して、ファイアウォール リソースを作成します。

az network firewall create \
  --name myFirewall \
  --resource-group $resourceGroup \
  --location eastus

az network public-ip create \
  --name fw-pip \
  --resource-group $resourceGroup \
  --location eastus \
  --allocation-method static \
  --sku standard
    
az network firewall ip-config create \
  --firewall-name myFirewall \
  --name FW-config \
  --public-ip-address fw-pip \
  --resource-group $resourceGroup \
  --vnet-name aci-vnet

az network firewall update コマンドを使用して、ファイアウォールの構成を更新します。

az network firewall update \
  --name myFirewall \
  --resource-group $resourceGroup

az network firewall ip-config list コマンドを使用して、ファイアウォールのプライベート IP アドレスを取得します。 このプライベート IP アドレスは、後のコマンドで使用します。

fwPrivateIp="$(az network firewall ip-config list \
  --resource-group $resourceGroup \
  --firewall-name myFirewall \
  --query "[].privateIpAddress" --output tsv)"

az network public-ip show コマンドを使用して、ファイアウォールのパブリック IP アドレスを取得します。 このパブリック IP アドレスは、後のコマンドで使用します。

fwPublicIp="$(az network public-ip show \
  --name fw-pip \
  --resource-group $resourceGroup \
  --query ipAddress --output tsv)"

ACI サブネットにユーザー定義ルートを定義する

Azure ファイアウォールにトラフィックを転送するために、ACI サブネットにユーザー定義ルートを定義します。 詳細については、ネットワーク トラフィックのルーティングに関する記事を参照してください。

ルート テーブルを作成する

最初に、次の az network route-table create コマンドを実行して、ルート テーブルを作成します。 ルート テーブルは、仮想ネットワークと同じリージョンに作成します。

az network route-table create \
  --name Firewall-rt-table \
  --resource-group $resourceGroup \
  --location eastus \
  --disable-bgp-route-propagation true

ルートを作成する

az network-route-table route create を実行して、ルート テーブルにルートを作成します。 トラフィックをファイアウォールにルーティングするには、次ホップの種類を VirtualAppliance に設定し、ファイアウォールのプライベート IP アドレスを次ホップ アドレスとして渡します。

az network route-table route create \
  --resource-group $resourceGroup \
  --name DG-Route \
  --route-table-name Firewall-rt-table \
  --address-prefix 0.0.0.0/0 \
  --next-hop-type VirtualAppliance \
  --next-hop-ip-address $fwPrivateIp

ルート テーブルを ACI サブネットに関連付ける

az network vnet subnet update コマンドを実行して、Azure Container Instances に委任されたサブネットにルート テーブルを関連付けます。

az network vnet subnet update \
  --name aci-subnet \
  --resource-group $resourceGroup \
  --vnet-name aci-vnet \
  --address-prefixes 10.0.0.0/24 \
  --route-table Firewall-rt-table

ファイアウォールで規則を構成する

既定では、Azure Firewall は、受信および送信トラフィックを拒否 (ブロック) します。

ファイアウォールで ACI サブネットに対する NAT 規則を構成する

ネットワーク内で以前に開始したアプリケーション コンテナーへの受信インターネット トラフィックを変換およびフィルター処理するために、ファイアウォールに NAT 規則を作成します。 詳細については、Azure Firewall DNAT を使用したインバウンド インターネット トラフィックのフィルター処理に関する記事を参照してください。

az network firewall nat-rule create コマンドを使用して、NAT 規則とコレクションを作成します。

az network firewall nat-rule create \
  --firewall-name myFirewall \
  --collection-name myNATCollection \
  --action dnat \
  --name myRule \
  --protocols TCP \
  --source-addresses '*' \
  --destination-addresses $fwPublicIp \
  --destination-ports 80 \
  --resource-group $resourceGroup \
  --translated-address $aciPrivateIp \
  --translated-port 80 \
  --priority 200

必要に応じて NAT 規則を追加して、サブネット内の他の IP アドレスへのトラフィックをフィルター処理します。 たとえば、サブネット内の他のコンテナー グループが受信トラフィック用の IP アドレスを公開したり、再起動後に他の内部 IP アドレスをコンテナー グループに割り当てたりすることができます。

ファイアウォールで送信アプリケーション規則を作成する

次の az network firewall application-rule create コマンドを実行して、ファイアウォールにアウトバウンド規則を作成します。 このサンプル規則により、Azure Container Instances に委任されたサブネットから FQDN checkip.dyndns.org へのアクセスが許可されます。 このサイトへの HTTP アクセスは、Azure Container Instances からのエグレス IP アドレスを確認するために後の手順で使用されます。

az network firewall application-rule create \
  --collection-name myAppCollection \
  --firewall-name myFirewall \
  --name Allow-CheckIP \
  --protocols Http=80 Https=443 \
  --resource-group $resourceGroup \
  --target-fqdns checkip.dyndns.org \
  --source-addresses 10.0.0.0/24 \
  --priority 200 \
  --action Allow

ファイアウォール経由のコンテナー グループ アクセスをテストする

次のセクションでは、Azure Container Instances に委任されたサブネットが Azure ファイアウォールの内側で適切に構成されていることを確認します。 前の手順では、サブネットへの受信トラフィックと、サブネットからの送信トラフィックの両方をファイアウォール経由でルーティングしました。

コンテナー グループへのイングレスをテストする

ファイアウォールのパブリック IP アドレスを参照して、仮想ネットワークで実行されている appcontainer への受信アクセスをテストします。 前に、パブリック IP アドレスを変数 $FW_PUBLIC_IP に格納しました。

echo $fwPublicIp

出力は次のようになります。

52.142.18.133

ファイアウォールの NAT 規則が適切に構成されている場合は、ブラウザーにファイアウォールのパブリック IP アドレスを入力すると、次のような内容が表示されます。

Browse to firewall's public IP address

コンテナー グループからのエグレスをテストする

次のサンプル コンテナーを仮想ネットワークにデプロイします。 実行されると、1 つの HTTP 要求が http://checkip.dyndns.org に送信され、送信元の IP アドレス (エグレス IP アドレス) が表示されます。 ファイアウォールのアプリケーション規則が適切に構成されている場合は、ファイアウォールのパブリック IP アドレスが返されます。

az container create \
  --resource-group $resourceGroup \
  --name testegress \
  --image mcr.microsoft.com/azuredocs/aci-tutorial-sidecar \
  --command-line "curl -s http://checkip.dyndns.org" \
  --restart-policy OnFailure \
  --vnet aci-vnet \
  --subnet aci-subnet

コンテナーのログを表示して、IP アドレスがファイアウォールのパブリック IP アドレスと同じであることを確認します。

az container logs \
  --resource-group $resourceGroup \
  --name testegress 

出力は次のようになります。

<html><head><title>Current IP Check</title></head><body>Current IP Address: 52.142.18.133</body></html>

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

必要がなくなったら、次のように az group delete を使用して、リソース グループとすべての関連リソースを削除できます。 --no-wait パラメーターは、操作の完了を待たずにプロンプトに制御を戻します。 --yes パラメーターは、追加のプロンプトを表示せずにリソースの削除を確定します。

az group delete --name $resourceGroup --yes --no-wait

次のステップ

この記事では、Azure ファイアウォールの内側の仮想ネットワークにコンテナー グループを設定しました。 ファイアウォールにユーザー定義ルートと NAT およびアプリケーション規則を構成しました。 この構成を使用して、Azure Container Instances からのイングレスおよびエグレス用に 1 つの静的 IP アドレスを設定しました。

トラフィックの管理と Azure リソースの保護の詳細については、Azure Firewall のドキュメントを参照してください。