チュートリアル: Spring Boot アプリケーションで Azure Key Vault からシークレットを読み込む

このチュートリアルでは、Azure Key Vault から値を読み取る Spring Boot アプリを作成する方法を紹介します。 アプリを作成したら、Azure App Service と Azure Spring Apps にデプロイします。

Spring Boot アプリケーションは、ユーザー名やパスワードなどの機密情報を外部化します。 機密情報を外部化することで、保守容易性、テストの容易性、セキュリティを向上させることができます。 シークレットをコードの外部に格納することは、情報をハードコーディングしたり、ビルド時にインライン展開したりするよりも優れています。

このチュートリアルでは、次の作業を行う方法について説明します。

  • Azure Key Vault を作成してシークレットを格納する
  • Spring Initializr を使用してアプリを作成する
  • アプリに Key Vault 統合を追加する
  • Azure App Service に配置する
  • Azure リソース用マネージド ID を使用して Azure App Service に再デプロイする
  • Azure Spring Apps にデプロイする

前提条件

  • curl コマンド。 ほとんどの UNIX 系オペレーティング システムには、このコマンドがプレインストールされています。 OS 固有のクライアントは、curl の公式 Web サイトで入手できます。
  • jq コマンド。 ほとんどの UNIX 系オペレーティング システムには、このコマンドがプレインストールされています。 OS 固有のクライアントは、jq の公式 Web サイトで入手できます。

重要

この記事の手順を完了するには、Spring Boot 2.5 以降のバージョンが必要です。

新しい Azure キー コンテナーの作成

以下のセクションでは、Azure にサインインし、Azure Key Vault を作成する方法について説明します。

Azure にサインインしてサブスクリプションを設定する

まず、次の手順に従って、Azure CLI を使用して認証します。

  1. 必要に応じて、サインアウトして一部の認証ファイルを削除し、残っている資格情報を削除します。

    az logout
    rm ~/.azure/accessTokens.json
    rm ~/.azure/azureProfile.json
    
  2. Azure CLI を使用してサインインします。

    az login
    

    指示に従って、サインインを完了します。

  3. サブスクリプションを一覧表示します。

    az account list
    

    Azure はサブスクリプションの一覧を返します。 次の例のように、使用するサブスクリプションの id の値をコピーします。

    [
      {
        "cloudName": "AzureCloud",
        "homeTenantId": "tttttttt-tttt-tttt-tttt-tttttttttttt",
        "id": "ssssssss-ssss-ssss-ssss-ssssssssssss",
        "isDefault": false,
        "managedByTenants": [],
        "name": "Converted Windows Azure MSDN - Visual Studio Ultimate",
        "state": "Enabled",
        "tenantId": "tttttttt-tttt-tttt-tttt-tttttttttttt",
        "user": {
          "name": "contoso@microsoft.com",
          "type": "user"
        }
      }
    ]
    
  4. Azure で使用するサブスクリプションの GUID を指定します。次に例を示します。

    az account set -s ssssssss-ssss-ssss-ssss-ssssssssssss
    

サービス プリンシパルの作成

Azure AD のサービス プリンシパルは、サブスクリプション内の Azure リソースへのアクセスを提供します。 サービス プリンシパルは、サービスのユーザー ID と考えることができます。 "サービス" とは、Azure リソースにアクセスする必要があるアプリケーション、サービス、またはプラットフォームのことです。 指定したそれらのリソースのみをスコープとするアクセス権を持つサービス プリンシパルを構成できます。 その後、サービス プリンシパルの資格情報を使用してそれらのリソースにアクセスするようにアプリケーションまたはサービスを構成します。

サービス プリンシパルを作成するには、次のコマンドを使用します。

az ad sp create-for-rbac --name contososp --role Contributor --scopes /subscriptions/mySubscriptionID

注意

--name オプションの値は、Azure サブスクリプション内で一意にする必要があります。 Found an existing instance of "...", We will patch it. Insufficient privileges to complete operation のような エラー ログが表示される場合は、その name 値がサブスクリプションに既に存在することを意味します。 別の名前を試してください。

このチュートリアルで後ほど使用するために、コマンドから返された値を保存します。 返された JSON は、次のような出力になります。

{
  "appId": "sample-app-id",
  "displayName": "contososp",
  "password": "sample-password",
  "tenant": "sample-tenant"
}

Key Vault インスタンスを作成する

Azure Key Vault を作成して初期化するには、次の手順に従います。

  1. どの Azure リージョンにリソースを保持するかを決定します。

    1. リージョンとその場所の一覧については、「Azure の地域」を参照してください。

    2. 選択したリージョンの正しい Name を見つけるには、az account list-locations コマンドを使用します。

      az account list-locations --output table
      

      このチュートリアルでは eastus を使用します。

  2. Key Vault と App Service アプリを保持するリソース グループを作成します。 値は Azure サブスクリプション内で一意である必要があります。 このチュートリアルでは contosorg を使用します。

    az group create --name contosorg --location eastus
    
  3. リソース グループに新しい Key Vault を作成します。

    az keyvault create \
        --resource-group contosorg \
        --name contosokv \
        --enabled-for-deployment true \
        --enabled-for-disk-encryption true \
        --enabled-for-template-deployment true \
        --location eastus \
        --query properties.vaultUri \
        --sku standard
    

    注意

    --name オプションの値は、Azure サブスクリプション内で一意にする必要があります。 Found an existing instance of "...", We will patch it. Insufficient privileges to complete operation のような エラー ログが表示される場合は、その name 値がサブスクリプションに既に存在することを意味します。 別の名前を試してください。

    次の表では、上記のオプションについて説明します。

    パラメーター 説明
    enabled-for-deployment Key Vault のデプロイ オプションを指定します。
    enabled-for-disk-encryption Key Vault の暗号化オプションを指定します。
    enabled-for-template-deployment Key Vault の暗号化オプションを指定します。
    location リソース グループをホストする Azure リージョンを指定します。
    name Key Vault の一意の名前を指定します。
    query 応答から Key Vault URI を取得します。 このチュートリアルを完了するには URI が必要です。
    sku Key Vault SKU オプションを指定します。

    Azure CLI に Key Vault の URI が表示されます。この URI は後で使用します。次に例を示します。

    "https://contosokv.vault.azure.net/"
    
  4. Key Vault を構成して、そのマネージド ID からの getlist の操作を許可します。 sample-app-id の値は、上記の az ad sp create-for-rbac コマンドの appId です。

    az keyvault set-policy --name contosokv --spn sample-app-id --secret-permissions get list
    

    出力は、Key Vault に関する完全な情報を含む JSON オブジェクトになります。 Microsoft.KeyVault/vaults の値を持つ type エントリがあります。

    次の表では、上記のプロパティについて説明します。

    パラメーター 説明
    name Key Vault の名前。
    spn 上記の az ad sp create-for-rbac コマンドの出力からの appId
    secret-permissions 名前付きプリンシパルからの許可する操作の一覧。

    注意

    最小限の特権の原則ではリソースに対して最小限の特権セットを許可することが推奨されますが、Key Vault 統合の設計には少なくとも getlist が必要です。

  5. 新しい Key Vault にシークレットを格納します。 一般的なユース ケースでは、JDBC 接続文字列を格納します。 次に例を示します。

    az keyvault secret set --name "connectionString" \
        --vault-name "contosokv" \
        --value "jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE;"
    

    次の表では、上記のオプションについて説明します。

    パラメーター 説明
    name シークレットの名前を指定します。
    value シークレットの値を指定します。
    vault-name 前の手順で作成した Key Vault の名前を指定します。

    Azure CLI にシークレット作成の結果が表示されます。次に例を示します。

    {
      "attributes": {
        "created": "2020-08-24T21:48:09+00:00",
        "enabled": true,
        "expires": null,
        "notBefore": null,
        "recoveryLevel": "Purgeable",
        "updated": "2020-08-24T21:48:09+00:00"
      },
      "contentType": null,
      "id": "https://contosokv.vault.azure.net/secrets/connectionString/sample-id",
      "kid": null,
      "managed": null,
      "name": "connectionString",
      "tags": {
        "file-encoding": "utf-8"
      },
      "value": "jdbc:sqlserver://.database.windows.net:1433;database=DATABASE;"
    }
    

Key Vault を作成し、シークレットを保存したので、次のセクションでは Spring Initializr を使用してアプリを作成する方法について説明します。

Spring Initializr を使用してアプリを作成する

このセクションでは、Spring Initializr を使用して、キー コンテナーのシークレットを含めて Spring Boot Web アプリケーションを作成して実行する方法について説明します。

  1. https://start.spring.io/ を参照します。

  2. この一覧に続く図に示すように項目を選択します。

    • [Project](プロジェクト) : [Maven Project]
    • [Language](言語) : [Java]
    • Spring Boot: 2.7.2
    • [Group](グループ) :「com.contoso」(ここには任意の有効な Java パッケージ名を入力できます。)
    • Artifact: keyvault (任意の有効な Java クラス名をここに入力できます。)
    • [Packaging] : [Jar]
    • [Java] : [11] (8 を選択できますが、このチュートリアルは 11 で検証されています。)
  3. [Add Dependencies...] を選択します。

  4. テキスト フィールドに「Spring Web」と入力し、Ctrl + Enter キーを押します。

  5. テキスト フィールドに「Azure Key Vault」と入力し、Enter キーを押します。 画面は次のようになります。

    基本的なオプションが表示された Spring Initializr のスクリーンショット。

  6. ページ下部にある [Generate] を選択します。

  7. メッセージが表示されたら、ローカル コンピューター上のパスにプロジェクトをダウンロードします。 このチュートリアルでは、現在のユーザーのホーム ディレクトリにある keyvault ディレクトリを使用します。 上記の値を指定すると、そのディレクトリ内の keyvault .zip ファイルが表示されます。

アプリケーションを確認してローカルで実行するには、次の手順に従います。

  1. keyvault.zip ファイルを解凍します。 ファイル レイアウトは次のようになります。 このチュートリアルでは、test ディレクトリとその内容は無視します。

    ├── HELP.md
    ├── mvnw
    ├── mvnw.cmd
    ├── pom.xml
    └── src
        ├── main
        │   ├── java
        │   │   └── com
        │   │       └── contoso
        │   │           └── keyvault
        │   │               └── KeyvaultApplication.java
        │   └── resources
        │       ├── application.properties
        │       ├── static
        │       └── templates
    
  2. テキスト エディターで KeyvaultApplication.java ファイルを開きます。 次の内容が含まれるようにファイルを編集します。

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestController
    public class KeyvaultApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(KeyvaultApplication.class, args);
        }
    
        @GetMapping("get")
        public String get() {
            return connectionString;
        }
    
        private String connectionString = "defaultValue\n";
    
        public void run(String... varl) throws Exception {
            System.out.println(String.format("\nConnection String stored in Azure Key Vault:\n%s\n",connectionString));
        }
    
    }
    

    次の一覧で、このコードの詳細について説明します。

    • クラスには @RestController の注釈が付いています。 @RestController は、クラスが RESTful HTTP 要求に応答できることを Spring Boot に示します。
    • クラスには @GetMapping(get) の注釈が付いたメソッドがあります。 @GetMapping は Spring Boot に対し、/get パスを含む HTTP 要求をそのメソッドに送信し、そのメソッドからの応答を HTTP クライアントに返すことを許可するように指示します。
    • クラスにはプライベート インスタンス変数 connectionString があります。 このインスタンス変数の値は get() メソッドから返されます。
  3. Bash ウィンドウを開き、pom.xml ファイルが配置されている最上位の keyvault ディレクトリに移動します。

  4. 次のコマンドを入力します。

    mvn spring-boot:run
    

    コマンドによって Completed initialization が出力されます。これは、サーバーの準備ができていることを示します。

  5. 別の Bash ウィンドウで、次のコマンドを入力します。

    curl http://localhost:8080/get
    

    出力には defaultValue が表示されます。

  6. mvn spring-boot:run から実行されているプロセスを強制終了します。 Ctrl + C キーを押すか、jps コマンドを使用して Launcher プロセスの PID を取得し、強制終了することができます。

Spring Initializr を使用しないでアプリを作成する

このセクションでは、Spring Initializr を使用しないで Azure Key Vault のシークレットを既存の Spring Boot プロジェクトに含める方法について説明します。

Spring Initializr によって生成されるのと同じ構成を手動で追加するには、次の構成を pom.xml ファイルに追加します。

<properties>
     <version.spring.cloud.azure>4.3.0</version.spring.cloud.azure>
</properties>
<dependencies>
     <dependency>
         <groupId>com.azure.spring</groupId>
         <artifactId>spring-cloud-azure-starter-keyvault-secrets</artifactId>
     </dependency>
</dependencies>
<dependencyManagement>
     <dependencies>
         <dependency>
             <groupId>com.azure.spring</groupId>
             <artifactId>spring-cloud-azure-dependencies</artifactId>
             <version>${version.spring.cloud.azure}</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>
     </dependencies>
</dependencyManagement> 

アプリに Key Vault 構成を追加する

このセクションでは、Spring Boot アプリケーション KeyvaultApplication を変更して、ローカルで実行しているアプリケーションに Key Vault 構成を追加する方法について説明します。

Key Vault がシークレットをアプリケーション コードから外部化できるのと同様に、Spring 構成では構成をコードから外部化できます。 Spring 構成の最も単純な形式は、application.properties ファイルです。 Maven プロジェクトでは、このファイルは src/main/resources/application.properties にあります。 Spring Initializr ではこの場所に長さゼロのファイルが含まれています。 このファイルに必要な構成を追加するには、次の手順に従います。

  1. src/main/resources/application.properties ファイルを編集して次の内容を追加し、ご使用の Azure サブスクリプションの値に一致させます。

    spring.cloud.azure.keyvault.secret.property-source-enabled=true
    spring.cloud.azure.keyvault.secret.property-sources[0].credential.client-id=<your client ID>
    spring.cloud.azure.keyvault.secret.property-sources[0].credential.client-secret=<your client key>
    spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=https://contosokv.vault.azure.net/
    spring.cloud.azure.keyvault.secret.property-sources[0].profile.tenant-id=<your tenant ID>
    

    次の表では、上記のプロパティについて説明します。

    パラメーター 説明
    spring.cloud.azure.keyvault.secret.property-source-enabled spring-cloud-azure-starter-keyvault-secrets のプロパティ ソース機能を有効にするかどうかを示す値。 既定値は false です。
    spring.cloud.azure.keyvault.secret.property-sources[0].credential.client-id az ad sp create-for-rbac から返される JSON の appId です。
    spring.cloud.azure.keyvault.secret.property-sources[0].credential.client-secret az ad sp create-for-rbac から返される JSON の password です。
    spring.cloud.azure.keyvault.secret.property-sources[0].endpoint 上記の az keyvault create コマンドからの出力値です。
    spring.cloud.azure.keyvault.secret.property-sources[0].profile.tenant-id az ad sp create-for-rbac から返される JSON の tenant です。
  2. ファイルを保存して閉じます。

  3. エディターで src/main/java/com/contoso/keyvault/KeyvaultApplication.java を開きます。

  4. 次の import ステートメントを追加します。

    import org.springframework.beans.factory.annotation.Value;
    
  5. connectionString インスタンス変数に次の注釈を追加します。

    @Value("${connectionString}")
    private String connectionString;
    
  6. Bash ウィンドウを開き、pom.xml ファイルが配置されている最上位の keyvault ディレクトリに移動します。

  7. 次のコマンドを入力します。

    mvn clean package spring-boot:run
    

    コマンドによって initialization completed が出力されます。これは、サーバーの準備ができていることを示します。

  8. 別の Bash ウィンドウで、次のコマンドを入力します。

    curl http://localhost:8080/get
    

    出力には defaultValue でなく jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE が表示されます。

  9. mvn spring-boot:run から実行されているプロセスを強制終了します。 Ctrl + C キーを押すか、jps コマンドを使用して Launcher プロセスの PID を取得し、強制終了することができます。

Azure App Service に配置する

以下の手順では、KeyvaultApplication を Azure App Service にデプロイする方法を紹介します。

  1. 最上位の keyvault ディレクトリで、pom.xml ファイルを開きます。

  2. <build><plugins> セクションで、次の XML を挿入して azure-webapp-maven-plugin を追加します。

    <plugin>
      <groupId>com.microsoft.azure</groupId>
      <artifactId>azure-webapp-maven-plugin</artifactId>
      <version>2.5.0</version>
    </plugin>
    

    注意

    書式設定について心配しないでください。 azure-webapp-maven-plugin は、このプロセス中に POM 全体を再フォーマットします。

  3. pom.xml ファイルを保存して閉じます

  4. コマンド ラインで、次のコマンドを使用して新しく追加したプラグインの config ゴールを呼び出します。

    mvn azure-webapp:config
    

    Maven プラグインによっていくつかの質問が表示され、回答に基づいて pom.xml ファイルが編集されます。 次の値を使用します。

    • [Subscription] では、作成した Key Vault と同じサブスクリプション ID が選択されていることを確認してください。
    • [Web App] では、既存の Web アプリを選択するか、<create> を選択して新規作成します。 既存の Web アプリを選択した場合、最後の [confirm] ステップに直接ジャンプします。
    • [OS] は、必ず [linux] を選択してください。
    • [javaVersion] では、Spring Initializr で選択した Java のバージョンが選択されていることを確認します。 このチュートリアルでは、バージョン 11 を使用します。
    • 残りの質問については既定値を受け入れます。
    • 確認を求められたら、Y と答えて続行するか、N で質問への回答を再び開始します。 プラグインの実行が完了すると、POM を編集できるようになります。
  5. 次に、エディターで変更した pom.xml を開きます。 ファイルの内容は次の XML のようになります。 前の手順でまだ値を指定していない場合は、次のプレースホルダーを指定された値に置き換えます。

    • YOUR_SUBSCRIPTION_ID: このプレースホルダーは、以前に提供された ID の場所を示しています。
    • YOUR_RESOURCE_GROUP_NAME: このプレースホルダーを、Key Vault の作成時に指定した値に置き換えます。
    • YOUR_APP_NAME: このプレースホルダーを、サブスクリプション内で一意の適切な値に置き換えます。
    • YOUR_REGION: このプレースホルダーを、Key Vault の作成時に指定した値に置き換えます。
    • APP_SETTINGS: 例から指定された <appSettings> 要素を例からコピーし、pom.xml ファイル内のその場所に貼り付けます。 このように設定すると、サーバーが TCP ポート 80 をリッスンするようになります。
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-webapp-maven-plugin</artifactId>
        <version>2.5.0</version>
        <configuration>
          <schemaVersion>V2</schemaVersion>
          <subscriptionId>YOUR_SUBSCRIPTION_ID</subscriptionId>
          <resourceGroup>YOUR_RESOURCE_GROUP_NAME</resourceGroup>
          <appName>YOUR_APP_NAME</appName>
          <pricingTier>P1v2</pricingTier>
          <region>YOUR_REGION</region>
          <runtime>
            <os>linux</os>
            <javaVersion>java 11</javaVersion>
            <webContainer>Java SE</webContainer>
          </runtime>
          <!-- start of APP_SETTINGS -->
          <appSettings>
            <property>
              <name>JAVA_OPTS</name>
              <value>-Dserver.port=80</value>
            </property>
          </appSettings>
          <!-- end of APP_SETTINGS -->
          <deployment>
            <resources>
              <resource>
                <directory>${project.basedir}/target</directory>
                <includes>
                  <include>*.jar</include>
                </includes>
              </resource>
            </resources>
          </deployment>
        </configuration>
      </plugin>
    </plugins>
    
  6. POM を保存して閉じます。

  7. 次のコマンドを使用して、Azure App Service にアプリをデプロイします。

    mvn -DskipTests clean package azure-webapp:deploy
    

    ユーザーが制御できない多くの要因により、コマンドの実行に数分かかることがあります。 次の例のような出力が表示された場合は、アプリが正常にデプロイされていることを示しています。

    [INFO] Deploying the zip package contosokeyvault-22b7c1a3-b41b-4082-a9f0-9339723fa36a11893059035499017844.zip...
    [INFO] Successfully deployed the artifact to https://contosokeyvault.azurewebsites.net
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  01:45 min
    [INFO] Finished at: 2020-08-16T22:47:48-04:00
    [INFO] ------------------------------------------------------------------------
    
  8. デプロイが完了するまで 3 から 5 分待ちます。 その後、前に示したのと同様の curl コマンドを使用してデプロイにアクセスできますが、今回は BUILD SUCCESS 出力に示されているホスト名を使用します。 次の例では、上の出力に示されているように contosokeyvault を使用します。

    curl https://contosokeyvault.azurewebsites.net/get
    

    次の出力は成功したことを示しています。

    jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE;
    

これで、Azure App Service にアプリがデプロイされました。

Azure App Service に再デプロイして Azure リソース用マネージド ID を使用する

このセクションでは、アプリの Azure リソースに ID を関連付ける方法について説明します。 この関連付けは、Azure でセキュリティを適用し、アクセスを追跡できるようにするために必要になります。

クラウド コンピューティングの基本原則の 1 つは、使用したリソースに対してのみ料金を支払うことです。 このような細かいリソースの追跡は、すべてのリソースが ID に関連付けられている場合にのみ可能です。 Azure App Service と Azure Key Vault は、Azure リソース用マネージド ID を利用する多くの Azure サービスのうちの 2 つです。 この重要なテクノロジーの詳細については、「Azure リソース用マネージド ID とは何か」を参照してください。

注意

"Azure リソース用マネージド ID" は、以前にマネージド サービス ID (MSI) と呼ばれていたサービスの新しい名前です。

次の手順を使用して、Azure App Service アプリのマネージド ID を作成し、その ID で Key Vault にアクセスできるようにします。

  1. App Service アプリのマネージド ID を作成します。 <your resource group name> および <your app name> のプレースホルダーを、pom.xml ファイルの <resourceGroup> 要素と <appName> 要素の値に置き換えます。

    az webapp identity assign --resource-group <your resource group name> --name <your app name>
    

    出力は次の例のようになります。 次の手順のために principalId の値をメモしておきます。

    {
      "principalId": "<your principal ID>",
      "tenantId": "<your tenant ID>",
      "type": "SystemAssigned",
      "userAssignedIdentities": null
    }
    
  2. application.properties を編集して、前の手順で作成した Azure リソース用マネージド ID に名前を付けます。

    1. spring.cloud.azure.keyvault.secret.property-sources[0].credential.client-secret を削除します。
    2. spring.cloud.azure.keyvault.secret.property-sources[0].credential.client-id を更新して、前のステップの principalId の値にします。 完成したファイルは、次の例のようになります。
    spring.cloud.azure.keyvault.secret.property-source-enabled=true
    spring.cloud.azure.keyvault.secret.property-sources[0].credential.client-id=<your principal ID>
    spring.cloud.azure.keyvault.secret.property-sources[0].credential.managed-identity-enabled=true
    spring.cloud.azure.keyvault.secret.property-sources[0].profile.tenant-id=<your tenant ID>
    spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=https://contosokv.vault.azure.net/
    
  3. Key Vault を構成して、そのマネージド ID からの getlist の操作を許可します。 object-id の値は、前の出力からの principalId です。

    az keyvault set-policy \
        --name <your Key Vault name> \
        --object-id <your principal ID> \
        --secret-permissions get list
    

    出力は、Key Vault に関する完全な情報を含む JSON オブジェクトになります。 Microsoft.KeyVault/vaults の値を持つ type エントリがあります。

    次の表では、上記のプロパティについて説明します。

    パラメーター 説明
    name Key Vault の名前。
    object-id 前のコマンドからの principalId
    secret-permissions 名前付きプリンシパルからの許可する操作の一覧。
  4. アプリケーションをパッケージ化して再度デプロイします。

    mvn -DskipTests clean package azure-webapp:deploy
    
  5. さらに、デプロイが完了するまで数分待ちます。 その後、前に示したのと同様の curl コマンドを使用してデプロイにコンタクトできますが、今回は BUILD SUCCESS 出力に示されているホスト名を使用します。 次の例では、前のセクションの BUILD SUCCESS 出力に示されているように contosokeyvault を使用します。

    curl https://contosokeyvault.azurewebsites.net/get
    

    次の出力は成功したことを示しています。

    jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE;
    

アプリは defaultValue を返すのではなく、Key Vault から connectionString を取得します。

Azure Spring Apps にデプロイする

このセクションでは、アプリを Azure Spring Apps にデプロイします。

Azure Spring Apps は、Azure で Spring Boot アプリケーションをデプロイして実行するためのフル マネージド プラットフォームです。 Azure Spring Apps の概要については、「Azure Spring Apps とは」を参照してください。

このセクションでは、以前に作成した Spring Boot アプリと Key Vault、そして Azure Spring Apps の新しいインスタンスを使用します。

次の手順では、Azure Spring Apps リソースを作成し、それにアプリをデプロイする方法を示します。 前提条件に示されているように、Azure Spring Apps の Azure CLI 拡張機能がインストールされていることを確認してください。

  1. サービス インスタンスの名前を決定します。 Azure サブスクリプション内で Azure Spring Apps を使用するには、Azure Spring Apps の種類の Azure リソースを作成する必要があります。 他のすべての Azure リソースと同様に、サービス インスタンスはリソース グループ内に維持されている必要があります。 作成済みのリソース グループを使用して、サービス インスタンスを保持し、Azure Spring Apps インスタンスの名前を選択します。 次のコマンドを使って、サービス プリンシパルを作成します。

    az spring-cloud create --resource-group <your resource group name> --name <your Azure Spring Apps instance name>
    

    このコマンドは、完了するまでに数分かかります。

  2. サービス内に Spring Cloud アプリを作成します。

    az spring-cloud app create \
        --resource-group <your resource group name> \
        --service <your Azure Spring Apps instance name> \
        --name <your app name> \
        --assign-identity \
        --is-public true \
        --runtime-version Java_11 \
    

    次の表では、上記のオプションについて説明します。

    パラメーター 説明
    resource-group 既存のサービス インスタンスを作成したリソース グループの名前。
    サービス (service) 既存のサービスの名前です。
    name アプリの名前。
    assign-identity サービスによって、Azure リソース用マネージド ID の ID が作成されます。
    is-public パブリック DNS ドメイン名をサービスに割り当てます。
    runtime-version Java ランタイム バージョン。 値は、上記の Spring Initializr で選択した値と一致する必要があります。

    "サービス" と "アプリ" の違いを理解するには、「Azure Spring Apps でのアプリとデプロイ」を参照してください。

  3. 次のコマンドを使用して、Azure リソース用マネージド ID を取得し、それを使用して既存の Key Vault を構成して、このアプリからのアクセスを許可します。

    SERVICE_IDENTITY=$(az spring-cloud app show --resource-group "contosorg" --name "contosoascsapp" --service "contososvc" | jq -r '.identity.principalId')
    az keyvault set-policy \
        --name <your Key Vault name> \
        --object-id <the value of the environment variable SERVICE_IDENTITY> \
        --secret-permissions set get list
    
  4. 既存の Spring Boot アプリには、必要な構成を行った application.properties ファイルが既に存在するため、次のコマンドを使用して、Spring Cloud にこのアプリを直接デプロイできます。 POM が格納されているディレクトリでコマンドを実行します。

    az spring-cloud app deploy \
        --resource-group <your resource group name> \
        --name <your Spring Cloud app name> \
        --jar-path target/keyvault-0.0.1-SNAPSHOT.jar \
        --service <your Azure Spring Apps instance name>
    

    このコマンドは、サービス内のアプリ内に "デプロイ" を作成します。 サービス インスタンス、アプリ、デプロイの概念の詳細については、「Azure Spring Apps でのアプリとデプロイ」を参照してください。

    デプロイが正常に完了しない場合は、「アプリケーション ログの構成」の説明に従って、トラブルシューティング用のログを構成します。 ログには、問題の診断と解決に役立つ情報が含まれている可能性があります。

  5. アプリが正常にデプロイされたら、curl を使用して Key Vault 統合が機能していることを確認できます。 --is-public を指定したため、サービスの既定の URL は https://<your Azure Spring Apps instance name>-<your app name>.azuremicroservices.io/ です。 次のコマンドは、サービス インスタンス名が contososvc で、アプリ名が contosoascsapp の場合の例を示しています。 URL は @GetMapping 注釈の値を追加します。

    curl https://contososvc-contosoascsapp.azuremicroservices.io/get
    

    出力には jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE が表示されます。

まとめ

このチュートリアルでは、Spring Initializr を使用して新しい Java Web アプリケーションを作成しました。 次に、機密情報を格納する Azure Key Vault を作成し、Key Vault から情報を取得するようにアプリケーションを構成しました。 ローカルでテストした後、Azure App Service と Azure Spring Apps にアプリをデプロイしました。

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

このチュートリアルで作成した Azure リソースの使用が完了したら、次のコマンドを使用して削除できます。

az group delete --name <your resource group name>

次のステップ