관리 ID를 사용하여 Key Vault에 Azure Spring Apps 연결

참고 항목

기본, 표준엔터프라이즈 계획은 2025년 3월 중순부터 사용되지 않으며 3년의 은퇴 기간이 있습니다. Azure Container Apps로 전환하는 것이 좋습니다. 자세한 내용은 Azure Spring Apps 사용 중지 공지 사항을 참조하세요.

표준 소비 및 전용 계획은 2024년 9월 30일부터 사용되지 않으며 6개월 후에 완전히 종료됩니다. Azure Container Apps로 전환하는 것이 좋습니다. 자세한 내용은 Azure Spring Apps 표준 사용량 및 전용 계획을 Azure Container Apps로 마이그레이션을 참조 하세요.

이 문서의 적용 대상: ✔️ Java ❌ C#

이 문서에서는 Azure Spring Apps에 배포된 앱에 대한 시스템이 할당한 관리 ID 또는 사용자가 할당한 관리 ID를 만들고 이 ID를 사용하여 Azure Key Vault에 액세스하는 방법을 보여 줍니다.

Azure Key Vault는 앱의 토큰, 암호, 인증서, API 키 및 기타 비밀에 대한 액세스를 안전하게 저장하고 긴밀하게 제어하는 데 사용할 수 있습니다. Microsoft Entra ID에서 관리 ID를 만들고, 코드에 자격 증명을 표시하지 않고도 Key Vault를 포함하여 Microsoft Entra 인증을 지원하는 모든 서비스에 인증할 수 있습니다.

다음 동영상에서는 Azure Key Vault를 사용하여 비밀을 관리하는 방법을 설명합니다.


필수 구성 요소

  • Azure 구독 구독이 없는 경우 시작하기 전에 체험 계정을 만드세요.
  • Azure CLI 버전 2.55.0 이상

각 리소스 이름 제공

다음 명령을 사용하여 리소스 이름을 저장할 변수를 만듭니다. 자리 표시자를 사용자의 값으로 바꿔야 합니다.

export LOCATION=<location>
export RESOURCE_GROUP=myresourcegroup
export SPRING_APPS=myasa
export APP=springapp-system
export KEY_VAULT=<your-keyvault-name>

리소스 그룹 만들기

리소스 그룹은 Azure 리소스가 배포 및 관리되는 논리적 컨테이너입니다. 다음 예에서처럼 az group create 명령을 사용하여 Key Vault 및 Spring Cloud를 둘 다 포함하는 리소스 그룹을 만듭니다.

az group create --name ${RESOURCE_GROUP} --location ${LOCATION}

Key Vault 설정

Key Vault를 만들려면 다음 예에서처럼 az keyvault create 명령을 사용합니다.

Important

각 Key Vault마다 고유한 이름이 있어야 합니다.

az keyvault create \
    --resource-group ${RESOURCE_GROUP} \
    --name ${KEY_VAULT}

다음 명령을 사용하여 앱 URL을 표시한 다음 반환된 URL(형식: https://${KEY_VAULT}.vault.azure.net)을 기록해 둡니다. 다음 단계에서 이 값을 사용합니다.

az keyvault show \
    --resource-group ${RESOURCE_GROUP} \
    --name ${KEY_VAULT} \
    --query properties.vaultUri --output tsv

이제 다음 예제와 같이 az keyvault secret set 명령을 사용하여 Key Vault에 비밀을 배치할 수 있습니다.

az keyvault secret set \
    --vault-name ${KEY_VAULT} \
    --name "connectionString" \
    --value "jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE;"

Azure Spring Apps 서비스 및 앱 만들기

해당 확장을 모두 설치한 후 다음 명령을 사용하여 Azure Spring Apps 인스턴스를 만듭니다.

az extension add --upgrade --name spring
az spring create \
    --resource-group ${RESOURCE_GROUP} \
    --sku Enterprise \
    --name ${SPRING_APPS}

다음 예제에서는 --system-assigned 매개 변수에서 요청한 대로 시스템이 할당한 관리 ID를 사용하여 앱을 만듭니다.

az spring app create \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --assign-endpoint true \
    --system-assigned
export MANAGED_IDENTITY_PRINCIPAL_ID=$(az spring app show \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --query identity.principalId --output tsv)
az extension add --upgrade --name spring
az spring create \
    --resource-group ${RESOURCE_GROUP} \
    --name ${SPRING_APPS}

다음 예제에서는 --system-assigned 매개 변수에서 요청한 대로 시스템이 할당한 관리 ID를 사용하여 springapp이라는 앱을 만듭니다.

az spring app create \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --assign-endpoint true \
    --runtime-version Java_17 \
    --system-assigned
export MANAGED_IDENTITY_PRINCIPAL_ID=$(az spring app show \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --query identity.principalId --output tsv)

Key Vault에 앱 액세스 권한 부여

다음 명령을 사용하여 앱의 Key Vault에서 적절한 액세스 권한을 부여합니다.

az keyvault set-policy \
    --name ${KEY_VAULT} \
    --object-id ${MANAGED_IDENTITY_PRINCIPAL_ID} \
    --secret-permissions set get list

참고 항목

시스템이 할당한 관리 ID의 경우 시스템 할당 관리 ID가 사용하지 않도록 설정된 후 az keyvault delete-policy --name ${KEY_VAULT} --object-id ${MANAGED_IDENTITY_PRINCIPAL_ID}를 사용하여 앱에 대한 액세스 권한을 제거합니다.

Spring Boot 스타터를 사용하여 Spring Boot 앱 샘플 빌드

이 앱에는 Azure Key Vault에서 비밀을 가져올 수 있는 액세스 권한이 있습니다. Azure Key Vault 비밀 Spring Boot 스타터를 사용합니다. Azure Key Vault는 Spring PropertySource의 인스턴스로 추가됩니다. Azure Key Vault에 저장된 비밀은 외부화된 구성 속성(예: 파일의 속성)과 같이 편리하게 액세스하고 사용할 수 있습니다.

  1. 다음 명령을 사용하여 Azure Key Vault Spring 스타터로 start.spring.io에서 샘플 프로젝트를 생성합니다.

    curl https://start.spring.io/starter.tgz -d dependencies=web,azure-keyvault -d baseDir=springapp -d bootVersion=3.2.1 -d javaVersion=17 -d type=maven-project | tar -xzvf -
    
  2. 앱에서 Key Vault를 지정합니다.

    cd springapp
    vim src/main/resources/application.properties
    
  3. Azure Spring Apps에 배포된 앱에 관리 ID를 사용하려면 다음 콘텐츠가 포함된 속성을 src/main/resources/application.properties 파일에 추가합니다.

    spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=<your-keyvault-url>
    spring.cloud.azure.keyvault.secret.property-sources[0].credential.managed-identity-enabled=true
    

    참고 항목

    이전과 같이 application.properties 파일에 키 자격 증명 모음 URL을 추가해야 합니다. 그렇지 않으면 런타임 중에 키 자격 증명 모음 URL이 캡처되지 않을 수 있습니다.

  4. 다음 코드의 예로 src/main/java/com/example/demo/DemoApplication.java를 업데이트합니다. 이 코드는 키 자격 증명 모음에서 연결 문자열을 검색합니다.

    package com.example.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestController
    public class DemoApplication implements CommandLineRunner {
    
        @Value("${connectionString}")
        private String connectionString;
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @GetMapping("get")
        public String get() {
            return connectionString;
        }
    
        public void run(String... args) throws Exception {
            System.out.println(String.format("\nConnection String stored in Azure Key Vault:\n%s\n",connectionString));
        }
    }
    

    pom.xml 파일을 열면 다음 예제와 같이 spring-cloud-azure-starter-keyvault 종속성을 볼 수 있습니다.

    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-keyvault</artifactId>
    </dependency>
    
  1. 다음 명령을 사용하여 Azure Spring Apps에 앱을 배포합니다.

    az spring app deploy \
        --resource-group ${RESOURCE_GROUP} \
        --service ${SPRING_APPS} \
        --name ${APP} \
        --source-path
    
  1. 다음 명령을 사용하여 Azure Spring Apps에 앱을 배포합니다.

    az spring app deploy \
        --resource-group ${RESOURCE_GROUP} \
        --service ${SPRING_APPS} \
        --name ${APP} \
        --source-path \
        --build-env BP_JVM_VERSION=17
    
  1. 앱을 테스트하려면 다음 명령을 사용하여 공용 엔드포인트 또는 테스트 엔드포인트에 액세스합니다.

    curl https://${SPRING_APPS}-${APP}.azuremicroservices.io/get
    

    응답 본문에 다음 메시지가 반환됩니다. jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE;

리소스 정리

다음 명령을 사용하여 새로 만든 서비스 인스턴스를 포함한 전체 리소스 그룹을 삭제합니다.

az group delete --name ${RESOURCE_GROUP} --yes

다음 단계