次の方法で共有


Azure API Management セルフホステッド ゲートウェイを Azure Container Apps にデプロイする

適用対象: Developer | Premium

この記事では、Azure API Management の セルフホステッド ゲートウェイ コンポーネントを Azure Container Apps にデプロイする手順について説明します。

セルフホステッド ゲートウェイをコンテナー アプリにデプロイして、同じ Azure Container Apps 環境でホストされている API にアクセスします。

[前提条件]

  • 次のクイック スタートを完了します。 Azure API Management インスタンスを作成します

  • Azure CLI の場合

    • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の概要」を参照してください。

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

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

      • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、「Azure CLI で拡張機能を使用および管理する」を参照してください。

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

    この記事の Azure CLI コマンドの例では、 containerapp Azure CLI 拡張機能が必要です。 az containerappコマンドを使用していない場合は、最初の az containerapp コマンドを実行すると、拡張機能が動的にインストールされます。 Azure CLI 拡張機能の詳細については、こちらを参照してください。

Azure API Management インスタンスでゲートウェイをプロビジョニングする

セルフホステッド ゲートウェイをデプロイする前に、Azure API Management インスタンスにゲートウェイ リソースをプロビジョニングします。 手順については、 セルフホステッド ゲートウェイのプロビジョニングに関するページを参照してください。 この記事の例では、ゲートウェイには my-gateway という名前が付けられています。

API Management からゲートウェイデプロイ設定を取得する

ゲートウェイをデプロイするには、ゲートウェイの トークン構成エンドポイント の値が必要です。 Azure portal で見つけることができます。

  1. Azure portal にサインインし、Azure API Management インスタンスに移動します。
  2. 左側のメニューの [ デプロイとインフラストラクチャ] で、[ セルフホステッド ゲートウェイ] を選択します。
  3. プロビジョニングしたゲートウェイ リソースを選択し、 設定>展開を選択します。
  4. トークン構成エンドポイントの値をコピーします。

コンテナー アプリにセルフホステッド ゲートウェイをデプロイする

Azure portalAzure CLI、またはその他のツールを使用して、セルフホステッド ゲートウェイ コンテナー イメージをコンテナー アプリにデプロイできます。 この記事では、Azure CLI を使用する手順について説明します。

コンテナー アプリ環境を作成する

まず、 az containerapp env create コマンドを使用してコンテナー アプリ環境を作成します。

#!/bin/bash
az containerapp env create --name my-environment --resource-group myResourceGroup \
    --location centralus

このコマンドを実行すると、次のものが作成されます。

  • コンテナー アプリのグループ化に使用する my-environment という名前のコンテナー アプリ環境。
  • ログ分析ワークスペース

セルフホステッド ゲートウェイ用のコンテナー アプリを作成する

環境内のコンテナー アプリにセルフホステッド ゲートウェイをデプロイするには、 az containerapp create コマンドを実行します。

最初に、Azure API Management ゲートウェイ リソースから トークン構成エンドポイント の値の変数を設定します。

#!/bin/bash
endpoint="<API Management configuration endpoint>"
token="<API Management gateway token>"

az containerapp create コマンドを使用してコンテナー アプリを作成します。

#!/bin/bash
az containerapp create --name my-gateway \
    --resource-group myResourceGroup --environment 'my-environment' \
    --image "mcr.microsoft.com/azure-api-management/gateway:2.9.2" \
    --target-port 8080 --ingress external \
    --min-replicas 1 --max-replicas 3 \
    --env-vars "config.service.endpoint"="$endpoint" "config.service.auth"="$token" "net.server.http.forwarded.proto.enabled"="true"

このコマンドを実行すると、次のものが作成されます。

  • my-gateway リソース グループ内のmyResourceGroupという名前のコンテナー アプリ。 この例では、コンテナー アプリは mcr.microsoft.com/azure-api-management/gateway:2.9.2 イメージを使用します。 セルフホステッド ゲートウェイの詳細については、 コンテナー イメージを参照してください。

  • ポート 8080 でのコンテナー アプリへの外部イングレスのサポート。

  • コンテナー アプリのレプリカは、少なくとも 1 個と最大 3 個です。

  • 環境変数で構成値を渡すことによる、セルフホステッド ゲートウェイから Azure API Management インスタンスへの接続。 詳細については、セルフホステッド ゲートウェイ コンテナーの構成設定を参照してください。

    Azure Container Apps イングレスは、HTTPS 要求を HTTP としてセルフホステッド ゲートウェイ コンテナー アプリに転送します。 ここでは、 net.server.http.forwarded.proto.enabled 環境変数を true に設定して、セルフホステッド ゲートウェイが X-Forwarded-Proto ヘッダーを使用して要求の元のプロトコルを決定するようにします。

コンテナー アプリが実行されていることを確認する

  1. Azure portal にサインインし、コンテナー アプリに移動します。

  2. コンテナー アプリの [概要] ページで、[状態] が [実行中] であることを確認します。

  3. /status-012345678990abcdefの状態エンドポイントにテスト要求を送信します。 たとえば、次のコマンドのような curl コマンドを使用します。

    curl -i https://my-gateway.happyvalley-abcd1234.centralus.azurecontainerapps.io/status-012345678990abcdef
    

    要求が成功すると、 200 OK 応答が返されます。

ヒント

CLI を使用して、 az containerapp show コマンドを実行して、コンテナー アプリの状態を確認することもできます。

ゲートウェイが正常であることを確認する

  1. Azure portal にサインインし、Azure API Management インスタンスに移動します。

  2. 左側のメニューの [ デプロイとインフラストラクチャ] で、[ セルフホステッド ゲートウェイ] を選択します。

  3. [ 概要 ] ページで、ゲートウェイの状態を確認 します。 ゲートウェイが正常な場合は、通常のゲートウェイ ハートビートが報告されます。

    ポータルのゲートウェイの状態のスクリーンショット。

サンプル シナリオ

次の例は、セルフホステッド ゲートウェイを使用して、同じ環境のコンテナー アプリでホストされている API にアクセスする方法を示しています。 次の図に示すように、セルフホステッド ゲートウェイにはインターネットからアクセスできますが、API にはコンテナー アプリ環境内でのみアクセスできます。

セルフホステッド ゲートウェイを使用したシナリオ例の図。

  1. セルフホステッド ゲートウェイと同じ環境で API をホストするコンテナー アプリをデプロイします。
  2. AZURE API Management インスタンスに API を追加します。
  3. セルフホステッド ゲートウェイを介して API を呼び出します。

セルフホステッド ゲートウェイと同じ環境で API をホストするコンテナー アプリをデプロイする

この例では、音楽アルバム API の例をコンテナー アプリにデプロイします。 セルフホステッド ゲートウェイを使用して後で API にアクセスするには、セルフホステッド ゲートウェイと同じ環境に API をデプロイします。 この例で使用されるリソースの詳細な手順と情報については、「 クイック スタート: ローカル ソース コードから Azure Container Apps へのビルドとデプロイ」を参照してください。 省略された手順は次のとおりです。

  1. Python ソース コードをローカル コンピューターにダウンロードします。 必要に応じて、任意の別の言語でソース コードをダウンロードします。

  2. ソース コードをローカル フォルダーに抽出し、 containerapps-albumapi-python-main/src フォルダーに変更します。

  3. 次の az containerapp up コマンドを実行して、セルフホステッド ゲートウェイと同じ環境のコンテナー アプリに API をデプロイします。 現在のフォルダーをコンテナー アプリのソースとして指定するコマンドの末尾にある . に注意してください。

    #!/bin/bash
    az containerapp up --name albums-api \
        --resource-group myResourceGroup --location centralus \
        --environment my-environment --source .
    
  4. コマンド出力で返された FQDN でコンテナー アプリが実行されていて、外部からアクセス可能であることを確認します。 既定では、 エンドポイントで API にアクセスできます。 例: https://albums-api.happyvalley-abcd1234.centralus.azurecontainerapps.io/albums/albums

内部イングレス用に API を構成する

次に、サンプル API をホストするコンテナー アプリを更新して、コンテナー環境でのみイングレスを有効にします。 この設定では、デプロイしたセルフホステッド ゲートウェイからのみ API へのアクセスが制限されます。

  1. Azure portal にサインインし、コンテナー アプリに移動します。
  2. 左側のメニューで、[ ネットワーク>Ingress] を選択します。
  3. [イングレス][有効] に設定します。
  4. イングレス トラフィックで、[コンテナアプリ環境に制限] を選択します。
  5. 残りの設定を確認し、[ 保存] を選択します。

Azure API Management インスタンスに API を追加する

次の手順では、Azure API Management インスタンスに API を追加し、API バックエンドを構成する方法を示します。 詳細については、「 Azure API Management への API の追加」を参照してください。

API Management インスタンスに API を追加する

  1. Azure portal で、セルフホステッド ゲートウェイを構成した API Management インスタンスに移動します。
  2. 左側のメニューで、>>追加を選択します。
  3. [ HTTP ] を選択し、[ 完全] を選択します。 次の設定を入力します。
    1. 表示名: わかりやすい名前を入力します。 例: Albums API
    2. Web サービス URL: API をホストするコンテナー アプリの 内部 FQDN を入力します。 例: http://albums-api.internal.happyvalley-abcd1234.centralus.azurecontainerapps.io
    3. URL スキーム: HTTP(S) を選択します。
    4. API URL サフィックス: 任意のサフィックスを入力します。 例: albumapi
    5. ゲートウェイ: プロビジョニングしたセルフホステッド ゲートウェイを選択します。 例: my-gateway
  4. シナリオに応じて他の API 設定を構成します。 を選択してを作成します。

API 操作を追加する

  1. 左側のメニューで、 API>Albums API を選択します。
  2. [+ 操作の追加] を選択します。
  3. 操作の設定を入力します。
    1. 表示名: 操作のわかりやすい名前を入力します。 例: アルバムを取得します
    2. URL: [ 取得] を選択し、エンドポイントの /albums を入力します。
    3. 保存 を選択します。

セルフホステッド ゲートウェイを介して API を呼び出す

コンテナー アプリで実行されているセルフホステッド ゲートウェイの FQDN を使用して API を呼び出します。 Azure portal のコンテナー アプリの [概要 ] ページで FQDN を見つけるか、次の az containerapp show コマンドを実行します。

#!/bin/bash
az containerapp show --name my-gateway --resource-group myResourceGroup \
    --query "properties.configuration.ingress.fqdn" --output tsv

たとえば、次の curl コマンドを実行して、 /albumapi/albums エンドポイントで API を呼び出します。 API にサブスクリプション キーが必要な場合は、API Management インスタンスの有効なサブスクリプション キーを要求のヘッダーとして渡します。

curl -i https://my-gateway.happyvalley-abcd1234.centralus.azurecontainerapps.io/albumapi/albums -H "Ocp-Apim-Subscription-Key: <subscription-key>"

テストが成功すると、バックエンドは成功した HTTP 応答コードと一部のデータで応答します。

HTTP/1.1 200 OK
content-length: 751
content-type: application/json
date: Wed, 28 Feb 2024 22:45:09 GMT
[...]

[{"id":1,"title":"You, Me and an App Id","artist":"Daprize","price":10.99,"image_url":"https://aka.ms/albums-daprlogo"},{"id":2,"title":"Seven Revision Army","artist":"The Blue-Green Stripes","price":13.99,"image_url":"https://aka.ms/albums-containerappslogo"},{"id":3,"title":"Scale It Up","artist":"KEDA Club","price":13.99,"image_url":"https://aka.ms/albums-kedalogo"},{"id":4,"title":"Lost in Translation","artist":"MegaDNS","price":12.99,"image_url":"https://aka.ms/albums-envoylogo"},{"id":5,"title":"Lock Down Your Love","artist":"V is for VNET","price":12.99,"image_url":"https://aka.ms/albums-vnetlogo"},{"id":6,"title":"Sweet Container O' Mine","artist":"Guns N Probeses","price":14.99,"image_url":"https://aka.ms/albums-containerappslogo"}]

ヒント

API から Application Insights へのログ記録を有効にした場合は、ログに対してクエリを実行して要求と応答を確認できます。

制限事項

セルフホステッド ゲートウェイ インスタンスは、 ハートビートとレート制限の通信に UDP プロトコルに依存します。 Azure Container Apps では現在、イングレスでも内部トラフィックでも UDP プロトコルはサポートされていないため、 rate-limit ポリシーはインスタンス間でそのカウンターを同期できません。 そのため、制限 X でセルフホステッド ゲートウェイ コンテナー アプリの 3 つのレプリカを維持すると、制限 X に達するまでトラフィックが 3 倍になる可能性があります。

Azure Container Apps は、使用可能で正常な各レプリカに要求を線形に分散します。 レート制限を実装するには、必要な制限を実行するレプリカの数で除算し、構成で結果の値を設定します。 この方法には独自の欠点があります。コンテナー アプリがスケーリングされた場合、調整されたカウンターを考慮できない可能性があるためです。