コンテナー グループからの送信トラフィックのための静的 IP アドレスの NAT Gateway を構成する

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

この記事では、ネットワーク アドレス変換 (NAT) ゲートウェイ と統合された仮想ネットワークでコンテナー グループを構成する手順を説明します。 Azure Container Instances (ACI) に委任されたサブネット アドレス範囲に SNAT を実行する NAT ゲートウェイを構成することで、コンテナー グループからの送信トラフィックを特定できます。 コンテナー グループのエグレス トラフィックでは、NAT ゲートウェイのパブリック IP アドレスが使用されます。 1 つの NAT ゲートウェイを、ACI に委任された仮想ネットワークのサブネットにデプロイされた複数のコンテナー グループで使用できます。

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

  • 仮想ネットワーク内の委任されたサブネットにデプロイされたコンテナー グループ
  • 静的パブリック IP アドレスを持つネットワークにデプロイされた NAT ゲートウェイ

次に、サンプル コンテナー グループからの NAT ゲートウェイ経由のエグレスを検証します。

注意

ACI サービスでは、静的エグレスを行うが、静的イングレス要件のない、コンテナー化されたワークロードのために、NAT ゲートウェイとの統合が推奨されます。 静的イングレスおよびエグレスの両方をサポートする ACI アーキテクチャについては、イングレスとエグレスに Azure Firewall を使用するチュートリアルを参照してください。

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 で使用するために予約されています。詳細については、こちらを参照してください。

パブリック IP アドレスの作成

以降のセクションでは、Azure CLI を使用して、Azure NAT ゲートウェイを仮想ネットワークにデプロイします。 背景については、「クイックスタート: Azure CLI を使用して NAT ゲートウェイを作成する」を参照してください。

まず、az network vnet public-ip create を使用して、NAT ゲートウェイのパブリック IP アドレスを作成します。 これは、インターネットへのアクセスに使用されます。 Standard SKU IP アドレスが既定で可用性ゾーン対応となるという、今後の重大な変更に関する警告が表示されます。 可用性ゾーンとパブリック IP アドレスの使用の詳細については、こちらを参照してください。

az network public-ip create \
  --name myPublicIP \
  --resource-group $resourceGroup \
  --sku standard \
  --zone 1 \
  --allocation static

このスクリプトの後半の検証ステップで使用するために、変数にパブリック IP アドレスを格納します。

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

仮想ネットワーク内に NAT ゲートウェイをデプロイする

次の az network nat gateway create を使用して、前の手順で作成したパブリック IP を使用する NAT ゲートウェイを作成します。

az network nat gateway create \
  --resource-group $resourceGroup \
  --name myNATgateway \
  --public-ip-addresses myPublicIP \
  --idle-timeout 10

送信元サブネット用の NAT サービスの構成

az network vnet subnet update を使用して、特定の NAT ゲートウェイ リソース myNATgateway を使用するように送信元サブネット aci-subnet を構成します。 このコマンドにより、指定したサブネット上で NAT サービスがアクティブになります。

az network vnet subnet update \
    --resource-group $resourceGroup  \
    --vnet-name aci-vnet \
    --name aci-subnet \
    --nat-gateway myNATgateway

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

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

次のサンプル コンテナーを仮想ネットワークにデプロイします。 実行されると、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>

この IP アドレスは、チュートリアルの最初の手順で作成したパブリック IP アドレスと一致している必要があります。

echo $ngPublicIp

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

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

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

次のステップ

この記事では、Azure NAT ゲートウェイの内側の仮想ネットワークにコンテナー グループを設定しました。 この構成を使用して、Azure Container Instances コンテナー グループからの 1 つの静的 IP アドレス エグレスを設定しました。

トラブルシューティングのサポートについては、Azure Virtual Network NAT 接続のトラブルシューティングに関するページを参照してください。