Config Server for Spring は、構成データを複数のアプリケーションで使用できるようにするための一元的な場所を提供します。 この記事では、Azure Container Apps でホストされているアプリを、Java Config Server for Spring インスタンスに接続する方法について説明します。
Spring Java コンポーネントの Config Server は、構成設定のソースとしてGitHub リポジトリを使用します。 構成値は、コンポーネントとコンテナー アプリの間のバインドを介して、コンテナー アプリで利用できるようになります。 構成サーバーで値を変更すると、その値は自動的にアプリケーションに反映され、アプリケーションを再コンパイルしたり再デプロイしたりする必要はありません。
このチュートリアルで学習する内容は次のとおりです。
- Spring Java コンポーネント用の構成サーバーを作成する
- Config Server for Spring をコンテナー アプリにバインドする
- アプリケーションに構成サーバーを接続する前と後の構成値を確認する
- 対称キーを使用した構成値の暗号化および暗号化解除
重要
このチュートリアルでは、Azureの請求書に影響する可能性があるサービスを使用します。 手順に従う場合は、予期しない課金を回避するために、この記事で紹介されているリソースを必ず削除してください。
前提条件
考慮事項
Azure Container Appsの Config Server for Spring で実行する場合は、次の詳細に注意してください。
| 項目 | 説明 |
|---|---|
| スコープ | Config Server for Spring は、接続されているコンテナー アプリと同じ環境で実行されます。 |
| スケーリング | 信頼できる唯一の情報源を維持するために、Config Server for Spring はスケーリングしません。 スケーリング プロパティ minReplicas と maxReplicas は両方とも 1 に設定されています。 |
| リソース | Config Server for Spring のコンテナー リソースの割り当ては固定で、CPU コア数は 0.5、メモリ サイズは 1Gi です。 |
| 料金 | Config Server for Spring の課金は消費ベースの価格設定に該当します。 マネージド Java コンポーネントによって消費されるリソースは、アクティブ/アイドルレートで課金されます。 課金を停止するために、使用しなくなったコンポーネントを削除できます。 |
| バインディング | コンテナー アプリは、バインドを介して Config Server for Spring に接続されます。 バインドは、コンテナー アプリの環境変数に構成を注入します。 バインドが確立されると、コンテナー アプリで環境変数から構成値を読み取ることができます。 |
セットアップ
Config Server for Spring の操作を開始する前に、まず、必要なリソースを作成する必要があります。
次のコマンドを実行して、リソース グループと Container Apps 環境を作成します。
アプリケーション構成をサポートする変数を作成します。 これらの値は、このレッスンのために提供されています。
export LOCATION=eastus export RESOURCE_GROUP=my-services-resource-group export ENVIRONMENT=my-environment export JAVA_COMPONENT_NAME=configserver export APP_NAME=my-config-client export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-service-config-client:latest" export URI="https://github.com/Azure-Samples/azure-spring-cloud-config-java-aca.git"変数 説明 LOCATIONコンテナー アプリとJava コンポーネントを作成するAzureリージョンの場所。 ENVIRONMENTデモ アプリケーションのAzure Container Apps環境名。 RESOURCE_GROUPデモ アプリケーションのAzureリソース グループ名。 JAVA_COMPONENT_NAMEコンテナー アプリ用に作成されたJava コンポーネントの名前。 この場合は、Spring Java コンポーネント用の構成サーバーを作成します。 IMAGEコンテナー アプリで使用されるコンテナー イメージ。 URIURI を Git リポジトリの URL に置き換えることができます。非公開の場合は、 spring.cloud.config.server.git.usernameやspring.cloud.config.server.git.passwordなどの関連する認証設定を追加します。Azure CLIを使用してAzureにサインインします。
az loginリソース グループを作成する。
az group create --name $RESOURCE_GROUP --location $LOCATIONコンテナー アプリ環境を作成します。
az containerapp env create \ --name $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --location $LOCATION
この環境は、Config Server for Spring Java コンポーネントとコンテナー アプリの両方をホストするために使用されます。
Spring Java コンポーネントの構成サーバーを作成する
Container Apps 環境が準備できたので、コンテナー アプリを作成し、Config Server for Spring Java コンポーネントにバインドできます。 コンテナー アプリをバインドすると、構成値は自動的に Config Server コンポーネントからアプリケーションに同期されます。
Spring Java コンポーネントの構成サーバーを作成します。
az containerapp env java-component config-server-for-spring create \ --environment $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --name $JAVA_COMPONENT_NAME \ --min-replicas 1 \ --max-replicas 1 \ --configuration spring.cloud.config.server.git.uri=$URISpring Java コンポーネントの構成サーバーを更新します。
az containerapp env java-component config-server-for-spring update \ --environment $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --name $JAVA_COMPONENT_NAME \ --min-replicas 2 \ --max-replicas 2 \ --configuration spring.cloud.config.server.git.uri=$URI spring.cloud.config.server.git.refresh-rate=60ここでは、
uriプロパティを介して構成情報を保持するリポジトリの場所をコンポーネントに指示しています。refresh-rateプロパティは、Container Apps で Git リポジトリの変更をチェックする頻度を指示します。
Spring Java コンポーネントの Config Server にコンテナー アプリをバインドする
構成データを消費するコンテナー アプリを作成します。
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 \ --query properties.configuration.ingress.fqdnこのコマンドは、構成データを消費するコンテナー アプリの URL を返します。 次の手順で使えるように URL をテキスト エディターにコピーします。
ブラウザーでアプリにアクセスした場合、返される
connectTimeoutの値は既定値の0です。Config Server for Spring にバインドします。
これで、コンテナー アプリと Config Server が作成されたので、
updateコマンドと共にコンテナー アプリにバインドします。az containerapp update \ --name $APP_NAME \ --resource-group $RESOURCE_GROUP \ --bind $JAVA_COMPONENT_NAME--bind $JAVA_COMPONENT_NAMEパラメーターは、コンテナー アプリと構成コンポーネントの間のリンクを作成します。
コンテナー アプリと Config Server コンポーネントがバインドされると、構成の変更が自動的にコンテナー アプリに同期されます。
アプリの URL にもう一度アクセスすると、connectTimeout の値が 10000 になります。 この値は、元々構成コンポーネントのソースとして設定されていた $URI 変数に設定されている Git リポジトリから取得します。 具体的には、この値はリポジトリの connectionTimeout ファイルの プロパティから取得されます。
バインド要求は、構成の設定を環境変数としてアプリケーションに注入します。 これらの値は、構成サーバーから構成の設定をフェッチする場合に、アプリケーション コードに使用できるようになりました。
この場合、アプリケーションでは次の環境変数を使用できます。
SPRING_CLOUD_CONFIG_URI=http://[JAVA_COMPONENT_INTERNAL_FQDN]:80
SPRING_CLOUD_CONFIG_COMPONENT_URI=http://[JAVA_COMPONENT_INTERNAL_FQDN]:80
SPRING_CONFIG_IMPORT=optional:configserver:$SPRING_CLOUD_CONFIG_URI
独自の SPRING_CONFIG_IMPORT をカスタマイズする場合は、環境変数 SPRING_CLOUD_CONFIG_COMPONENT_URI を参照できます。たとえば、Java -Dspring.config.import=optional:configserver:${SPRING_CLOUD_CONFIG_COMPONENT_URI}?fail-fast=true などのコマンド ライン引数でオーバーライドできます。
バインディングは、アプリケーションから削除することもできます。
(省略可能)Spring Java コンポーネントの Config Server からコンテナー アプリのバインドを解除する
コンテナー アプリからバインドを削除するには、--unbind オプションを使用します。
az containerapp update \
--name $APP_NAME \
--unbind $JAVA_COMPONENT_NAME \
--resource-group $RESOURCE_GROUP
アプリの URL にもう一度アクセスすると、connectTimeout の値が 0 に戻ります。
リソースをクリーンアップする
このチュートリアルで作成したリソースは、Azureの請求書に影響します。 これらのサービスを長期間使用しない場合は、次のコマンドを実行して、このチュートリアルで作成したすべてのものを削除してください。
az group delete --resource-group $RESOURCE_GROUP
構成オプション
az containerapp update コマンドでは、--configuration パラメーターを使用して、Spring 用 Config Server の構成方法をコントロールします。 スペースで区切ることで、一度に複数のパラメーターを使用することが可能です。 詳細については、「Spring Cloud Config Server」を参照してください。
次の表に、使用できるさまざまな Git バックエンドの構成値が載っています。
| 名前 | 説明 |
|---|---|
spring.cloud.config.server.git.uri spring.cloud.config.server.git.repos.{repoName}.uri |
リモート リポジトリの URI。 |
spring.cloud.config.server.git.username spring.cloud.config.server.git.repos.{repoName}.username |
リモート リポジトリを使用した認証に対するユーザー名。 |
spring.cloud.config.server.git.password spring.cloud.config.server.git.repos.{repoName}.password |
リモート リポジトリを使用した認証に対するパスワード。 |
spring.cloud.config.server.git.search-paths spring.cloud.config.server.git.repos.{repoName}.search-paths |
ローカルの作業コピー内で使用する検索パス。 既定では、ルートのみが検索されます。 |
spring.cloud.config.server.git.force-pull spring.cloud.config.server.git.repos.{repoName}.force-pull |
リポジトリがプルを強制する必要があることを示すフラグ。
true の場合、ローカルでの変更が破棄され、リモート リポジトリから取得されます。 |
spring.cloud.config.server.git.default-label spring.cloud.config.server.git.repos.{repoName}.default-label |
Git で使用される既定のラベルは main です。
spring.cloud.config.server.git.default-labelを設定せず、main という名前のブランチが存在しない場合、構成サーバーは既定で master という名前のブランチのチェックアウトも試みます。 ブランチのフォールバック 動作を無効にしたい場合、spring.cloud.config.server.git.tryMasterBranch を false に設定できます。 |
spring.cloud.config.server.git.try-master-branch spring.cloud.config.server.git.repos.{repoName}.try-master-branch |
既定では、構成サーバーは master という名前のブランチをチェックアウトしようとします。 |
spring.cloud.config.server.git.skip-ssl-validation spring.cloud.config.server.git.repos.{repoName}.skip-ssl-validation |
構成サーバーによる Git サーバーの TLS/SSL 証明書の検証は、git.skipSslValidation プロパティを true に設定することで無効にできます。 |
spring.cloud.config.server.git.clone-on-start spring.cloud.config.server.git.repos.{repoName}.clone-on-start |
オンデマンドにではなく、起動時に、リポジトリをクローンする必要があることを示すフラグ。 一般に、起動が遅くなりますが、最初のクエリは高速になります。 |
spring.cloud.config.server.git.timeout spring.cloud.config.server.git.repos.{repoName}.timeout |
該当する場合は、HTTP または SSH 接続を取得する際のタイムアウト (秒単位)。 既定の 値は 5 秒です。 |
spring.cloud.config.server.git.refresh-rate spring.cloud.config.server.git.repos.{repoName}.refresh-rate |
Config Server は新しい構成データを Git バックエンドからどれくらいの頻度で取得するか。 |
spring.cloud.config.server.git.private-key spring.cloud.config.server.git.repos.{repoName}.private-key |
有効な SSH 秘密キーです。
ignore-local-ssh-settings が true であり Git URI が SSH 形式の場合は、設定する必要があります。 |
spring.cloud.config.server.git.host-key spring.cloud.config.server.git.repos.{repoName}.host-key |
有効な SSH ホスト キーです。
host-key-algorithm も設定されている場合は、設定する必要があります。 |
spring.cloud.config.server.git.host-key-algorithm spring.cloud.config.server.git.repos.{repoName}.host-key-algorithm |
ssh-dss、ssh-rsa、ssh-ed25519、ecdsa-sha2-nistp256、ecdsa-sha2-nistp384、ecdsa-sha2-nistp521 のいずれか。
host-key も設定されている場合は、設定する必要があります。 |
spring.cloud.config.server.git.strict-host-key-checking spring.cloud.config.server.git.repos.{repoName}.strict-host-key-checking |
true または false。
false の場合は、ホスト キーのエラーを無視します。 |
spring.cloud.config.server.git.repos.{repoName} |
リモート リポジトリの URI。 |
spring.cloud.config.server.git.repos.{repoName}.pattern |
パターンの形式は、ワイルドカードを含む {application}/{profile} の名前のコンマ区切りのリストです。
{application}/{profile}がいずれのパターンにも一致しない場合は、以下で定義されている既定の URI が使用されます。 |
次のリストは、一般的な構成を示しています。
ログ関連の構成:
logging.level.*logging.group.*-
logging.*名前空間の下位にあるその他の構成は、禁止されます。たとえば、logging.fileを使用したログ ファイルの書き込みなどは禁止です。
spring.cloud.config.server.overrides- すべてのクライアントに無条件で送信される、プロパティ ソースに関連する追加のマップ。
spring.cloud.config.override-none- リモート リポジトリで
spring.cloud.config.override-none=trueフラグを設定することで (既定値は false)、クライアント内のすべてのオーバーライドの優先順位を、より既定値に近くなるよう変更し、アプリケーションが環境変数またはシステム プロパティに独自の値を指定できるようにします。
- リモート リポジトリで
spring.cloud.config.allow-override- 構成の最初のブートストラップを有効にした場合、クライアント アプリケーションが構成サーバーからの構成をオーバーライドすることを許可できます。 オーバーライドは、構成サーバーから取得されるアプリケーション構成内に 2 つのプロパティを配置することによって行われます。
spring.cloud.config.server.health.*- 正常性インジケーターを構成すると、カスタム プロファイルとカスタム ラベルも含め、より多くのアプリケーションを確認できます。
spring.cloud.config.server.accept-empty- アプリケーションが見つからない場合に、サーバーが HTTP 状態の
spring.cloud.config.server.accept-emptyを返すように、falseを404に設定できます。 既定では、このフラグはtrueに設定されます。
- アプリケーションが見つからない場合に、サーバーが HTTP 状態の
暗号化と解読 (対称):
encrypt.key- 対称キーは、単一のプロパティ値を構成すればよいので、便利に使用できます。
spring.cloud.config.server.encrypt.enabled- このプロパティを
falseに設定すると、サーバー側の解読を無効にできます。
- このプロパティを
リフレッシュ
プロパティを使用するサービスでは、変更が発生する前に、それを認識しておく必要があります。 Spring 用 Config Server の既定の通知メソッドには、手動での更新イベントのトリガー (https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh の呼び出しによる更新など) が含まれています。これは、アプリ インスタンスが多数存在する場合には実行が困難となる場合があります。
代わりに、内部の更新に基づいて構成クライアントに変更をポーリングさせることで、Config Server から値を自動的に更新できます。 Config Server から値を自動的に更新するには、次の手順に従います。
次の例に示すように、スケジュールされたタスクを登録して、一定の間隔でコンテキストを更新します。
@Configuration @AutoConfigureAfter({RefreshAutoConfiguration.class, RefreshEndpointAutoConfiguration.class}) @EnableScheduling public class ConfigClientAutoRefreshConfiguration implements SchedulingConfigurer { @Value("${spring.cloud.config.refresh-interval:60}") private long refreshInterval; @Value("${spring.cloud.config.auto-refresh:false}") private boolean autoRefresh; private final RefreshEndpoint refreshEndpoint; public ConfigClientAutoRefreshConfiguration(RefreshEndpoint refreshEndpoint) { this.refreshEndpoint = refreshEndpoint; } @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { if (autoRefresh) { // set minimal refresh interval to 5 seconds refreshInterval = Math.max(refreshInterval, 5); scheduledTaskRegistrar.addFixedRateTask(refreshEndpoint::refresh, Duration.ofSeconds(refreshInterval)); } } }autorefreshを有効にし、application.yml ファイルで適切な更新間隔を設定します。 次の例では、クライアントは 60 秒 (更新間隔に設定できる最小値) ごとに構成変更をポーリングします。既定では、
autorefreshはfalseに設定され、refresh-intervalは 60 秒に設定されます。spring: cloud: config: auto-refresh: true refresh-interval: 60 management: endpoints: web: exposure: include: - refreshコードに
@RefreshScopeを追加します。 次の例では、変数connectTimeoutは 60 秒ごとに自動で更新されます。@RestController @RefreshScope public class HelloController { @Value("${timeout:4000}") private String connectTimeout; }
対称キーによる暗号化と暗号解読
サーバー側の暗号解読
既定では、サーバー側の暗号化が有効になっています。 次のステップに沿って、アプリケーションでの解読を有効にします。
Git リポジトリの .properties ファイルに、暗号化されたプロパティを追加します。
ファイルは次の例のようになります。
message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282fSpring Java コンポーネントの Config Server を更新して、暗号化されたプロパティを持つ Git リポジトリを使用し、暗号化キーを設定します。
次のコマンドを実行する前に、
<>で囲まれたプレースホルダーを実際の値に置き換えます。az containerapp env java-component config-server-for-spring update \ --environment <ENVIRONMENT_NAME> \ --resource-group <RESOURCE_GROUP> \ --name <JAVA_COMPONENT_NAME> \ --configuration spring.cloud.config.server.git.uri=<URI> encrypt.key=randomKey
クライアント側の暗号解読
以下の各ステップに従うと、プロパティのクライアント側の暗号解読を使用できます。
Git リポジトリの .properties ファイルに、暗号化されたプロパティを追加します。
Spring Java コンポーネントの Config Server を更新して、暗号化されたプロパティを持つ Git リポジトリを使用し、サーバー側の復号化を無効にします。
次のコマンドを実行する前に、
<>で囲まれたプレースホルダーを実際の値に置き換えます。az containerapp env java-component config-server-for-spring update \ --environment <ENVIRONMENT_NAME> \ --resource-group <RESOURCE_GROUP> \ --name <JAVA_COMPONENT_NAME> \ --configuration spring.cloud.config.server.git.uri=<URI> spring.cloud.config.server.encrypt.enabled=falseクライアント アプリで、環境変数として暗号解読キー
ENCRYPT_KEY=randomKeyを追加します。別の方法として、
spring-cloud-starter-bootstrapにclasspathを含む場合、またはシステム プロパティとしてspring.cloud.bootstrap.enabled=trueを設定する場合には、encrypt.keyにbootstrap.propertiesを設定します。次のコマンドを実行する前に、
<>で囲まれたプレースホルダーを実際の値に置き換えます。az containerapp update \ --name <APP_NAME> \ --resource-group <RESOURCE_GROUP> \ --set-env-vars "ENCRYPT_KEY=randomKey"encrypt: key: somerandomkey