Share via


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 の 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 を実行します。

    Note

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

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

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

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

ゲートウェイをデプロイするには、ゲートウェイの [トークン][構成エンドポイント] の値が必要です。 値は Azure portal にあります。

  1. Azure portal にサインインし、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 コマンドを実行します。

最初に、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.5.0" \
    --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"

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

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

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

  • コンテナー アプリの最小 1 個、最大 3 個のレプリカ。

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

    Note

    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 にサインインし、API Management インスタンスに移動します。

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

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

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

シナリオ例

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

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

  1. セルフホステッド ゲートウェイと同じ環境に API をホストするコンテナー アプリをデプロイする
  2. API を API Management インスタンスに追加する
  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 には /albums エンドポイントでアクセスできます。 例: https://albums-api.happyvalley-abcd1234.centralus.azurecontainerapps.io/albums/albums

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

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

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

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

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

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

  1. ポータルで、セルフホステッド ゲートウェイを構成した API Management インスタンスに移動します。
  2. 左側のメニューで、[API]>[+ API の追加] を選択します。
  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. [表示名]: 操作のわかりやすい名前を入力します。 例: 「Get albums」。
    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 へのログ記録を有効にしている場合は、ログにクエリを実行して要求と応答を確認できます。