チュートリアル: Azure Container Apps で Spring 用マネージド Config Server に接続する (プレビュー)
Config Server for Spring は、構成データを複数のアプリケーションで使用できるようにするための一元的な場所を提供します。 この記事では、Azure Container Apps でホストされているアプリを Java Config Server for Spring インスタンスに接続する方法を紹介します。
Config Server for Spring Java コンポーネントは、構成設定のソースとして GitHub リポジトリを使用します。 構成値は、コンポーネントとコンテナー アプリの間のバインドを介して、コンテナー アプリで利用できるようになります。 構成サーバーで値を変更すると、その値は自動的にアプリケーションに反映され、アプリケーションを再コンパイルしたり再デプロイしたりする必要はありません。
このチュートリアルで学習する内容は次のとおりです。
- Config Server for 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 コンポーネントの名前。 この場合、Config Server for Spring の Java コンポーネントを作成します。 IMAGE
コンテナー アプリで使用されるコンテナー イメージ。 URI
URI を 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 コンポーネントとコンテナー アプリの両方をホストするために使用されます。
Config Server for Spring の Java コンポーネントを作成する
Container Apps 環境が準備できたので、コンテナー アプリを作成し、Config Server for Spring Java コンポーネントにバインドできます。 コンテナー アプリをバインドすると、構成値は自動的に Config Server コンポーネントからアプリケーションに同期されます。
Config Server for 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=$URI
Config Server for Spring の 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 リポジトリの変更をチェックする頻度を指示します。
コンテナー アプリを Config Server for Spring Java コンポーネントにバインドする
構成データを消費するコンテナー アプリを作成します。
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 リポジトリから取得します。 具体的には、この値はリポジトリの application.yml ファイルの 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 という名前の ブランチが存在しない場合、Config Server は、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 |
Config Server は、既定では 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
- 構成優先のブートストラップを有効にした場合、Config Server から提供されるアプリケーション構成内に 2 つのプロパティを配置することで、クライアント アプリケーションが Config Server からの構成をオーバーライドできるようになります。
spring.cloud.config.server.health.*
- 正常性インジケーターを構成すると、カスタム プロファイルとカスタム ラベルも含め、より多くのアプリケーションを確認できます。
spring.cloud.config.server.accept-empty
- アプリケーションが見つからない場合に、サーバーが HTTP 状態の
404
を返すように、spring.cloud.config.server.accept-empty
をfalse
に設定できます。 既定では、このフラグは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}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
暗号化されたプロパティがある Git リポジトリを使用し、暗号化キーを設定するように、Spring 用 Config Server の Java コンポーネントを更新します。
次のコマンドを実行する前に、
<>
で囲まれたプレースホルダーを実際の値に置き換えます。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 ファイルに、暗号化されたプロパティを追加します。
暗号化されたプロパティがある Git リポジトリを使用し、サーバー側の解読を無効にするように、Spring 用 Config Server の Java コンポーネントを更新します。
次のコマンドを実行する前に、
<>
で囲まれたプレースホルダーを実際の値に置き換えます。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
を追加します。別の方法として、
classpath
にspring-cloud-starter-bootstrap
を含む場合、またはシステム プロパティとしてspring.cloud.bootstrap.enabled=true
を設定する場合には、bootstrap.properties
にencrypt.key
を設定します。次のコマンドを実行する前に、
<>
で囲まれたプレースホルダーを実際の値に置き換えます。az containerapp update \ --name <APP_NAME> \ --resource-group <RESOURCE_GROUP> \ --set-env-vars "ENCRYPT_KEY=randomKey"
encrypt: key: somerandomkey