다음을 통해 공유


자습서: Azure Container Apps에서 Spring용 관리형 구성 서버에 연결

Spring용 Config Server는 구성 데이터를 여러 애플리케이션에서 사용할 수 있도록 중앙 집중식 위치를 제공합니다. 이 문서에서는 Azure Container Apps에서 호스트되는 앱을 Java Spring용 Config Server 인스턴스에 연결하는 방법을 알아봅니다.

Spring용 Config Server Java 구성 요소는 GitHub 리포지토리를 구성 설정의 원본으로 사용합니다. 구성 값은 구성 요소와 컨테이너 앱 간의 바인딩을 통해 컨테이너 앱에서 사용할 수 있습니다. 구성 서버에서 값이 변경되면 애플리케이션을 다시 컴파일하거나 다시 배포할 필요 없이 자동으로 애플리케이션에 전달됩니다.

이 자습서에서는 다음을 알아봅니다.

  • Spring용 Config Server Java 구성 요소 만들기
  • Spring용 Config Server를 컨테이너 앱에 바인딩
  • 구성 서버를 애플리케이션에 연결하기 전과 후에 구성 값을 관찰합니다.
  • 대칭 키를 사용하여 구성 값 암호화 및 암호 해독

Important

이 자습서에서는 Azure 청구서에 영향을 줄 수 있는 서비스를 사용합니다. 단계별로 따르기로 결정한 경우 예기치 못한 비용이 청구되지 않도록 이 문서에 소개된 리소스를 삭제해야 합니다.

필수 조건

고려 사항

Azure Container Apps의 Spring용 Config Server에서 실행하는 경우 다음 세부 정보에 유의해야 합니다.

Item 설명
범위 Spring용 Config Server는 연결된 컨테이너 앱과 동일한 환경에서 실행됩니다.
크기 조정 단일 정보 원본을 유지하기 위해 Spring용 Config Server는 크기 조정되지 않습니다. 배율 조정 속성 minReplicasmaxReplicas는 모두 1로 설정됩니다.
리소스 Spring용 Config Server의 컨테이너 리소스 할당은 고정되어 있으며, CPU 코어 수는 0.5, 메모리 크기는 1Gi입니다.
가격 Spring용 Config Server 청구는 사용량 기반 가격 책정에 속합니다. 관리 Java 구성 요소에서 사용하는 리소스는 활성/유휴 요금으로 청구됩니다. 더 이상 사용하지 않는 구성 요소를 삭제하여 청구를 중지할 수 있습니다.
바인딩 컨테이너 앱은 바인딩을 통해 Spring용 Config Server에 연결됩니다. 바인딩은 컨테이너 앱 환경 변수에 구성을 삽입합니다. 바인딩이 설정되면 컨테이너 앱은 환경 변수에서 구성 값을 읽을 수 있습니다.

설정

Spring용 Config Server 작업을 시작하기 전에 먼저 필요한 리소스를 만들어야 합니다.

다음 명령을 실행하여 리소스 그룹 및 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 구성 요소의 이름입니다. 이 경우 Spring용 Config Server 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
    

이 환경은 Spring용 Config Server Java 구성 요소와 컨테이너 앱을 모두 호스팅하는 데 사용됩니다.

Spring용 Config Server Java 구성 요소 만들기

이제 Container Apps 환경이 있으므로 컨테이너 앱을 만들고 이를 Spring용 Config Server Java 구성 요소에 바인딩할 수 있습니다. 컨테이너 앱을 바인딩하면 구성 값이 Config Server 구성 요소에서 애플리케이션으로 자동으로 동기화됩니다.

  1. Spring용 Config Server 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. Spring용 Config Server 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 Git 리포지토리의 변경 내용을 확인하는 빈도를 Container Apps에 알려줍니다.

Spring용 Config Server 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. Spring용 Config Server에 바인딩합니다.

    이제 컨테이너 앱과 Config Server가 만들어졌으므로 update 명령을 사용하여 컨테이너 앱에 바인딩합니다.

    az containerapp update \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --bind $JAVA_COMPONENT_NAME
    

    --bind $JAVA_COMPONENT_NAME 매개 변수는 컨테이너 앱과 구성 요소 간의 링크를 만듭니다.

컨테이너 앱과 구성 서버 구성 요소가 함께 바인딩되면 구성 변경 내용이 컨테이너 앱에 자동으로 동기화됩니다.

앱의 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용 Config Server Java 구성 요소에서 컨테이너 앱 바인딩 해제

컨테이너 앱에서 바인딩을 제거하려면 --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 매개 변수를 사용하여 Config Server for Spring이 구성된 방법을 제어합니다. 여러 매개 변수를 공백으로 구분하면 한 번에 여러 매개 변수를 사용할 수 있습니다. 자세한 내용은 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에 사용되는 기본 레이블은 기본 레이블입니다. 설정 spring.cloud.config.server.git.default-label 하지 않고 main이라는 분기가 없는 경우 기본적으로 구성 서버는 마스터라는 분기를 체크 아웃하려고 시도합니다. 대체 분기 동작을 사용하지 않도록 설정하려면 .로 설정할 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
속성을 true으로 설정하여 Git 서버의 TLS/SSL 인증서에 대한 구성 서버의 유효성 검사를 사용하지 않도록 설정할 git.skipSslValidation 수 있습니다.
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
구성 서버가 Git 백 엔드에서 업데이트된 구성 데이터를 가져오는 빈도입니다.
spring.cloud.config.server.git.private-key
spring.cloud.config.server.git.repos.{repoName}.private-key
유효한 SSH 프라이빗 키입니다. 있는 true 경우 ignore-local-ssh-settings 설정해야 하며 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

    • 클라이언트의 모든 재정의 우선 순위를 기본값과 비슷하게 변경하여 애플리케이션이 원격 리포지토리 기본값인 false 플래그를 설정 spring.cloud.config.override-none=true 하여 환경 변수 또는 시스템 속성에 고유한 값을 제공할 수 있습니다.
  • spring.cloud.config.allow-override

    • 구성 첫 번째 부트스트랩을 사용하도록 설정하면 클라이언트 애플리케이션이 구성 서버에서 들어오는 애플리케이션 구성 내에 두 개의 속성을 배치하여 구성 서버에서 구성을 재정의하도록 허용할 수 있습니다.
  • spring.cloud.config.server.health.*

    • 사용자 지정 프로필 및 사용자 지정 레이블과 함께 더 많은 애플리케이션을 확인하도록 상태 표시기를 구성할 수 있습니다.
  • spring.cloud.config.server.accept-empty

    • 애플리케이션을 찾을 수 없는 경우 서버가 HTTP 404 상태를 반환하도록 false 설정할 spring.cloud.config.server.accept-empty 수 있습니다. 기본적으로 이 플래그는 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초마다 구성 변경 내용을 폴링합니다.

    기본적으로 autorefresh 60초로 false 설정되고 refresh-interval 설정됩니다.

    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 Java용 Config Server 구성 요소를 업데이트합니다.

    다음 명령을 실행하기 전에 <>로 묶인 자리 표시자를 원하는 값으로 바꿉니다.

    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 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를 환경 변수로 추가합니다.

    또는 에 포함 spring-cloud-starter-bootstrap classpath하거나 시스템 속성 encrypt.key bootstrap.properties으로 설정하는 spring.cloud.bootstrap.enabled=true 경우 .

    다음 명령을 실행하기 전에 <>로 묶인 자리 표시자를 원하는 값으로 바꿉니다.

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