マネージド ID を使用して Azure Spring Apps を Key Vault に接続する
Note
Basic、Standard、Enterprise プランは、2025 年 3 月中旬以降非推奨になり、廃止期間は 3 年間です。 Azure Container Apps に移行することをお勧めします。 詳細については、「Azure Spring Apps の廃止のお知らせ」を参照してください。
Standard 従量課金と専用プランは、2024 年 9 月 30 日以降に非推奨になり、6 か月後に完全にシャットダウンされます。 Azure Container Apps に移行することをお勧めします。 詳細については、「Azure Spring Apps の Standard 従量課金および専用プランを Azure Container Apps に移行する」を参照してください。
この記事の適用対象: ✔️ 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}
次の例では、--system-assigned
パラメーターの要求どおりに、システム割り当てマネージド ID を持つアプリを作成します:
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 に格納されているシークレットは、ファイル内のプロパティなどの外部化された構成プロパティと同様に、簡単にアクセスして使用できます。
次のコマンドを使用して、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 -
対象のアプリで使用するキー コンテナーを指定します。
cd springapp vim src/main/resources/application.properties
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 が実行時に取得されない場合があります。
次のコード例を src/main/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>
次のコマンドを使用して、Azure Spring Apps にアプリをデプロイします:
az spring app deploy \ --resource-group ${RESOURCE_GROUP} \ --service ${SPRING_APPS} \ --name ${APP} \ --source-path
次のコマンドを使用して、Azure Spring Apps にアプリをデプロイします:
az spring app deploy \ --resource-group ${RESOURCE_GROUP} \ --service ${SPRING_APPS} \ --name ${APP} \ --source-path \ --build-env BP_JVM_VERSION=17
アプリをテストするために、次のコマンドを使用して、パブリック エンドポイントまたはテスト エンドポイントにアクセスします。
curl https://${SPRING_APPS}-${APP}.azuremicroservices.io/get
応答本文で次のメッセージが返されます:
jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE;
。
リソースをクリーンアップする
次のコマンドを使用して、新しく作成したサービス インスタンスを含むリソース グループ全体を削除します。
az group delete --name ${RESOURCE_GROUP} --yes