Spring Cloud Gateway を使用する

Note

Azure Spring Apps は、Azure Spring Cloud サービスの新しい名前です。 サービスの名前は新しくなりましたが、スクリーンショット、ビデオ、図などの資産の更新に取り組んでいる間、場所によってはしばらく古い名前が表示されます。

この記事の適用対象:❌ Basic または Standard ✔️ Enterprise

この記事では、Azure Spring Apps Enterprise プランで VMware Spring Cloud Gateway を使用して、アプリケーションに要求をルーティングする方法について説明します。

VMware Spring Cloud Gateway は、オープンソースの Spring Cloud Gateway プロジェクトに基づく商用 VMware Tanzu コンポーネントです。 Spring Cloud Gateway は、シングル サインオン (SSO)、アクセス制御、レート制限、回復性、セキュリティなど、API 開発チームにとっての分野横断的な懸念に対処しています。 最新のクラウド ネイティブ パターンと、API 開発用の任意のプログラミング言語を使用して、API のデリバリーを迅速化できます。

Spring Cloud Gateway には、次のような機能があります。

  • 動的ルーティング構成、再コンパイルなしで適用および変更できる個々のアプリケーションに依存しません。
  • 承認された JSON Web トークン (JWT) 要求をアプリケーション サービスに転送する商用 API ルート フィルター。
  • クライアント証明書の承認。
  • レート制限のアプローチ。
  • サーキット ブレーカーの構成。
  • HTTP 基本認証の資格情報を使用したアプリケーション サービスへのアクセスのサポート。

VMware Tanzu の API ポータルと統合するために、VMware Spring Cloud Gateway では、ルート構成の追加または変更後に OpenAPI バージョン 3 のドキュメントが自動的に生成されます。

前提条件

ルートを構成する

このセクションでは、Spring Cloud Gateway を使用するアプリの API ルートを追加、更新、管理する方法について説明します。

ルート構成定義には、次の部分が含まれます。

  • OpenAPI URI: この URI は OpenAPI 仕様を参照します。 https://petstore3.swagger.io/api/v3/openapi.json などのパブリック URI エンドポイントまたは http://<app-name>/{relative-path-to-OpenAPI-spec} などの構築された URI を使用できます。ここで <app-name> は API 定義を含む Azure Spring Apps 内のアプリケーションの名前です。 OpenAPI 2.0 と OpenAPI 3.0 の両方の仕様がサポートされています。 この仕様は、有効になっている場合は API ポータルに表示されます。
  • routes: トラフィックをアプリに誘導し、フィルターを適用するルート ルールの一覧。
  • protocol: Spring Cloud Gateway がトラフィックをルーティングする先のアプリケーションのバックエンド プロトコル。 プロトコルでサポートされている値は HTTP または HTTPS で、既定値は HTTP です。 Spring Cloud Gateway から HTTPS 対応アプリケーションへのトラフィックをセキュリティで保護するには、ルート構成でプロトコルを HTTPS に設定する必要があります。
  • アプリ レベルのルート: ルート構成内のすべてまたはほとんどのルートで繰り返しを避けるために、アプリ レベルで構成できる 3 つのルート プロパティがあります。 具象ルーティング規則は、同じプロパティのアプリ レベルのルーティング規則をオーバーライドします。 アプリ レベルで、predicatesfiltersssoEnabled の各プロパティを定義できます。 この OpenAPI URI 機能を使用してルートを定義する場合、サポートされるアプリ レベルのルーティング プロパティは filters のみです。

ルート構成を作成するには、次のコマンドを使用します。値は --app-name 、要求がルーティングする Azure Spring Apps でホストされているアプリの名前である必要があります。

az spring gateway route-config create \
    --name <route-config-name> \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --app-name <app-name> \
    --routes-file <routes-file.json>

次の例は、create コマンドの --routes-file パラメーターに渡される JSON ファイルを示しています。

{
   "predicates": [
      "<app-level-predicate-of-route>",
   ],
   "ssoEnabled": false,
   "filters": [
      "<app-level-filter-of-route>",
   ],
   "openApi": {
      "uri": "<OpenAPI-URI>"
   },
   "protocol": "<protocol-of-routed-app>",
   "routes": [
      {
         "title": "<title-of-route>",
         "description": "<description-of-route>",
         "predicates": [
            "<predicate-of-route>",
         ],
         "ssoEnabled": true,
         "filters": [
            "<filter-of-route>",
         ],
         "tags": [
            "<tag-of-route>"
         ],
         "order": 0
      }
   ]
}

ルート定義の一覧を次の表に示します。 プロパティはすべて省略可能です。

プロパティ Description
title 生成された OpenAPI ドキュメント内のメソッドに適用するタイトル。
description 生成された OpenAPI ドキュメント内のメソッドに適用する説明。
uri 要求がルーティングするアプリの名前をオーバーライドする完全な URI。
ssoEnabled SSO 検証を有効にするかどうかを示す値。 「シングル サインオンの構成」を参照してください。
tokenRelay 現在認証されているユーザーの ID トークンをアプリケーションに渡します。
predicates 述語の一覧。 「使用可能な述語」を参照してください。
filters フィルターの一覧です。 「使用可能なフィルター」を参照してください。
オーダー ルートの処理順序。 Spring Cloud Gateway のように、順序が下位であるほど、優先度が高く処理されます。
tags 生成された OpenAPI ドキュメントのメソッドに適用される分類タグ。

Note

セキュリティまたは互換性の理由により、すべてのフィルターや述語が Azure Spring Apps でサポートされているわけではありません。 次の要素はサポートされていません。

  • BasicAuth
  • JWTKey

Spring Cloud Gateway のルートを使用する

次の手順に従い、Spring Cloud Gateway を使用してサンプル アプリケーションを作成します。

  1. 次のコマンドを使用して、Azure Spring Apps で test-app という名前のテスト アプリケーションを作成します。

    az spring app create \
        name test-app \
        resource-group <resource-group-name> \
        service <Azure-Spring-Apps-instance-name>
    
  2. ゲートウェイにパブリック エンドポイントを割り当てて、アクセスします。

    Spring Cloud Gateway に与えられた実行中の状態とリソースを表示するには、Azure portal で Azure Spring Apps インスタンスを開き、[Spring Cloud Gateway] セクションを選択し、[概要] を選択します。

    [Assign endpoint]\(エンドポイントの割り当て\) の横の [はい] を選択して、パブリック エンドポイントを割り当てます。 URL は数分で表示されます。 後で使用できるように、この URL を保存します。

    Screenshot of Azure portal Azure Spring Apps overview page with 'Assign endpoint' highlighted.

    Azure CLI を使用してエンドポイントを割り当てることもできます。 エンドポイントを割り当てるには、次のコマンドを使用します。

    az spring gateway update \
        --resource-group <resource-group-name> \
        --service <Azure-Spring-Apps-instance-name> \
        --assign-endpoint true
    
  3. Spring Cloud Gateway を介してテスト アプリの正常性チェック エンドポイントにアクセスするルールを作成します。

    次の内容を test-api.json ファイルに保存します。 この構成には、10 秒ごとに 20 個の要求を許可する RateLimit フィルターと、要求エンドポイントが標準の Spring Boot 正常性チェック エンドポイントに到達できるようにする RewritePath フィルターが含まれています。

    {
      "protocol": "HTTP",
      "routes": [
        {
          "title": "Test API",
          "description": "Retrieve a health check from our application",
          "predicates": [
            "Path=/test/api/healthcheck",
            "Method=GET"
          ],
          "filters": [
            "RateLimit=20,10s",
            "RewritePath=/api/healthcheck,/actuator/health"
          ],
          "tags": [
            "test"
          ]
        }
      ]
    }
    

    次のコマンドを使用して、test-app アプリに規則を適用します。

    az spring gateway route-config create \
        --name test-api-routes \
        --resource-group <resource-group-name> \
        --service <Azure-Spring-Apps-instance-name> \
        --app-name test-app \
        --routes-file test-api.json
    

    次のスクリーンショットに示すように、ポータルでルートを表示することもできます。

    Screenshot of Azure portal Azure Spring Apps Spring Cloud Gateway page showing 'Routing rules' pane.

  4. ゲートウェイ エンドポイント経由で test health check API にアクセスするには、次のコマンドを使用します。

    curl https://<endpoint-url>/test/api/healthcheck
    
  5. ルーティング規則にクエリを実行するには、次のコマンドを使用します。

    az spring gateway route-config show \
        --name test-api-routes \
        --query '{appResourceId:properties.appResourceId, routes:properties.routes}'
    
    az spring gateway route-config list \
        --query '[].{name:name, appResourceId:properties.appResourceId, routes:properties.routes}'
    

フィルターの使用

オープンソースの Spring Cloud Gateway プロジェクトには、ゲートウェイ ルートで使用する多くの組み込みフィルターが含まれています。 Spring Cloud Gateway には、OSS プロジェクトに含まれるフィルターに加えて、多くのカスタム フィルターが用意されています。

次の例は、ルートにフィルターを AddRequestHeadersIfNotPresent 適用する方法を示しています。

[
  {
    "predicates": [
      "Path=/api/**",
      "Method=GET"
    ],
    "filters": [
      "AddRequestHeadersIfNotPresent=Content-Type:application/json,Connection:keep-alive"
    ]
  }
]

次に、以下の Azure CLI コマンドを使用してルート定義を適用します。

az spring gateway route-config create \
    --name <route-config-name> \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --app <app-name>
    --routes-file <json-file-with-routes>

使用可能なルート フィルターの詳細については、「Azure Spring Apps Enterprise プランで VMware Spring Cloud Gateway ルート フィルターを使用する方法」を参照してください

次のステップ