Azure Container Apps でアプリやマイクロサービスをホストする場合、それらをインターネットに直接発行するとは限りません。 代わりに、リバースプロキシを介して公開することもできます。
リバース プロキシは、1 つ以上のサービスの前に配置され、受信トラフィックをインターセプトして適切な宛先に転送するサービスです。
リバース プロキシを使用すると、次のようなクロスカット機能をサポートするサービスをアプリの前に配置できます。
- ルーティング
- キャッシュ
- レート制限
- 負荷分散
- セキュリティ層
- 要求のフィルター処理
この記事では、内部 Container Apps 環境で Azure Application Gateway 上の Web アプリケーション ファイアウォール (WAF) を使用してコンテナー アプリを保護する方法について説明します。
Container Apps でのネットワークの概念の詳細については、「Azure Container Apps のネットワーク環境」を参照してください。
前提条件
仮想ネットワークを使用する内部環境: 内部環境にあり、仮想ネットワークと統合されたコンテナー アプリを作成します。 仮想ネットワーク統合アプリを作成する方法の詳細については、「 内部 Azure Container Apps 環境に仮想ネットワークを提供する」を参照してください。
セキュリティ証明書 : アプリケーション ゲートウェイに TLS/SSL 暗号化を使用する必要がある場合は、アプリケーション ゲートウェイにバインドするために使用される有効な公開証明書が必要です。
コンテナー アプリのドメインを取得する
次の手順を使用して、 既定のドメイン の値と、プライベート DNS ゾーンを設定するための 静的 IP を取得します。
ポータルのリソース グループの [概要] ウィンドウで、コンテナー アプリを選択します。
コンテナー アプリ リソースの [概要] ウィンドウで、Container Apps Environment のリンクを選択します。
コンテナー アプリ環境リソースの [概要] ウィンドウで、ページの右上隅にある [JSON ビュー] を選択して、コンテナー アプリ環境の JSON 表現を表示します。
defaultDomain と staticIp プロパティの値をコピーし、テキスト エディターに貼り付けます。 次のセクションでは、既定のドメインに対してこれらの値を使用してプライベート DNS ゾーンを作成します。
Azure プライベート DNS ゾーンを作成して構成します。
Azure プライベート DNS ゾーンを作成および構成するには、次の手順を実行します。
Azure ポータルにアクセスします。
検索バーに「 Private DNS Zone」と入力します。
検索結果から [プライベート DNS ゾーン ] を選択します。
[作成] ボタンを選択します。
次の値を入力します。
設定 アクション サブスクリプション Azure サブスクリプションを選択します。 リソースグループ コンテナー アプリのリソース グループを選択します。 名前 前のセクションから Container Apps Environment の defaultDomain プロパティを入力します。 リソース グループの場所 既定値のままにします。 プライベート DNS ゾーンはグローバルであり、値は必要ありません。 [Review + create]\(レビュー + 作成\) を選択します。 検証が終了したら、[作成] を選択します。
非公開 DNS ゾーンが作成されたら、 [リソースに移動] を選択します。
[概要] ウィンドウで、[+レコード セット] 選択して、新しいレコード セットを追加します。
[レコードセットの追加] ウィンドウに次の値を入力します。
設定 アクション 名前 「*」と入力します。 タイプ [A - アドレス レコード] を選択します。 TTL 既定値のままにします。 TTL の単位 既定値のままにします。 IP アドレス 前のセクションの Container Apps Environment の staticIp プロパティを入力します。 [OK] を選択して レコード セットを作成します。
もう一度 [+レコード セット] を選択して、2 つ目のレコード セットを追加します。
[レコードセットの追加] ウィンドウに次の値を入力します。
設定 アクション 名前 「@」と入力します。 タイプ [A - アドレス レコード] を選択します。 TTL 既定値のままにします。 TTL の単位 既定値のままにします。 IP アドレス 前のセクションの Container Apps Environment の staticIp プロパティを入力します。 [OK] を選択して レコード セットを作成します。
ページの左側にあるメニューから、 [仮想ネットワーク リンク] ウィンドウを選択します。
[+ 追加] を選択して、次の値を持つ新しいリンクを作成します。
設定 アクション リンク名 「my-vnet-pdns-link」と入力します。 仮想ネットワークのリソース ID を知っている オフのままにしておいてください。 仮想ネットワーク コンテナー アプリが統合されている仮想ネットワークを選択します。 自動登録を有効にする オフのままにしておいてください。 [OK] を選択して、仮想ネットワークのリンクを作成します。
Azure Application Gateway の作成と構成
Azure Application Gateway を作成して構成するには、次の手順を実行します。
Azure ポータルにアクセスします。
検索バーに「 Application Gateway」と入力します。
検索結果から [Application Gateway ] を選択します。
次に、[ 基本 ]タブ、[ フロントエンド ]タブ、[ バックエンド ]タブ、[ 構成 ]タブに必要な詳細を入力します。
[基本] タブ
次の手順を実行します。
[プロジェクトの詳細] セクションで、次の値を入力します。
設定 アクション サブスクリプション Azure サブスクリプションを選択します。 リソースグループ コンテナー アプリ用のリソース グループを選択します。 アプリケーション ゲートウェイ名 「my-container-apps-agw」と入力します。 リージョン コンテナー アプリがプロビジョニングされた場所を選択します。 レベル [WAF V2] を選択します。 WAF が必要ない場合 Standard V2 を使用できます。 自動スケールの有効化 既定値のままにします。 運用環境では、自動スケーリングをお勧めします。 Azure Application Gateway の自動スケーリングを参照する 可用性ゾーン [なし] を選択します。 運用環境では、可用性を高める Availability Zones をお勧めします。 HTTP2 既定値のままにします。 WAF ポリシー [新規作成] を選択し、WAF ポリシーに 「my-waf-policy」 と入力します。 [OK]を選択します。 Standard V2 の階層を選択した場合は、この手順をスキップします。 仮想ネットワーク コンテナー アプリが統合されている仮想ネットワークを選択します。 サブネット [サブネット構成の管理] を選択します。 使用するサブネットが既にある場合は、代わりに使用し、frontends セクション にスキップします。 my-vnet の [サブネット] ウィンドウで 、[+サブネット] を選択し、次の値を入力します。
設定 アクション 名前 「appgateway-subnet」と入力します。 サブネットのアドレス範囲 既定値のままにします。 残りの設定は既定値のままにします。
[保存] を選んで新しいサブネットを作成します。
[サブネット] ウィンドウを閉じて、 [アプリケーション ゲートウェイの作成] ウィンドウに戻ります。
次の値を選択します。
設定 アクション サブネット 作成した [appgateway-subnet] を選択します。 [次へ: フロントエンド] を選んで続行します。
[フロントエンド] タブ
次の手順を実行します。
[フロントエンド] タブで、以下の値を入力します。
設定 アクション フロントエンド IP アドレスの種類 [パブリック] を選択します。 パブリック IP アドレス [新規追加] を選択します。 フロントエンドの名前として「my-frontend 」と入力し、[OK] を選択します 注
Application Gateway v2 SKU の場合、パブリック フロントエンド IP が必要です。 詳細については、「 パブリック IP アドレスとプライベート IP アドレスのサポート 」および「 Azure Application Gateway を使用したパブリック IP アドレスの管理」を参照してください。
[次へ: バックエンド] を選択します。
[バックエンド] タブ
バックエンド プールは、適切なバックエンド サーバーに要求をルーティングするために使用されます。 バックエンド プールは、次のリソースの任意の組み合わせで構成できます。
- NIC
- パブリック IP アドレス
- 内部 IP アドレス
- Virtual Machine Scale Sets
- 完全修飾ドメイン名 (FQDN)
- Azure App Service や Container Apps などのマルチテナント バックエンド
この例では、コンテナー アプリを対象とするバックエンド プールを作成します。
バックエンド・プールを作成するには、次の手順を実行します。
バックエンド プールの追加 を選択します。
新しいタブを開き、コンテナー アプリに移動します。
コンテナー アプリの [概要] ウィンドウで、 アプリケーション URL を見つけてコピーします。
[バックエンド] タブに戻り、[バックエンド プールの追加] ウィンドウに次の値を入力します。
設定 アクション 名前 「my-agw-backend-pool 」と入力します。 ターゲットを持たないバックエンド プールを追加します このため、 [いいえ]を選択します。 [対象になる種類] [IP アドレスまたは FQDN] を選択します。 移行先 コピーした「Container App Application Url 」を貼り付け、 https:// プレフィックスを削除します。 この場所は、コンテナー アプリの FQDN です。 [追加]を選択します。
[バックエンド] タブで、[次へ: 構成] を選択します。
[構成] タブ
[構成] タブで、ルーティング規則を使用して作成したフロントエンドとバックエンド プールを接続します。
フロントエンドとバックエンドプールを接続するには、次の手順を実行します。
[+ ルーティング規則の追加] を選択します。 次の値を入力します。
設定 アクション 名前 「my-agw-routing-rule」と入力します。 Priority 1 を入力します。 [リスナー] タブで、以下の値を入力します。
設定 アクション リスナー名 「my-agw-listener」 と入力します。 フロントエンド IP [パブリック] を選択します。 プロトコル [HTTPS] を選択します。 使用する証明書がない場合は、[HTTP] を選択できます。 港 / ポート 「443」を入力します。 プロトコルに [HTTP] を選択した場合は、「 80 」と入力し、「default/custom ___domain」セクションに進みます。 証明書の選択 [証明書をアップロードする] を選びます。 証明書がキー コンテナーに格納されている場合は、[Key Vault から証明書を選ぶ] を選択できます。 証明書の名前 証明書の名前を入力します。 PFX 証明書ファイル 有効なパブリック証明書を選択します。 パスワード 証明書のパスワードを入力します。 既定のドメインを使用する場合は、次の値を入力します。
設定 アクション リスナーの種類 [Basic] を選択します エラー ページの URL なし のままにします。 または、カスタム ドメインを使用する場合は、次の値を入力します。
設定 アクション リスナーの種類 [マルチ サイト] を選択します。 ホストタイプ [シングル] を選択します。 ホスト名 使用するカスタム ドメイン名を入力します。 エラー ページの URL なし のままにします。 [バックエンド ターゲット] タブを選択し、次の値を入力します。
[バックエンド ターゲット] タブに切り替え、次の値を入力します。
設定 アクション [対象になる種類] 前に作成した [my-agw-backend-pool] を選択します。 バックエンドの設定 [新規追加] を選択します。 [バックエンド設定の追加] ウィンドウに次の値を入力します。
設定 アクション バックエンド設定名 「my-agw-backend-setting」と入力します。 バックエンド プロトコル [HTTPS] を選択します。 バックエンド ポート 「443」を入力します。 既知の CA 証明書を使用する [はい] を選択します。 新しいホスト名でオーバーライドする [はい] を選択します。 [ホスト名の上書き] [バックエンド ターゲットからホスト名を選択する] を選択します。 カスタム プローブを作成する このため、 [いいえ]を選択します。 [ 要求ヘッダーの書き換え] で、次を構成します。
- 要求ヘッダーの書き換えを有効にする: [はい] を選択します。
- 要求ヘッダーを追加します。
- ヘッダー名:
X-Forwarded-Host - 値:
{var_host}
- ヘッダー名:
このアクションにより、クライアント要求からの元の
Hostヘッダーが保持され、バックエンド アプリケーションからアクセス可能になります。[追加] を選択して、バックエンド設定を追加します。
[ルーティング規則の追加] ウィンドウで、もう一度、[追加] を選択します。
[次へ: タグ] を選択します。
[次へ: 確認および作成] を選択してから、[作成] を選択します。
お使いの Application Gateway の プライベート リンク
プライベート リンクを使用して、内部専用のコンテナー アプリ環境へのセキュリティで保護された接続を確立できます。 Private Link を使用すると、Application Gateway は仮想ネットワークを介してバックエンド上の Container App と通信できます。
Application Gateway が作成されたら、[リソースに移動] を選択します。
左側のメニューから、[プライベート リンク] を選択し、[追加] を選択します。
次の値を入力します。
設定 アクション 名前 「my-agw-private-link」と入力します。 プライベート リンク サブネット プライベート リンクを作成するサブネットを選択します。 フロントエンド IP 構成 Application Gateway のフロントエンド IP を選択します。 [ プライベート IP アドレスの設定] で、[ 追加] を選択します。
ページの下部にある [追加] を選択します。
リダイレクトと SSO のために元のホスト ヘッダーを保持する
Azure Application Gateway がリバース プロキシとして構成されていて、[ 新しいホスト名でオーバーライド] 設定が有効になっている場合、 Host ヘッダーが変更されます。 ヘッダーを変更すると、元のホスト値に依存してリダイレクト URL、絶対リンク、または OpenID Connect (OIDC) 認証フローをサポートするアプリケーションに干渉する可能性があります。
元のホスト ヘッダーを転送するには、Application Gateway の要求ヘッダー書き換え機能を使用して、 X-Forwarded-Host ヘッダーに挿入します。
X-Forwarded-Host インジェクションを構成する
X-Forwarded-Hostインジェクションを有効にするには:
[ 構成 ] タブで、Application Gateway ルーティング規則の [バックエンド設定 ] セクションを選択します。
- 要求ヘッダーの書き換えを有効にします。
- 次の値を持つ新しい要求ヘッダーを追加します。
- ヘッダー名:
X-Forwarded-Host - 値:
{host}
- ヘッダー名:
バックエンド アプリで、
X-Forwarded-Hostヘッダーを使用して元の要求ホストを読み取れるようになりました。
コンテナー アプリを検証する
[概要] ページで、アプリケーション ゲートウェイのパブリック IP アドレスを見つけるか、アドレスを検索できます。 検索するには、[すべてのリソース] を選択し、検索ボックスに「my-container-apps-agw-pip」と入力します。 次に、検索結果でその IP を選択します。
アプリケーション ゲートウェイのパブリック IP アドレスに移動します。
要求はコンテナー アプリに自動的にルーティングされ、アプリケーション ゲートウェイが正常に作成されたことを確認します。
リソースをクリーンアップする
作成したリソースが不要になったら、リソース グループを削除してください。 リソース グループを削除すると、そのすべての関連リソースも削除されます。
リソース グループを削除するには:
Azure portal メニューで [リソース グループ] を選択するか、または [リソース グループ] を検索して選択します。
リソース グループ ページで、[my-container-apps] を検索して選択します。
[リソース グループ] ページで、[リソース グループの削除] を選択します。
[リソース グループ名を入力してください] に「my-container-apps」と入力し、[削除] を選択します。