※Azure Container Apps はこの投稿時点ではパブリック プレビューでの提供のため、一般提供 (GA) のタイミングで手順や挙動が変更になる場合があります。
Microsoft Ignite 2021 で発表された Microsoft Azure の新しいサービス「Azure Container Apps (ACA)」について、仮想ネットワーク (VNet) 統合のサポートが追加された旨のアナウンスがありました。
Azure Container Apps に VNet 統合のサポートが追加されたことで、外部に公開することなく VNet 経由でのみアクセスさせることも可能となります。
Azure Container Apps に VNet 統合を追加するには、 Microsoft Docs に Azure ポータル もしくは Azure CLI から実施することが可能な風に記載がありますが、設定にあたり少しハマった部分もあったので、以下に纏めました。
Azure Container Apps の VNet 統合について
Azure Container Apps でデプロイされたアプリケーションを直接パブリック インターネットからアクセスできないように、VNet 上にデプロイ、ネットワーク分離を行うというものになります。
実際には Azure Container Apps はコンテナー アプリ環境上にデプロイ、動作しますが、ネットワーク分離を行うにはこのコンテナー アプリ環境に対して VNet 統合を行う形となります。
VNet 統合できる構成としては、以下となります。
※実際にアクセスする場合は、IP アドレスではなく、FQDN を指定します。
- Internal (内部)
- プライベート IP アドレスなエンドポイントを介してアプリケーションにアクセス
- External (外部)
- パブリック IP アドレスなエンドポイントを介してアプリケーションにアクセス
図として表現すると、ざっくりとではありますが以下となります。
App Service Environment (ASE) や Azure Kubernetes Service (AKS) の VNet 統合をイメージしてもらえれば分かりやすいかも。
※コンテナー アプリ環境を含む Azure Container Apps のベースは AKS
前提について
Azure Container Apps の VNet 統合環境の作成にあたり、前提条件は以下となります。
- 既存のコンテナー アプリ環境を用いて VNet 統合の追加は不可
- 新規作成のみ
- VNet 統合で使用する VNet のアドレス空間は、以下のアドレス範囲と重複しないこと
- 169.254.0.0/16
- 172.30.0.0/16
- 172.31.0.0/16
- 192.0.2.0/24
- VNet 統合で使用する VNet 内に 2つの空のサブネット (/12 ~ /21 の範囲) を作成しておく必要がある
- コントロール プレーン用サブネット : コントロール プレーン インフラストラクチャとアプリケーション コンテナーで利用される
- アプリケーション用サブネット : デプロイされるアプリケーション コンテナーで利用される
- Internal (内部) 向け VNet 統合で使用する VNet について、既定の「すべて許可」構成を用いる必要がある
※ネットワーク セキュリティ グループは設定しないようにする- 「すべて拒否する」構成については、VNet 内に流れるトラフィックの依存関係が明確になっていないため
環境作成手順
Azure CLI による作成については、ドキュメントでは作成できない (エラーになる) 個所があったため (理由は後述)、ここでは Azure ポータル による Internal (内部) 向け Azure Container Apps の VNet 統合環境作成手順をまとめています。
Azure Container Apps と VNet 統合されたコンテナー アプリ環境の作成
- Azure Marketplace から「コンテナー アプリ」を検索し、[作成] をクリックします。
- [コンテナー アプリの作成画面] 内にある [基本] タブにて [サブスクリプション]、[リソース グループ] を指定し、[コンテナー アプリ名] を入力した後で、[コンテナー アプリ環境] にある [新規作成] をクリックします。
※必要に応じて [リソース グループ] を新規作成する。
- [コンテナー アプリ環境の作成] 画面内の [基本] タブにて [環境名] を入力、[地域] にてデプロイするリージョンを選択します。
なお、投稿時点ではデプロイ可能なリージョンは以下となります。- East US
- North Europe
- Canada Central
- East US 2
- West Europe
- [監視] タブを選択肢、Log Analytics ワークスペースを指定、もしくは新規作成します。
- [ネットワーク] タブを選択肢、[自分の仮想ネットワークを使用する] で「はい」を選択します。
選択後に表示される [仮想ネットワーク]、[Control plane subnet] および [Apps subnet] を指定、ないし [新規作成] をクリックして、作成します。
その後、ここでは [仮想 IP] に対して「Internal: The endpoint is an internal load balancer」を選択した上で、[Create] をクリックして、コンテナー アプリ環境を作成します。
- ここで VNet を新規作成する場合、アドレス空間が「10.0.0.0/16」固定となってしまうため、予め VNet やサブネットを作成しておいたほうが良いかと思います。
※Azure CNI ネットワークの設定がらみで固定化されている可能性あり
Azure Kubernetes サービス (AKS) で Azure CNI ネットワークを構成する - Azure Kubernetes ServiceAzure Kubernetes Service (AKS) で Azure CNI (高度な) ネットワークを構成する方法について学習します。 - サブネットについても、/21 よりも大きい値でで新規作成、指定する場合、以下のエラーが表示されます。
- ここで VNet を新規作成する場合、アドレス空間が「10.0.0.0/16」固定となってしまうため、予め VNet やサブネットを作成しておいたほうが良いかと思います。
- [コンテナー アプリの作成画面] 内にある [基本] タブに戻るので、[確認と作成] をクリックします。
※[アプリ設定] タブでは Azure Container Apps にデプロイするコンテナー イメージを指定することも可能ですが、手順の確認のため、ここではデフォルトのクイックスタート イメージを指定する形を取っています。
- 内容を確認して問題がないようであれば [作成] をクリックしてデプロイします。
デプロイ後に作成されるリソース グループ「MC_…」について
Azure Container Apps の VNet 統合環境作成とともに、先頭に「MC_」から始まるリソース グループが作成されます。
このリソースグループ内には、ロード バランサーやパブリック IP アドレスといった Azure Container Apps の VNet 統合環境によって管理されるインフラストラクチャ コンポーネントとなるため、変更や削除は行わないようにしてください。
作成したサブネットは本当に使われているのか?
前提条件にも記載したとおり、Azure Container Apps の VNet 統合環境で指定したそれぞれのサブネットともに /12 ~ /21 の範囲である必要がありますが、本当に使用されているかは気になるところです。
VNet の設定を確認してみると、きちんとノード プール (VMSS) として使用されていることが確認できます。
このノード プールは Azure 側で管理されるため、アクセスしようとしても権限がないためエラーとなります (既定の動作)。
Internal (内部) 向けコンテナー アプリ環境を作成する際の Azure CLI でのエラーについて
External (外部) 向けは問題なかったですが、Internal (内部) 向けコンテナー アプリ環境を作成する際、ドキュメントには –internal-only オプションを付与する記載がありますが、付与して実行してみると、そんなオプションは存在しないと言われてエラーとなり、作成することはできませんでした。
※az containerapp のバージョンは 0.2.0
※az containerapp v0.2.2 で修正されていました。
プライベート DNS の作成、設定手順
Internal (内部) 向け Azure Container Apps の VNet 統合環境の作成後、インターネット経由でアプリケーションにアクセスしようとしても、エラーになることが確認できます。
ただし、この状況は VNet 内からのアクセスも同様になりますが、理由としては内部向けの名前解決が行われていないためとなります。
アクセスするようにするには、プライベート DNS を作成、設定する必要があり、手順は以下となります。
- 作成したコンテナー アプリの管理ブレードにある [概要] にある [Json ビュー] をクリックし、「defaultDomain」と「staticIp」 の値を確認しておきます。
- Azure ポータルから [プライベート DNS] を選択し、[+ 作成] をクリックします。
- [プライベート DNS ゾーンの作成] 内にある [基本] タブにて [サブスクリプション]、[リソース グループ] を指定、[名前]については、手順 1. で確認した 「defaultDomain」の値を入力した後で、[確認および作成] をクリックします。
- 内容を確認して問題がないようであれば [作成] をクリックしてデプロイします。
- 作成したプライベート DNS ゾーンの作成後、管理ブレード内にある [設定] – [仮想ネットワーク リンク] を選択、[+ 追加] をクリックします。
- 以下の項目について入力指定し、[OK] をクリックして仮想ネットワーク リンクを作成します。
- リンク名 : 特定の名称で問題ないですが、統合 VNet で使用している VNet 名を入力するのがよいかと思います。
- サブスクリプション : 仮想ネットワーク リンする VNet が作成されているサブスクリプションを指定します (プライベート DNS と同一サブスクリプションになるかと思います)。
- 仮想ネットワーク : 統合 VNet で使用している VNet 名を指定します。
- 自動登録を有効にする : オンにします。
- プライベート DNS の管理ブレードの [概要] から [+ レコード セット] をクリックします。
- 以下の項目を入力、指定し、[OK] をクリック、レコード セットを作成します。
- 名前 : ワイルドカード (*) を入力します。
- 種類 : 「A – IPv4 アドレスへのエイリアス レコード」を指定します。
- TTL : 任意の値で問題ありません。
- IP アドレス : 手順 1. で確認した「staticIp」の値を入力します。
プライベート DNS の作成が完了することで、VNet 経由でアプリケーションにアクセスすることが可能となります。
まとめ
Azure Container Apps の VNet 統合環境を構成することで、アプリケーションを VNet 上にデプロイすることが可能となります。
作成後のコンテナー アプリ環境は設定変更することができないので、構成前にどこからアクセスするかの検討が必要になります。
VNet のアドレス空間やサブネット範囲が大きいので既存のネットワークにどのように組み込むかは悩むところではありますが、VNet (プライベート ネットワーク) 内に集約する必要がある業種やシステムには助かる機能だと思います。