Share via


マネージド ID を使用して Azure Spring Apps を Key Vault に接続する

Note

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

この記事の適用対象: ✔️ Java ❌ C#

この記事では、Azure Spring Apps にデプロイされたアプリのシステム割り当てマネージド ID またはユーザー割り当てマネージド ID を作成し、それを使用して Azure Key Vault にアクセスする方法について説明します。

Azure Key Vault を使用すると、対象のアプリのトークン、パスワード、証明書、API キー、その他のシークレットを安全に格納し、それらへのアクセスを厳密に制御できます。 Microsoft Entra ID でマネージド ID を作成したうえで、Key Vault を含め、Microsoft Entra 認証をサポートする任意のサービスに対して認証を行うことができます。資格情報をコードに表示する必要はありません。

次のビデオでは、Azure Key Vault を使用してシークレットを管理する方法について説明します。


前提条件

  • Azure サブスクリプション。 サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
  • ターゲット サブスクリプションで初めて Azure Spring Apps Enterprise プラン インスタンスをデプロイする場合は、「Azure Marketplace の Enterprise プラン」の「要件」セクションを参照してください。
  • Azure CLI バージョン 2.55.0 以降。
  • Azure サブスクリプション。 サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
  • Azure CLI バージョン 2.55.0 以降。

各リソースの名前を指定する

次のコマンドを使用して、リソースを保持する変数を作成します。 プレースホルダーは必ず、独自の値で置き換えてください。

export LOCATION=<location>
export RESOURCE_GROUP=myresourcegroup
export SPRING_APPS=myasa
export APP=springapp-system
export KEY_VAULT=<your-keyvault-name>

リソース グループを作成する

リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。 次の例に示すように、az group create コマンドを使用して 、Key Vault と Spring Cloud の両方を含むリソース グループを作成 します。

az group create --name ${RESOURCE_GROUP} --location ${LOCATION}

キー コンテナーを設定する

Key Vault を作成するには、次の 例に示すように az keyvault create コマンドを使用します。

重要

各キー コンテナーには一意の名前が必要です。

az keyvault create \
    --resource-group ${RESOURCE_GROUP} \
    --name ${KEY_VAULT}

次のコマンドを使用してアプリの URL を表示し、返された URL の形式 https://${KEY_VAULT}.vault.azure.netを書き留めます。 この値は、次の手順で使用します。

az keyvault show \
    --resource-group ${RESOURCE_GROUP} \
    --name ${KEY_VAULT} \
    --query properties.vaultUri --output tsv

次の例に示すように、az keyvault secret set コマンドを使用して、Key Vault にシークレットを配置できるようになりました。

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

Azure Spring Apps サービスおよびアプリを作成する

対応するすべての拡張機能をインストールしたら、次のコマンドを使用して Azure Spring Apps インスタンスを作成します。

az extension add --upgrade --name spring
az spring create \
    --resource-group ${RESOURCE_GROUP} \
    --sku Enterprise \
    --name ${SPRING_APPS}

次の例では、パラメーターの要求に従って、システム割り当てマネージド ID を使用してアプリを --system-assigned 作成します。

az spring app create \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --assign-endpoint true \
    --system-assigned
export MANAGED_IDENTITY_PRINCIPAL_ID=$(az spring app show \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --query identity.principalId --output tsv)
az extension add --upgrade --name spring
az spring create \
    --resource-group ${RESOURCE_GROUP} \
    --name ${SPRING_APPS}

次の例では、--system-assigned パラメーターの要求どおりに、システム割り当てマネージド ID を持つ springapp という名前のアプリを作成します。

az spring app create \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --assign-endpoint true \
    --runtime-version Java_17 \
    --system-assigned
export MANAGED_IDENTITY_PRINCIPAL_ID=$(az spring app show \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --query identity.principalId --output tsv)

Key Vault へのアクセス許可をアプリに付与する

次のコマンドを使用して、Key Vault への適切なアクセス権をアプリに付与します。

az keyvault set-policy \
    --name ${KEY_VAULT} \
    --object-id ${MANAGED_IDENTITY_PRINCIPAL_ID} \
    --secret-permissions set get list

Note

システム割り当てマネージド ID の場合は、システム割り当てマネージド ID が無効になった後、アプリのアクセスを削除するために使用 az keyvault delete-policy --name ${KEY_VAULT} --object-id ${MANAGED_IDENTITY_PRINCIPAL_ID} します。

Spring Boot スターターを使用してサンプルの Spring Boot アプリをビルドする

このアプリには、Azure Key Vault からシークレットを取得するためのアクセス権があります。 Azure Key Vault Secrets Spring ブート スターターを使用します。 Azure Key Vault は、Spring PropertySource のインスタンスとして追加されます。 Azure Key Vault に格納されているシークレットは、ファイル内のプロパティなどの外部化された構成プロパティと同様に、簡単にアクセスして使用できます。

  1. 次のコマンドを使用して、Azure Key Vault Spring スターターで start.spring.io からサンプル プロジェクトを生成します。

    curl https://start.spring.io/starter.tgz -d dependencies=web,azure-keyvault -d baseDir=springapp -d bootVersion=3.2.1 -d javaVersion=17 -d type=maven-project | tar -xzvf -
    
  2. 対象のアプリで使用するキー コンテナーを指定します。

    cd springapp
    vim src/main/resources/application.properties
    
  3. Azure Spring Apps にデプロイされたアプリでマネージド ID を使用するには、次の内容のプロパティを src/main/resources/application.properties ファイルに追加します。

    spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=<your-keyvault-url>
    spring.cloud.azure.keyvault.secret.property-sources[0].credential.managed-identity-enabled=true
    

    Note

    前に示されているように、application.properties ファイルにキー コンテナーの URL を追加する必要があります。 そうしないと、キー コンテナーの URL が実行時に取得されない場合があります。

  4. src/メイン/java/com/example/demo/DemoApplication.java を次のコード例で更新します。 このコードは、Key Vault から接続文字列を取得します。

    package com.example.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestController
    public class DemoApplication implements CommandLineRunner {
    
        @Value("${connectionString}")
        private String connectionString;
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @GetMapping("get")
        public String get() {
            return connectionString;
        }
    
        public void run(String... args) throws Exception {
            System.out.println(String.format("\nConnection String stored in Azure Key Vault:\n%s\n",connectionString));
        }
    }
    

    pom.xml ファイルを開くと、次の例に示すように spring-cloud-azure-starter-keyvault 依存関係を確認できます。

    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-keyvault</artifactId>
    </dependency>
    
  1. 次のコマンドを使用して、アプリを Azure Spring Apps にデプロイします。

    az spring app deploy \
        --resource-group ${RESOURCE_GROUP} \
        --service ${SPRING_APPS} \
        --name ${APP} \
        --source-path
    
  1. 次のコマンドを使用して、アプリを Azure Spring Apps にデプロイします。

    az spring app deploy \
        --resource-group ${RESOURCE_GROUP} \
        --service ${SPRING_APPS} \
        --name ${APP} \
        --source-path \
        --build-env BP_JVM_VERSION=17
    
  1. アプリをテストするために、次のコマンドを使用して、パブリック エンドポイントまたはテスト エンドポイントにアクセスします。

    curl https://${SPRING_APPS}-${APP}.azuremicroservices.io/get
    

    次のメッセージが応答本文 jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE;で返されます。

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

次のコマンドを使用して、新しく作成されたサービス インスタンスを含むリソース グループ全体を削除します。

az group delete --name ${RESOURCE_GROUP} --yes

次のステップ