チュートリアル: Azure Container Apps で Spring 用マネージド管理に接続する
Spring 用マネージド管理コンポーネントは、アクチュエータ エンドポイントを公開する Spring Boot Web アプリケーション用の管理インターフェイスを提供します。 Azure Container Apps のマネージド コンポーネントとして、シームレスな統合と管理のために、コンテナー アプリを Spring 用管理に簡単にバインドできます。
このチュートリアルでは、Spring 用管理 Java コンポーネントを作成し、それをコンテナー アプリにバインドして、Spring アプリケーションを簡単に監視および管理できるようにする方法について説明します。
このチュートリアルでは、次の作業を行う方法について説明します。
- Spring 用管理 Java コンポーネントを作成します。
- Spring 用管理 Java コンポーネントにコンテナー アプリをバインドします。
Spring 用管理と Spring 用 Eureka サーバーを統合する場合は、代わりに、Azure Container Apps での Spring 用管理の Spring 用 Eureka サーバーとの統合に関する記事を参照してください。
重要
このチュートリアルでは、Azure の請求書に影響する可能性のあるサービスを使用します。 手順に従う場合は、予期しない課金を回避するために、この記事で紹介されているリソースを必ず削除してください。
前提条件
考慮事項
Container Apps で Spring 用管理コンポーネントを実行する場合は、次の詳細に注意してください。
項目 | 説明 |
---|---|
範囲 | コンポーネントは、接続されているコンテナー アプリと同じ環境で実行されます。 |
スケーリング | コンポーネントのスケーリングはできません。 スケーリング プロパティ minReplicas と maxReplicas は両方とも 1 に設定されています。 |
リソース | コンポーネントのコンテナー リソースの割り当ては固定されています。 CPU コア数は 0.5、メモリ サイズは 1 Gi です。 |
価格 | コンポーネント課金は消費ベースの価格設定によります。 マネージド コンポーネントによって消費されるリソースは、アクティブ/アイドル レートで課金されます。 課金を停止するために、使用しなくなったコンポーネントを削除できます。 |
バインド | コンテナー アプリは、バインドを使用してコンポーネントに接続します。 バインドは、コンテナー アプリの環境変数に構成を注入します。 バインドが確立されると、コンテナー アプリは環境変数から構成値を読み取ってコンポーネントに接続できます。 |
セットアップ
Spring 用管理コンポーネントの操作を開始する前に、まず、必要なリソースを作成する必要があります。
次のコマンドは、リソース グループとコンテナー アプリ環境を作成するのに役立ちます。
アプリケーション構成をサポートする変数を作成します。 これらの値は、このレッスンのために提供されています。
export LOCATION=eastus export RESOURCE_GROUP=my-resource-group export ENVIRONMENT=my-environment export JAVA_COMPONENT_NAME=admin export APP_NAME=sample-admin-client export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-admin-for-spring-client:latest"
変数 説明 LOCATION
コンテナー アプリと Java コンポーネントを作成する Azure リージョンの場所。 ENVIRONMENT
デモ アプリケーションのコンテナー アプリ環境名。 RESOURCE_GROUP
デモ アプリケーションの Azure リソース グループ名。 JAVA_COMPONENT_NAME
コンテナー アプリ用に作成された Java コンポーネントの名前。 この場合は、Spring 用管理 Java コンポーネントを作成します。 IMAGE
コンテナー アプリで使用されるコンテナー イメージ。 Azure CLI を使用して Azure にサインインします。
az login
リソース グループを作成する。
az group create \ --name $RESOURCE_GROUP \ --location $LOCATION \ --query "properties.provisioningState"
--query
パラメーターを使用すると、応答がフィルター処理され、単純な成功または失敗のメッセージになります。コンテナー アプリ環境を作成します。
az containerapp env create \ --name $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --location $LOCATION
コンポーネントを使用する
既存の環境が作成されたので、コンテナー アプリを作成し、Spring 用管理の Java コンポーネント インスタンスにバインドできます。
Spring 用管理 Java コンポーネントを作成します。
az containerapp env java-component admin-for-spring create \ --environment $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --name $JAVA_COMPONENT_NAME \ --min-replicas 1 \ --max-replicas 1
Spring 用管理 Java コンポーネントを更新します。
az containerapp env java-component admin-for-spring update \ --environment $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --name $JAVA_COMPONENT_NAME \ --min-replicas 2 \ --max-replicas 2
Spring 用管理 Java コンポーネントにコンテナー アプリをバインドする
コンテナー アプリを作成し、Spring 用管理コンポーネントにバインドします。
az containerapp create \ --name $APP_NAME \ --resource-group $RESOURCE_GROUP \ --environment $ENVIRONMENT \ --image $IMAGE \ --min-replicas 1 \ --max-replicas 1 \ --ingress external \ --target-port 8080 \ --bind $JAVA_COMPONENT_NAME
バインド操作は、コンテナー アプリを Spring 用管理 Java コンポーネントにバインドします。 コンテナー アプリは、環境変数 (主に SPRING_BOOT_ADMIN_CLIENT_URL
プロパティ) から構成値を読み取り、Spring 用管理コンポーネントに接続できるようになりました。
バインドでは、次のプロパティも注入されます。
"SPRING_BOOT_ADMIN_CLIENT_INSTANCE_PREFER-IP": "true",
このプロパティは、Spring 用管理コンポーネントのクライアントが、Spring 用管理サーバーに接続するときにコンテナー アプリ インスタンスの IP アドレスを優先する必要があることを示します。
オプション: Spring 用管理 Java コンポーネントからコンテナー アプリのバインドを解除する
コンテナー アプリからバインドを削除するには、--unbind
オプションを使用します。
az containerapp update \
--name $APP_NAME \
--unbind $JAVA_COMPONENT_NAME \
--resource-group $RESOURCE_GROUP
ダッシュボードを表示する
重要
ダッシュボードを表示するには、少なくとも Microsoft.App/managedEnvironments/write
ロールがマネージド環境リソースのアカウントに割り当てられている必要があります。 リソースに Owner
ロールまたは Contributor
ロールを明示的に割り当てられます。 また、手順に従ってカスタム ロール定義を作成し、アカウントに割り当てることもできます。
カスタム ロール定義を作成します。
az role definition create --role-definition '{ "Name": "<ROLE_NAME>", "IsCustom": true, "Description": "Can access managed Java Component dashboards in managed environments", "Actions": [ "Microsoft.App/managedEnvironments/write" ], "AssignableScopes": ["/subscriptions/<SUBSCRIPTION_ID>"] }'
<>
かっこの間にあるプレースホルダーを実際の値に置き換えてください。マネージド環境リソースのアカウントにカスタム ロールを割り当てます。
マネージド環境のリソース ID を取得します。
export ENVIRONMENT_ID=$(az containerapp env show \ --name $ENVIRONMENT --resource-group $RESOURCE_GROUP \ --query id \ --output tsv)
ユーザー アカウントにそのロールを割り当てます。
このコマンドを実行する前に、プレースホルダー (
<>
かっこで示される) を、自分のユーザーまたはサービス プリンシパル ID またはロール名に置き換えます。az role assignment create \ --assignee <USER_OR_SERVICE_PRINCIPAL_ID> \ --role "<ROLE_NAME>" \ --scope $ENVIRONMENT_ID
Note
<USER_OR_SERVICE_PRINCIPAL_ID>
値は、Azure portal へのアクセスに使用する ID である必要があります。<ROLE_NAME>
値は、手順 1 で割り当てた名前です。Spring 用管理ダッシュボードの URL を取得します。
az containerapp env java-component admin-for-spring show \ --environment $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --name $JAVA_COMPONENT_NAME \ --query properties.ingress.fqdn \ --output tsv
このコマンドは、Spring 用管理ダッシュボードにアクセスするために使用できる URL を返します。 ダッシュボードを使用すると、次のスクリーンショットに示すように、コンテナー アプリも表示できます。
リソースをクリーンアップする
このチュートリアルで作成したリソースは、Azure の請求書に影響します。 これらのサービスを長期間使用しない場合は、次のコマンドを実行して、このチュートリアルで作成したすべてのものを削除してください。
az group delete --resource-group $RESOURCE_GROUP
依存関係
独自のコンテナー アプリで管理コンポーネントを使用する場合は、pom.xml ファイルに次の依存関係を追加する必要があります。 Maven リポジトリで、バージョン番号を最新のバージョンに置き換えます。
<dependency>
<groupId>de.codecentric</groupId>
<version>3.3.2</version>
<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>
構成プロパティ
Spring Boot 2 以降では、health
と info
以外のエンドポイントは、既定では公開されません。 これらは、application.properties ファイルに次の構成を追加して公開できます。
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
Spring 用管理で許可される構成の一覧
次の一覧は、アプリ用に構成できる管理コンポーネントのプロパティについて詳しく説明したものです。 詳細については、Spring Boot 管理者に関する記事を参照してください。
プロパティ名 | 説明 | 規定値 |
---|---|---|
spring.boot.admin.server.enabled |
Spring Boot Admin サーバーを有効にします。 | true |
spring.boot.admin.context-path |
管理サーバーの静的アセットと API が提供されるパス プレフィックス。 Dispatcher-Servlet に相対します。 | |
spring.boot.admin.monitor.status-interval |
インスタンスの状態を確認する時間間隔 (ミリ秒)。 | 10,000ms |
spring.boot.admin.monitor.status-lifetime |
状態の有効期間 (ミリ秒)。 最後の状態が期限切れでない限り、状態は更新されません。 | 10,000 ms |
spring.boot.admin.monitor.info-interval |
インスタンスの情報を確認する時間間隔 (ミリ秒)。 | 1m |
spring.boot.admin.monitor.info-lifetime |
情報の有効期間 (分単位)。 最後の情報が期限切れでない限り、情報は更新されません。 | 1m |
spring.boot.admin.monitor.default-timeout |
要求を行うときの既定のタイムアウト。 特定のエンドポイントの個々の値は、spring.boot.admin.monitor.timeout.* を使用してオーバーライドできます。 |
10,000 |
spring.boot.admin.monitor.timeout.* |
endpointId ごとのタイムアウトのキーと値のペア。 |
既定値は default-timeout 値です。 |
spring.boot.admin.monitor.default-retries |
失敗した要求を再試行する既定の回数。 データを変更する要求 (PUT 、POST 、PATCH 、DELETE ) は再試行されません。 特定のエンドポイントの個々の値は、spring.boot.admin.monitor.retries.* を使用してオーバーライドできます。 |
0 |
spring.boot.admin.monitor.retries.* |
endpointId ごとの再試行回数のキーと値のペア。 データを変更する要求 (PUT 、POST 、PATCH 、DELETE ) は再試行されません。 |
既定値は default-retries 値です。 |
spring.boot.admin.metadata-keys-to-sanitize |
すべての JSON 出力でサニタイズするために使用されるこれらの正規表現パターンに一致するキーのメタデータ値。 既定では、Spring Boot 3 以降で、すべてのアクチュエータ値がマスクされます。 非サニタイズ プロセスを構成する方法の詳細については、機密値のサニタイズに関するページを参照してください。 | ".*password$", ".*secret$", ".*key$", ".*token$", ".*credentials.*", ".*vcap_services$" |
spring.boot.admin.probed-endpoints |
Spring Boot 1.x クライアント アプリケーションの場合は、Spring Boot 管理者が OPTIONS 要求を使用して、指定されたエンドポイントのプローブを実行します。 パスが ID と異なる場合は、この値を id:path として指定できます (例: health:ping )。 |
"health", "env", "metrics", "httptrace:trace", "threaddump:dump", "jolokia", "info", "logfile", "refresh", "flyway", "liquibase", "heapdump", "loggers", "auditevents" |
spring.boot.admin.instance-proxy.ignored-headers |
クライアントに要求を行うときに転送されないヘッダー。 | "Cookie", "Set-Cookie", "Authorization" |
spring.boot.admin.ui.title |
表示されるページ タイトル。 | "Spring Boot Admin" |
spring.boot.admin.ui.poll-timer.cache |
新しいキャッシュ データをフェッチするためのポーリング期間 (ミリ秒)。 | 2500 |
spring.boot.admin.ui.poll-timer.datasource |
新しいデータ ソースのデータをフェッチするためのポーリング期間 (ミリ秒)。 | 2500 |
spring.boot.admin.ui.poll-timer.gc |
新しい GC データをフェッチするためのポーリング期間 (ミリ秒)。 | 2500 |
spring.boot.admin.ui.poll-timer.process |
新しいプロセス データをフェッチするためのポーリング期間 (ミリ秒)。 | 2500 |
spring.boot.admin.ui.poll-timer.memory |
新しいメモリ データをフェッチするためのポーリング期間 (ミリ秒)。 | 2500 |
spring.boot.admin.ui.poll-timer.threads |
新しいスレッド データをフェッチするためのポーリング期間 (ミリ秒)。 | 2500 |
spring.boot.admin.ui.poll-timer.logfile |
新しい logfile データをフェッチするためのポーリング期間 (ミリ秒)。 | 1000 |
spring.boot.admin.ui.enable-toasts |
トースト通知を有効または無効にします。 | false |
spring.boot.admin.ui.title |
ブラウザーのウィンドウ タイトル値。 | "" |
spring.boot.admin.ui.brand |
ナビゲーション ヘッダーにレンダリングされる HTML コード。既定では Spring Boot Admin ラベルが使用されます。 既定では、Spring Boot 管理ロゴの後にその名前が付けられます。 | "" |
management.scheme |
アクチュエータ エンドポイントへのアクセスに使用されるサービス URL で置き換えられる値。 | |
management.address |
アクチュエータ エンドポイントへのアクセスに使用されるサービス URL で置き換えられる値。 | |
management.port |
アクチュエータ エンドポイントへのアクセスに使用されるサービス URL で置き換えられる値。 | |
management.context-path |
アクチュエータ エンドポイントへのアクセスに使用されるサービス URL に追加される値。 | ${spring.boot.admin.discovery.converter.management-context-path} |
health.path |
正常性チェックに使用されるサービス URL に追加される値。 EurekaServiceInstanceConverter によって無視されます。 |
${spring.boot.admin.discovery.converter.health-endpoint} |
spring.boot.admin.discovery.enabled |
管理サーバーの DiscoveryClient サポートを有効にします。 |
true |
spring.boot.admin.discovery.converter.management-context-path |
management-url 値が DefaultServiceInstanceConverter によって変換されるときに、検出されたサービスの service-url に追加される値。 |
/actuator |
spring.boot.admin.discovery.converter.health-endpoint-path |
health-url 値が DefaultServiceInstanceConverter によって変換されるときに、検出されたサービスの management-url に追加される値。 |
"health" |
spring.boot.admin.discovery.ignored-services |
検出を使用するときに無視され、アプリケーションとして登録されないサービス。 "foo*" 、"*bar" 、"foo*bar*" などの単純なパターンをサポートします。 |
|
spring.boot.admin.discovery.services |
検出を使用するときに含まれ、アプリケーションとして登録されるサービス。 "foo*" 、"*bar" 、"foo*bar*" などの単純なパターンをサポートします。 |
"*" |
spring.boot.admin.discovery.ignored-instances-metadata |
この一覧のパターンに一致するメタデータ項目が少なくとも 1 つ含まれている場合に無視されるサービス。 "discoverable=false" などのパターンをサポートします。 |
|
spring.boot.admin.discovery.instances-metadata |
一覧のパターンに一致するメタデータ項目が少なくとも 1 つ含まれている場合に含まれるサービス。 "discoverable=true" などのパターンをサポートします。 |
一般的な構成
- ログ関連の構成:
- logging.level.*
- logging.group.*
logging.*
名前空間のその他の構成は禁止にする必要があります。 たとえば、logging.file
を使用したログ ファイルの書き込みは禁止する必要があります。