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

참고 항목

Azure Spring Apps는 Azure Spring Cloud 서비스의 새 이름입니다. 서비스에 새 이름이 지정되었지만, 자산을 업데이트하는 동안 스크린샷, 비디오, 다이어그램과 같은 일부 위치에서는 당분간 이전 이름이 표시됩니다.

이 문서의 적용 대상: ✔️ 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

다음 단계