次の方法で共有


チュートリアル: 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 はスケーリングしません。 スケーリング プロパティ minReplicasmaxReplicas は両方とも 1 に設定されています。
リソース Config Server for Spring のコンテナー リソースの割り当ては固定で、CPU コア数は 0.5、メモリ サイズは 1Gi です。
料金 Config Server for Spring の課金は消費ベースの価格設定に該当します。 マネージド Java コンポーネントによって消費されるリソースは、アクティブ/アイドル レートで課金されます。 課金を停止するために、使用しなくなったコンポーネントを削除できます。
バインディング コンテナー アプリは、バインドを介して Config Server for Spring に接続されます。 バインドは、コンテナー アプリの環境変数に構成を注入します。 バインドが確立されると、コンテナー アプリで環境変数から構成値を読み取ることができます。

セットアップ

Config Server for Spring の操作を開始する前に、まず、必要なリソースを作成する必要があります。

次のコマンドを実行して、リソース グループと Container Apps 環境を作成します。

  1. アプリケーション構成をサポートする変数を作成します。 これらの値は、このレッスンのために提供されています。

    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.usernamespring.cloud.config.server.git.password などの関連する認証設定を追加します。
  2. Azure CLI を使用して Azure にサインインします。

    az login
    
  3. リソース グループを作成する。

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. コンテナー アプリ環境を作成します。

    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 コンポーネントからアプリケーションに同期されます。

  1. 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
    
  2. 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 コンポーネントにバインドする

  1. 構成データを消費するコンテナー アプリを作成します。

    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 です。

  2. 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.tryMasterBranchfalse に設定できます。
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-settingstrue であり 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-dssssh-rsassh-ed25519ecdsa-sha2-nistp256ecdsa-sha2-nistp384ecdsa-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 または falsefalse の場合は、ホスト キーのエラーを無視します。
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-emptyfalse に設定できます。 既定では、このフラグは true に設定されます。
  • 暗号化と解読 (対称):

    • encrypt.key
      • 対称キーは、単一のプロパティ値を構成すればよいので、便利に使用できます。
    • spring.cloud.config.server.encrypt.enabled
      • このプロパティを false に設定すると、サーバー側の解読を無効にできます。

最新のステータスに更新

プロパティを使用するサービスでは、変更が発生する前に、それを認識しておく必要があります。 Spring 用 Config Server の既定の通知メソッドには、手動での更新イベントのトリガー (https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh の呼び出しによる更新など) が含まれています。これは、アプリ インスタンスが多数存在する場合には実行が困難となる場合があります。

代わりに、内部の更新に基づいて構成クライアントに変更をポーリングさせることで、Config Server から値を自動的に更新できます。 Config Server から値を自動的に更新するには、次の手順に従います。

  1. 次の例に示すように、スケジュールされたタスクを登録して、一定の間隔でコンテキストを更新します。

    @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));
            }
        }
    }
    
  2. autorefresh を有効にし、application.yml ファイルで適切な更新間隔を設定します。 次の例では、クライアントは 60 秒 (更新間隔に設定できる最小値) ごとに構成変更をポーリングします。

    既定では、autorefreshfalse に設定され、refresh-interval は 60 秒に設定されます。

    spring:
        cloud:
            config:
            auto-refresh: true
            refresh-interval: 60
    management:
        endpoints:
            web:
            exposure:
                include:
                - refresh
    
  3. コードに @RefreshScope を追加します。 次の例では、変数 connectTimeout は 60 秒ごとに自動で更新されます。

    @RestController
    @RefreshScope
    public class HelloController {
        @Value("${timeout:4000}")
        private String connectTimeout;
    }
    

対称キーによる暗号化と暗号解読

サーバー側の暗号解読

既定では、サーバー側の暗号化が有効になっています。 次のステップに沿って、アプリケーションでの解読を有効にします。

  1. Git リポジトリの .properties ファイルに、暗号化されたプロパティを追加します。

    ファイルは次の例のようになります。

    message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
    
  2. 暗号化されたプロパティがある 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
    

クライアント側の暗号解読

以下の各ステップに従うと、プロパティのクライアント側の暗号解読を使用できます。

  1. Git リポジトリの .properties ファイルに、暗号化されたプロパティを追加します。

  2. 暗号化されたプロパティがある 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
    
  3. クライアント アプリで、環境変数として暗号解読キー ENCRYPT_KEY=randomKey を追加します。

    別の方法として、classpathspring-cloud-starter-bootstrap を含む場合、またはシステム プロパティとして spring.cloud.bootstrap.enabled=true を設定する場合には、bootstrap.propertiesencrypt.key を設定します。

    次のコマンドを実行する前に、 <> で囲まれたプレースホルダーを実際の値に置き換えます。

    az containerapp update \
        --name <APP_NAME> \
        --resource-group <RESOURCE_GROUP> \
        --set-env-vars "ENCRYPT_KEY=randomKey"
    
    encrypt:
      key: somerandomkey