Share via


チュートリアル: Azure Spring Apps で Spring Cloud Gateway を使用してクライアントを認証する

Note

毎月最初の 50 vCPU 時間と 100 GB 時間のメモリは無料です。 詳細については、Apps on Azure ブログの「価格の引き下げ - Azure Spring Apps はより多く、より低コスト」を参照 してください。

注意

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

この記事の適用対象: ✔️ Standard 従量課金および専用 (プレビュー)

このクイックスタートでは、クライアント アプリケーションと、Azure Spring Apps でホストされ、Spring Cloud Gateway アプリでシールドされたマイクロサービス アプリケーション間の通信をセキュリティで保護する方法について説明します。 クライアント アプリケーションは、Spring Cloud Gateway で構築されたアプリを使用して、Azure Spring Apps にデプロイされたマイクロサービスとのコンタクトを開始するためのセキュリティ プリンシパルとして検証されます。 この方法では、OAuth 2.0 クライアント資格情報フローの実行によって実現される、認証と許可のプロセスに Spring Cloud Gateway のトークン リレーと Spring Security のリソース サーバー機能を使用します。

次の一覧は、サンプル プロジェクトの構成を示しています。

  • Books SPA: ローカルでホストされているこのシングル ページ アプリケーション (SPA) は、ブックを追加または検索するために Books マイクロサービスと対話します。
  • Books マイクロサービス:
    • Azure Spring Apps でホストされている Spring Cloud Gateway アプリ。 このアプリは、Books RESTful API へのゲートウェイとして動作します。
    • Azure Spring Apps でホストされている Spring Boot RESTful API アプリ。 このアプリは、H2 データベースに書籍情報を格納します。 Books サービスは、書籍の作成と読み取りを行うために 2 つの REST エンドポイントを公開します。

1.前提条件

2. Spring プロジェクトを準備する

次の手順を使用し、アプリをローカル環境にクローンして実行します。

  1. 次のコマンドを使用して、GitHub からサンプル プロジェクトを複製します。

    git clone https://github.com/Azure-Samples/azure-spring-apps-sso-client-credential.git -b consumption-plan
    
  2. 次のコマンドを使用して、Books バックエンド サービスをビルドします。

    cd azure-spring-apps-sso-client-credential
    ./mvnw clean package
    
  3. SPA プロジェクト ディレクトリを入力し、次のコマンドを使用して依存関係をインストールします。

    npm install @azure/msal-node
    

3. クラウド環境を準備する

このサンプルを実行するために必要な主なリソースは、Azure Spring Apps インスタンスと Azure Database for PostgreSQL インスタンスです。 このセクションでは、これらのリソースを作成する手順を示します。

3.1. Azure portal にサインインする

Web ブラウザーを開き、Azure portal に移動します。 資格情報を入力して Azure portal にサインインします。 既定のビューはサービス ダッシュボードです。

3.2. Azure Spring Apps インスタンスを作成する

次の手順を使用して、サービス インスタンスを作成します。

  1. Azure portal の隅にある [リソースの作成] を選択します。

  2. [Compute]>[Azure Spring Apps] を選択します。

    Screenshot of the Azure portal that shows the Create a resource page with Azure Spring Apps highlighted.

  3. [基本] フォームに以下の情報を入力します。

    設定 提案された値 説明
    サブスクリプション お使いのサブスクリプション名 サーバーに使用する Azure サブスクリプション。 複数のサブスクリプションをお持ちの場合は、リソースの課金対象となるサブスクリプションを選択します。
    Resource group myresourcegroup 新しいリソース グループ名、またはサブスクリプションの既存のリソース グループ名。
    名前 myasa Azure Spring Apps サービスを識別する一意の名前。 名前の長さは 4 文字から 32 文字で、小文字、数字、およびハイフンのみを使用できます。 サービス名の最初の文字は英字でなければならず、最後の文字は英字または数字でなければなりません。
    プラン Standard consumption & dedicated (プレビュー) 価格プランによって、インスタンスに関連付けられるリソースとコストが決まります。
    Region ユーザーに最も近いリージョン ユーザーに最も近い場所。
    Container Apps 環境 myacaenv 同じ仮想ネットワークを他のサービスやリソースと共有する Container Apps 環境インスタンスを選択します。

    Screenshot of the Azure portal that shows the Create Azure Spring Apps consumption plan page.

    Container Apps 環境を作成するためのガイドとして、次の表を使用します。

    設定 提案された値 説明
    環境名 myacaenv Azure Container Apps 環境サービスを識別する一意の名前。
    プラン 消費 価格プランによって、インスタンスに関連付けられるリソースとコストが決まります。
    ゾーン冗長 Disabled Azure 可用性ゾーンに Azure Spring Apps サービスを作成するかどうか。

    Screenshot of the Azure portal that shows the Create Azure Container Apps page.

    重要

    従量課金ワークロード プロファイルでは従量課金制の課金モデルがあり、開始コストはありません。 プロビジョニングされたリソースに基づいて、専用ワークロード プロファイルに対して課金されます。 詳細については、「Azure Container Apps の従量課金 + 専用プラン構造環境のワークロード プロファイル (プレビュー)」および「Azure Spring Apps の価格」を参照してください。

  4. Review and Create(確認と作成) を選択して、選択内容を確認します。 [作成] を選択して、Azure Spring Apps インスタンスをプロビジョニングします。

  5. ツール バーの [通知] アイコン (ベル) を選択して、デプロイ プロセスを監視します。 デプロイが完了したら、[ダッシュボードにピン留めする] を選択できます。これにより、このサービスのタイルが、サービスの [概要] ページへのショートカットとして、Azure portal ダッシュボードに作成されます。 [Go to resource] (リソースに移動) を選択して、サービスの [概要] ページを開きます。

    Screenshot of the Azure portal that shows the Overview page with the Notifications pane open.

  6. Eureka サーバーを有効にするには、次のコマンドを使用します。 プレースホルダーは、前の手順で作成した独自の値に置き換えてください。

    az spring eureka-server enable \
        --resource-group <resource-group-name> \
        --name <Azure-Spring-Apps-instance-name>
    

3.3. Books アプリケーションを登録する

このセクションでは、Azure Spring Apps で RESTful API を保護するために使用される Microsoft Entra ID にアプリ ロールを追加するアプリケーションを登録する手順について説明します。

  1. Azure portal ホームページにアクセスします。

  2. 複数のテナントにアクセスできる場合は、[ディレクトリとサブスクリプション] フィルター () を使用して、アプリケーションを登録するテナントを選択します。

  3. Microsoft Entra ID を検索して選択します。

  4. [管理][アプリの登録]>[新規登録] の順に選択します。

  5. アプリケーションの名前を [名前] フィールドに入力します (例: Books)。 アプリのユーザーにはこの名前が表示されます。後で変更することもできます。

  6. [サポートされているアカウントの種類] で、 [この組織のディレクトリ内のアカウントのみ] を選択します。

  7. [登録] を選択して、アプリケーションを作成します。

  8. アプリの [概要] ページで、 [アプリケーション (クライアント) ID] の値を探し、後で使用するために記録します。 これは、このプロジェクトの YAML 構成ファイルを構成するために必要です。

  9. [管理][API の公開] を選択し、ページの先頭にある [アプリケーション ID の URI] を見つけて、[追加] を選択してください。

  10. [アプリケーション ID の URI の編集] ページで、提案されたアプリケーション ID URI (api://{client ID}) を受け入れるか、クライアント ID の代わりにわかりやすい名前 (api://books など ) を使用して、[保存] を選択します。

  11. [管理] で、[アプリのロール]>[アプリ ロールの作成] の順に選択し、次の情報を入力します:

    • [表示名] には 「Write」と入力します。
    • [許可されるメンバーの種類] には、[アプリケーション] を選択します。
    • [値] には、「BooksWrite」と入力します。
    • [説明] には、「Adding books」と入力します。
  12. 前の手順を繰り返して、別のアプリのロールを追加します: Books.Read

    Screenshot of the Books app registration page that shows the App roles.

3.4. SPA アプリケーションの登録

Books RESTful API アプリは、リソース サーバーとして機能します。このサーバーは Microsoft Entra ID で保護されています。 アクセス トークンを取得する前に、別のアプリケーションを Microsoft Entra ID に登録し、SPA という名前のクライアント アプリケーションにアクセス許可を付与する必要があります。

  1. Microsoft Entra ID でテナントに戻ります。

  2. [管理][アプリの登録]>[新規登録] の順に選択します。

  3. [名前] フィールドにアプリケーションの名前を入力します (例: SPA)。

  4. [サポートされているアカウントの種類] で、既定の [この組織のディレクトリ内のアカウントのみ] を選択します。

  5. [登録] を選択して、アプリケーションを作成します。

  6. アプリの [概要] ページで、 [アプリケーション (クライアント) ID] の値を探し、後で使用するために記録します。 アクセス トークンを取得するのにこれが必要です。

  7. [API のアクセス許可]>[アクセス許可の追加]>[所属する組織で使用している API] を選択します。 先ほど登録した Books アプリケーションを選択し、アクセス許可 [Books.Read][Books.Write] を選択し、[アクセス許可の追加] を選択します。

  8. [<テナント名>に管理者の同意を付与する] を選択し、追加したアクセス許可に管理者の同意を付与します。

    Screenshot of the SPA API permissions page that shows the API permissions of a web application.

  9. [証明書とシークレット] に移動し、[新しいクライアント シークレット] を選択します。

  10. [クライアント シークレットの追加] ページでシークレットの説明を入力し、有効期限を選択して、[追加] を選択します。

  11. シークレットの [値] を探し、後で使用できるように記録します。 アクセス トークンを取得するためにこれが必要です。

3.5. Books Service アプリの構成を更新する

books-service アプリの books-service/src/main/resources/application.yml ファイルを見つけます。 次の例に一致するように、spring.cloud.azure.active-directory セクションの構成を更新します。 プレースホルダーを、必ず前に作成した値で置き換えてください。

spring:
  cloud:
    azure:
      active-directory:
        credential:
          client-id: <your-application-ID-of-Books>
        app-id-uri: <your-application-ID-URI-of-Books>

次のコマンドを使用して、サンプル プロジェクトをリビルドします。

./mvnw clean package

4. アプリを Azure Spring Apps にデプロイする

以下の手順では、アプリ を Azure にデプロイする方法を示します。

4.1. マイクロサービス アプリを Azure Spring Apps にデプロイする

次の手順に従って、Azure Spring Apps 用の Maven プラグインを使用してアプリを Azure Spring Apps にデプロイします:

  1. サンプル プロジェクト ディレクトリに移動し、次のコマンドを使って Azure Spring Apps のアプリを構成します。

    ./mvnw com.microsoft.azure:azure-spring-apps-maven-plugin:1.18.0:config
    

    次の一覧に、コマンド対話を記載します。

    • Select child modules to configure(input numbers separated by comma, eg: [1-2,4,6], ENTER to select ALL) (構成する子モジュールを選択してください (入力番号はコンマで区切ります。例: [1-2,4,6]。すべて選択するには、ENTER キーを押します)): Enter キーを押してすべて選択します。
    • OAuth2 login (OAuth2 ログイン): OAuth2 プロトコルに基づいて Azure へのログインを承認します。
    • Select subscription (サブスクリプションを選択してください): 作成した Azure Spring Apps インスタンスのサブスクリプション リスト番号を選択します。既定では、リストの最初のサブスクリプションに設定されます。 既定の番号を使用する場合は、Enter キーを直接押します。
    • Select Azure Spring Apps for deployment (デプロイ用の Azure Spring Apps を選択してください): 作成した Azure Spring Apps インスタンスのリスト番号を選択します。 既定の番号を使用する場合は、Enter キーを直接押します。
    • パブリック アクセスを公開するアプリを選択してください (入力番号はコンマで区切ります (例: [1-2,4,6])。何も選択しない場合は ENTER キーを押します): gateway-service には「1」と入力します。
    • Confirm to save all the above configurations (Y/n) (上記のすべての構成の保存を確定してください (Y/n)): 「y」と入力します。 「n」と入力した場合、構成は POM ファイルに保存されません。
  2. 次のコマンドを使用して、アプリをデプロイします。

    ./mvnw azure-spring-apps:deploy
    

    次の一覧に、コマンド対話を記載します:

    • OAuth2 login (OAuth2 ログイン): OAuth2 プロトコルに基づいて Azure へのログインを承認する必要があります。

    コマンドが実行されると、デプロイが成功したことを示す次のログ メッセージが表示されます。

    [INFO] Getting public url of app(gateway-service)...
    [INFO] Application url: https://gateway-service.xxxxxxxxxxxxxx-xxxxxxxx.eastasia.azurecontainerapps.io
    
    ...
    
    [INFO] Artifact(books-service-0.0.1-SNAPSHOT.jar) is uploaded and deployment(default) is successfully updated.
    
    ...
    

    出力のアプリケーション URL は、ToDo RESTful API アプリケーションにアクセスするためのベース エンドポイントです。

4.2. SPA アプリをローカルで実行する

次の例に一致するように、SPA アプリケーション スクリプト ファイル spa/server.js の構成を更新します。 プレースホルダーは、前の手順で作成した独自の値に置き換えてください。

const SpringCloudGatewayURL = "<URL exposed by app gateway-service>"

const msalConfig = {
    auth: {
        clientId: "< SPA App Registration ClientId>",
        authority: "https://login.microsoftonline.com/< TenantId >/",
        clientSecret: "<SPA App Registration ClientSecret>",
    },
};

const tokenRequest = {
    scopes: ["<Application ID URI of Books>/.default"]
};

SPA プロジェクト ディレクトリで、次のコマンドを使用してローカルで実行します。

node server.js

Note

SPA アプリは静的 Web アプリケーションであり、任意の Web サーバーにデプロイできます。

5. アプリ を検証します

gateway-service アプリを介して Books RESTful API と通信する Books SPA アプリにアクセスできます。

  1. ブラウザーで http://localhost:3000 に移動して、アプリケーションにアクセスします。

  2. [作成者][タイトル] に値を入力し、[書籍の追加] を選択します。 次の例のような応答が表示されます。

    Book added successfully: {"id":1,"author":"Jeff Black","title":"Spring In Action"}
    

6.リソースをクリーンアップする

Azure リソース グループを削除した場合、そのリソース グループに含まれたすべてのリソースが対象となります。 次の手順に従って、新しく作成したサーバーを含むリソース グループ全体を削除します。

  1. Azure Portal で目的のリソース グループを探します。

  2. [リソース グループ] を選択し、目的のリソース グループの名前 (この例では myresourcegroup) を選択します。

  3. リソース グループ ページで [削除] を選択します。 テキスト ボックスにリソース グループの名前を入力し、削除を確定します。

  4. [削除] を選択します。

7. 次のステップ

詳細については、次の記事を参照してください。