자습서: Azure 데이터베이스에 암호 없는 연결을 사용하여 Azure Spring Apps에 Spring 애플리케이션 배포

이 문서에서는 Azure Spring Apps에 배포된 Spring Boot 애플리케이션에서 Azure 데이터베이스에 암호 없는 연결을 사용하는 방법을 보여 줍니다.

이 자습서에서는 Azure Portal 또는 Azure CLI를 사용하여 다음 작업을 완료합니다. 두 방법 모두 다음 절차에 설명되어 있습니다.

  • Azure Spring Apps의 인스턴스를 프로비전합니다.
  • Azure Spring Apps에 앱을 빌드하고 배포합니다.
  • 관리 ID를 사용하여 Azure 데이터베이스에 연결된 앱을 실행합니다.

참고 항목

이 자습서는 R2DBC에서 작동하지 않습니다.

필수 구성 요소

  • Azure 구독 아직 계정이 없는 경우 시작하기 전에 체험 계정을 만듭니다.
  • Azure CLI 2.45.0 이상이 필요합니다.
  • Azure Spring Apps 확장입니다. 다음 명령을 az extension add --name spring사용하여 확장을 설치할 수 있습니다.
  • JDK(Java Development Kit), 버전 8, 11 또는 17.
  • Git 클라이언트
  • cURL 또는 유사한 HTTP 유틸리티를 사용하여 기능을 테스트합니다.
  • Azure Database for MySQL을 실행하도록 선택한 경우 MySQL 명령줄 클라이언트입니다. 인기 있는 클라이언트 도구인 mysql.exe 명령줄 도구를 사용하여 Azure Cloud Shell을 사용하여 서버에 연결할 수 있습니다. 또는 로컬 환경에서 mysql 명령줄을 사용할 수 있습니다.
  • Azure SQL Database를 실행하도록 선택한 경우 SQL Server 용 ODBC 드라이버 18입니다.

작업 환경 준비

먼저 다음 명령을 사용하여 몇 가지 환경 변수를 설정합니다.

export AZ_RESOURCE_GROUP=passwordless-tutorial-rg
export AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>
export AZ_DATABASE_NAME=demodb
export AZ_LOCATION=<YOUR_AZURE_REGION>
export AZ_SPRING_APPS_SERVICE_NAME=<YOUR_AZURE_SPRING_APPS_SERVICE_NAME>
export AZ_SPRING_APPS_APP_NAME=hellospring
export AZ_DB_ADMIN_USERNAME=<YOUR_DB_ADMIN_USERNAME>
export AZ_DB_ADMIN_PASSWORD=<YOUR_DB_ADMIN_PASSWORD>
export AZ_USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>

자리 표시자를 이 문서 전체에서 사용되는 다음 값으로 바꿉 있습니다.

  • <YOUR_DATABASE_SERVER_NAME>: Azure 데이터베이스 서버의 이름으로, Azure 전체에서 고유해야 합니다.
  • <YOUR_AZURE_REGION>: 사용하려는 Azure 지역입니다. 기본적으로 eastus를 사용할 수 있지만 거주지와 더 가까운 지역을 구성하는 것이 좋습니다. 를 사용하여 az account list-locations사용 가능한 지역의 전체 목록을 볼 수 있습니다.
  • <YOUR_AZURE_SPRING_APPS_SERVICE_NAME>: Azure Spring Apps 인스턴스의 이름입니다. 이름은 4자에서 32자 사이여야 하며 소문자, 숫자 및 하이픈만 포함할 수 있습니다. 서비스 이름의 첫 글자는 문자여야 하며 마지막 문자는 문자 또는 숫자여야 합니다.
  • <AZ_DB_ADMIN_USERNAME>: Azure 데이터베이스 서버의 관리자 사용자 이름입니다.
  • <AZ_DB_ADMIN_PASSWORD>: Azure 데이터베이스 서버의 관리자 암호입니다.
  • <YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>: Azure에서 고유해야 하는 사용자 할당 관리 ID 서버의 이름입니다.

Azure Spring Apps 인스턴스 프로비전

다음 단계를 사용하여 Azure Spring Apps 인스턴스를 프로비전합니다.

  1. 다음 명령을 사용하여 Azure Spring Apps 확장으로 Azure CLI를 업데이트합니다.

    az extension update --name spring
    
  2. Azure CLI에 로그인하고 다음 명령을 사용하여 활성 구독을 선택합니다.

    az login
    az account list --output table
    az account set --subscription <name-or-ID-of-subscription>
    
  3. 다음 명령을 사용하여 Azure Spring Apps 서비스 및 Azure Spring Apps 서비스의 인스턴스를 포함하는 리소스 그룹을 만듭니다.

    az group create \
        --name $AZ_RESOURCE_GROUP \
        --location $AZ_LOCATION
    az spring create \
        --resource-group $AZ_RESOURCE_GROUP \
        --name $AZ_SPRING_APPS_SERVICE_NAME
    

Azure 데이터베이스 인스턴스 만들기

다음 단계를 사용하여 Azure Database 인스턴스를 프로비전합니다.

  1. 다음 명령을 사용하여 Azure Database for MySQL 서버를 만듭니다.

    az mysql flexible-server create \
        --resource-group $AZ_RESOURCE_GROUP \
        --name $AZ_DATABASE_SERVER_NAME \
        --location $AZ_LOCATION \
        --admin-user $AZ_DB_ADMIN_USERNAME \
        --admin-password $AZ_DB_ADMIN_PASSWORD \
        --yes
    

참고 항목

사용자가 제공 admin-user 하거나 admin-password 매개 변수를 제공하지 않으면 시스템은 기본적으로 기본 관리자 사용자 또는 임의 관리자 암호를 생성합니다.

  1. 다음 명령을 사용하여 새 데이터베이스를 만듭니다.

    az mysql flexible-server db create \
        --resource-group $AZ_RESOURCE_GROUP \
        --database-name $AZ_DATABASE_NAME \
        --server-name $AZ_DATABASE_SERVER_NAME
    

공용 엔드포인트가 할당된 앱 만들기

다음 명령을 사용하여 앱을 만듭니다.

az spring app create \
    --resource-group $AZ_RESOURCE_GROUP \
    --service $AZ_SPRING_APPS_SERVICE_NAME \
    --name $AZ_SPRING_APPS_APP_NAME \
    --runtime-version=Java_17
    --assign-endpoint true

Azure Spring Apps를 Azure 데이터베이스에 커넥트

먼저 Azure CLI에 대한 서비스 커넥트 또는 암호 없는 확장을 설치합니다.

az extension add --name serviceconnector-passwordless --upgrade

그런 다음, 다음 명령을 사용하여 Microsoft Entra 인증에 대한 사용자 할당 관리 ID를 만듭니다. 자세한 내용은 Azure Database for MySQL - 유연한 서버에 대한 Microsoft Entra 인증 설정을 참조 하세요.

export AZ_IDENTITY_RESOURCE_ID=$(az identity create \
    --name $AZ_USER_IDENTITY_NAME \
    --resource-group $AZ_RESOURCE_GROUP \
    --query id \
    --output tsv)

Important

사용자가 할당한 ID를 만든 후 전역 관리자 또는 권한 있는 역할 관리자에게 요청하여 이 ID에 대해 User.Read.All, GroupMember.Read.AllApplication.Read.ALL 권한을 부여합니다. 자세한 내용은 Active Directory 인증권한 섹션을 참조하세요.

다음으로, 다음 명령을 사용하여 데이터베이스에 대한 암호 없는 연결을 만듭니다.

az spring connection create mysql-flexible \
    --resource-group $AZ_RESOURCE_GROUP \
    --service $AZ_SPRING_APPS_SERVICE_NAME \
    --app $AZ_SPRING_APPS_APP_NAME \
    --target-resource-group $AZ_RESOURCE_GROUP \
    --server $AZ_DATABASE_SERVER_NAME \
    --database $AZ_DATABASE_NAME \
    --system-identity mysql-identity-id=$AZ_IDENTITY_RESOURCE_ID

이 서비스 커넥트or 명령은 백그라운드에서 다음 작업을 수행합니다.

  • Azure Spring Apps에서 호스트하는 앱 $AZ_SPRING_APPS_APP_NAME 에 대해 시스템 할당 관리 ID를 사용하도록 설정합니다.

  • Microsoft Entra 관리자를 현재 로그인한 사용자로 설정합니다.

  • 1단계에서 만든 관리 ID의 이름을 지정 $AZ_SPRING_APPS_SERVICE_NAME/apps/$AZ_SPRING_APPS_APP_NAME 한 데이터베이스 사용자를 추가하고 이 사용자에게 데이터베이스 $AZ_DATABASE_NAME 의 모든 권한을 부여합니다.

  • $AZ_SPRING_APPS_APP_NAMEspring.datasource.urlspring.datasource.username에 두 가지 구성을 추가합니다.

    참고 항목

    오류 메시지가 The subscription is not registered to use Microsoft.ServiceLinker표시되면 명령을 az provider register --namespace Microsoft.ServiceLinker 실행하여 서비스 커넥트or 리소스 공급자를 등록한 다음 연결 명령을 다시 실행합니다.

앱 빌드 및 배포

다음 단계에서는 샘플 애플리케이션을 다운로드, 구성, 빌드 및 배포하는 방법을 설명합니다.

  1. 다음 명령을 사용하여 샘플 코드 리포지토리를 복제합니다.

    git clone https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql passwordless-sample
    
  2. pom.xml 파일에 다음 종속성을 추가합니다.

    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>
    </dependency>
    

    이 종속성은 Spring Cloud Azure 스타터에 대한 지원을 추가합니다.

    참고 항목

    BOM(청구서)을 사용하여 Spring Cloud Azure 라이브러리 버전을 관리하는 방법에 대한 자세한 내용은 Spring Cloud Azure 개발자 가이드시작 섹션을 참조하세요.

  3. 다음 명령을 사용하여 application.properties 파일을 업데이트합니다.

    cat << EOF > passwordless-sample/src/main/resources/application.properties
    
    logging.level.org.springframework.jdbc.core=DEBUG
    spring.datasource.azure.passwordless-enabled=true
    spring.sql.init.mode=always
    
    EOF
    
  4. 다음 명령을 사용하여 Maven을 사용하여 프로젝트를 빌드합니다.

    cd passwordless-sample
    ./mvnw clean package -DskipTests
    
  5. 다음 명령을 사용하여 앱에 대한 target/demo-0.0.1-SNAPSHOT.jar 파일을 배포합니다.

    az spring app deploy \
        --name $AZ_SPRING_APPS_APP_NAME \
        --service $AZ_SPRING_APPS_SERVICE_NAME \
        --resource-group $AZ_RESOURCE_GROUP \
        --artifact-path target/demo-0.0.1-SNAPSHOT.jar
    
  6. 다음 명령을 사용하여 배포 후 앱 상태 쿼리합니다.

    az spring app list \
        --service $AZ_SPRING_APPS_SERVICE_NAME \
        --resource-group $AZ_RESOURCE_GROUP \
        --output table
    

    다음 예제와 유사한 출력이 표시됩니다.

    Name               Location    ResourceGroup    Production Deployment    Public Url                                           Provisioning Status    CPU    Memory    Running Instance    Registered Instance    Persistent Storage
    -----------------  ----------  ---------------  -----------------------  ---------------------------------------------------  ---------------------  -----  --------  ------------------  ---------------------  --------------------
    <app name>         eastus      <resource group> default                                                                       Succeeded              1      2         1/1                 0/1                    -
    

애플리케이션 테스트

애플리케이션을 테스트할 때 cURL을 사용할 수 있습니다. 먼저 다음 명령을 사용하여 데이터베이스에 새 "todo" 항목을 만듭니다.

curl --header "Content-Type: application/json" \
    --request POST \
    --data '{"description":"configuration","details":"congratulations, you have set up JDBC correctly!","done": "true"}' \
        https://${AZ_SPRING_APPS_SERVICE_NAME}-hellospring.azuremicroservices.io

이 명령은 다음 예제와 같이 만든 항목을 반환합니다.

{"id":1,"description":"configuration","details":"congratulations, you have set up JDBC correctly!","done":true}

다음으로, 다음 cURL 요청을 사용하여 데이터를 검색합니다.

curl https://${AZ_SPRING_APPS_SERVICE_NAME}-hellospring.azuremicroservices.io

이 명령은 다음 예제와 같이 만든 항목을 포함하여 "todo" 항목 목록을 반환합니다.

[{"id":1,"description":"configuration","details":"congratulations, you have set up JDBC correctly!","done":true}]

리소스 정리

이 자습서에서 사용되는 모든 리소스를 클린 다음 명령을 사용하여 리소스 그룹을 삭제합니다.

az group delete \
    --name $AZ_RESOURCE_GROUP \
    --yes

다음 단계