다음을 통해 공유


Spring Cloud Azure MySQL 지원

Azure Database for MySQL MySQL 커뮤니티 버전에서 제공하는 관계형 데이터베이스 서비스입니다. 단일 서버 또는 유연한 서버를 사용하여 Azure에서 MySQL 데이터베이스를 호스트할 수 있습니다. 예측 가능한 성능과 동적 확장성으로 중요 업무용 워크로드를 처리할 수 있는 완전히 관리되는 서비스로서의 데이터베이스 제품입니다.

버전 4.5.0Spring Cloud Azure는 Azure Database for MySQL 유연한 서버에 대한 인증을 위해 다양한 유형의 자격 증명을 지원합니다.

지원되는 MySQL 버전

현재 버전의 시작에서는 Azure Database for MySQL 유연한 서버 버전 5.7 또는 8.0사용해야 합니다.

핵심 기능

암호 없는 연결

암호 없는 연결은 애플리케이션, 해당 구성 파일 또는 환경 변수에 자격 증명을 저장하지 않고 Azure 서비스에 연결하는 데 Microsoft Entra 인증을 사용합니다. Microsoft Entra 인증은 Microsoft Entra ID에 정의된 ID를 사용하여 Azure Database for MySQL에 연결하는 메커니즘입니다. Microsoft Entra 인증을 사용하면 중앙 위치에서 데이터베이스 사용자 ID 및 기타 Microsoft 서비스를 관리할 수 있으므로 권한 관리가 간소화됩니다.

작동 방식

Spring Cloud Azure는 먼저 애플리케이션 인증 구성에 따라 다음 유형의 자격 증명 중 하나를 빌드합니다.

  • ClientSecretCredential
  • ClientCertificateCredential
  • UsernamePasswordCredential
  • ManagedIdentityCredential
  • DefaultAzureCredential

이러한 유형의 자격 증명을 찾을 수 없는 경우 애플리케이션 속성, 환경 변수, 관리 ID 또는 IDE에서 DefaultAzureCredential 자격 증명을 가져옵니다. 자세한 내용은 Spring Cloud Azure 인증참조하세요.

다음 상위 수준 다이어그램에서는 Azure Database for MySQL에서 OAuth 자격 증명 인증을 사용하여 인증이 작동하는 방식을 요약합니다. 화살표는 통신 경로를 나타냅니다.

MySQL에 대한 Microsoft Entra 인증을 보여 주는 다이어그램

구성

Spring Cloud Azure for MySQL은 다음 두 가지 수준의 구성 옵션을 지원합니다.

  1. credential접두사를 사용하여 profilespring.cloud.azure 전역 인증 구성 옵션입니다.

  2. Spring Cloud Azure for MySQL 일반 구성 옵션

다음 표에서는 Spring Cloud Azure for MySQL 일반 구성 옵션을 보여 줍니다.

이름 묘사
spring.datasource.azure.passwordless 지원 OAuth2 Microsoft Entra 토큰 자격 증명을 사용하여 Azure 데이터베이스에 암호 없는 연결을 사용하도록 설정할지 여부입니다.
spring.datasource.azure.credential.client-certificate-password 인증서 파일의 암호입니다.
spring.datasource.azure.credential.client-certificate-path Azure에서 서비스 주체 인증을 수행할 때 사용할 PEM 인증서 파일의 경로입니다.
spring.datasource.azure.credential.client-id Azure에서 서비스 주체 인증을 수행할 때 사용할 클라이언트 ID입니다. 레거시 속성입니다.
spring.datasource.azure.credential.client-secret Azure에서 서비스 주체 인증을 수행할 때 사용할 클라이언트 암호입니다. 레거시 속성입니다.
spring.datasource.azure.credential.managed-identity 지원 관리 ID가 Azure로 인증되도록 설정할지 여부입니다. true client-id 설정된 경우 클라이언트 ID를 사용자 할당 관리 ID 클라이언트 ID로 사용합니다. 기본값은 false.
spring.datasource.azure.credential.password Azure에서 사용자 이름/암호 인증을 수행할 때 사용할 암호입니다.
spring.datasource.azure.credential.username Azure에서 사용자 이름/암호 인증을 수행할 때 사용할 사용자 이름입니다.
spring.datasource.azure.profile.cloud 형식 연결할 Azure 클라우드의 이름입니다.
spring.datasource.azure.profile.environment.active-directory-endpoint 연결할 Microsoft Entra 엔드포인트입니다.
spring.datasource.azure.profile.테넌트 ID Azure 리소스에 대한 테넌트 ID입니다. tenant-id 허용되는 값은 common, organizations, consumers또는 테넌트 ID입니다.

종속성 설정

프로젝트에 다음 종속성을 추가합니다. 프로젝트에 spring-boot-starter 종속성이 전이적으로 자동으로 포함됩니다.

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

메모

버전 4.5.0이후 암호 없는 연결이 지원되었습니다.

위의 종속성과 함께 BOM spring-cloud-azure-dependencies 추가해야 합니다. 자세한 내용은 Spring Cloud Azure 개발자 가이드시작 섹션을 참조하세요.

기본 사용량

다음 섹션에서는 클래식 Spring Boot 애플리케이션 사용 시나리오를 보여 줍니다.

중요하다

암호 없는 연결은 Microsoft Entra 인증을 사용합니다. Microsoft Entra 인증을 사용하려면 먼저 Microsoft Entra 관리 사용자를 설정해야 합니다. Microsoft Entra 관리자 사용자만 Microsoft Entra ID 기반 인증에 대한 사용자를 만들고 사용하도록 설정할 수 있습니다. 자세한 내용은 Azure Database for MySQLSpring Data JDBC를 사용합니다.

암호 없이 로컬로 Azure MySQL에 연결

  1. 사용자를 만들고 권한을 부여하려면 MySQL 비관리자 만들기 및 Azure Database for MySQLSpring Data JDBC 사용 권한 섹션을 참조하세요.

  2. application.yml 파일에서 다음 속성을 구성합니다.

    spring:
      datasource:
        url: jdbc:mysql://${AZURE_MYSQL_SERVER_NAME}.mysql.database.azure.com:3306/${AZURE_MYSQL_DATABASE_NAME}
        username: ${AZURE_MYSQL_AD_NON_ADMIN_USERNAME}
        azure:
          passwordless-enabled: true
    

서비스 주체를 사용하여 Azure MySQL에 연결

  1. 서비스 주체에 대한 Microsoft Entra 사용자를 만들고 권한을 부여합니다.

    1. 먼저 다음 명령을 사용하여 일부 환경 변수를 설정합니다.

      export AZURE_MYSQL_AZURE_AD_SP_USERID=$(az ad sp list \
          --display-name <service_principal-name> \
          --query '[0].appId' 
          --output tsv)
      export AZURE_MYSQL_AZURE_AD_SP_USERNAME=<YOUR_MYSQL_AZURE_AD_USERNAME>
      export AZURE_MYSQL_SERVER_NAME=<YOUR_MYSQL_SERVER_NAME>
      export AZURE_MYSQL_DATABASE_NAME=<YOUR_MYSQL_DATABASE_NAME>
      export CURRENT_USERNAME=$(az ad signed-in-user show \
          --query userPrincipalName \
          --output tsv)
      
    2. 그런 다음 관리자가 아닌 사용자를 만들기 위해 create_ad_user_sp.sql이라는 SQL 스크립트를 만듭니다. 다음 내용을 추가하고 로컬로 저장합니다.

      cat << EOF > create_ad_user_sp.sql
      SET aad_auth_validate_oids_in_tenant = OFF;
      CREATE AADUSER '$AZURE_MYSQL_AZURE_AD_SP_USERNAME' IDENTIFIED BY '$AZURE_MYSQL_AZURE_AD_SP_USERID';
      GRANT ALL PRIVILEGES ON $AZURE_MYSQL_DATABASE_NAME.* TO '$AZURE_MYSQL_AZURE_AD_SP_USERNAME'@'%';
      FLUSH privileges;
      EOF
      
    3. 다음 명령을 사용하여 SQL 스크립트를 실행하여 Microsoft Entra 비관리 사용자를 만듭니다.

      mysql -h $AZURE_MYSQL_SERVER_NAME.mysql.database.azure.com --user $CURRENT_USERNAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user_sp.sql
      
    4. 이제 다음 명령을 사용하여 임시 SQL 스크립트 파일을 제거합니다.

      rm create_ad_user_sp.sql
      
  2. application.yml 파일에서 다음 속성을 구성합니다.

    spring:
      cloud:
        azure:
          credential:
            client-id: ${AZURE_CLIENT_ID}
            client-secret: ${AZURE_CLIENT_SECRET}
          profile:
            tenant-id: <tenant>
      datasource:
        url: jdbc:mysql://${AZURE_MYSQL_SERVER_NAME}.mysql.database.azure.com:3306/${AZURE_MYSQL_DATABASE_NAME}
        username: ${AZURE_MYSQL_AD_SP_USERNAME}
        azure:
          passwordless-enabled: true
    

메모

tenant-id 허용되는 값은 common, organizations, consumers또는 테넌트 ID입니다. 이러한 값에 대한 자세한 내용은 오류 AADSTS50020 잘못된 엔드포인트(개인 및 조직 계정) 섹션을 참조하세요. - ID 공급자의 사용자 계정이 테넌트존재하지 않습니다. 단일 테넌트 앱을 변환하는 방법에 대한 자세한 내용은 Microsoft Entra ID단일 테넌트 앱을 다중 테넌트로 변환을 참조하세요.

Azure Spring Apps에서 관리 ID를 사용하여 Azure MySQL에 연결

  1. 관리 ID를 사용하도록 설정하려면 Azure Database for MySQL암호 없는 연결을 사용하도록 애플리케이션 마이그레이션 Azure Portal 섹션을 사용하여 관리 ID 할당을 참조하세요.

  2. 권한을 부여하려면 Azure Database for MySQL암호 없는 연결을 사용하도록 애플리케이션 마이그레이션 관리 ID 섹션에 역할 할당을 참조하세요.

  3. application.yml 파일에서 다음 속성을 구성합니다.

    spring:
      datasource:
        url: jdbc:mysql://${AZURE_MYSQL_SERVER_NAME}.mysql.database.azure.com:3306/${AZURE_MYSQL_DATABASE_NAME}
        username: ${AZURE_MYSQL_AD_MI_USERNAME}
        azure:
          passwordless-enabled: true
    

샘플

GitHub에서 azure-spring-boot-samples 리포지토리를 참조하세요.