Spring Cloud Azure MySQL 支援

本文適用于: ✔️版本 4.14.0 ✔️ 5.8.0

適用於 MySQL 的 Azure 資料庫是由 MySQL 社群版本提供的關係資料庫服務。 您可以使用單一伺服器或彈性伺服器在 Azure 中裝載 MySQL 資料庫。 它是完全受控的資料庫即服務供應專案,可透過可預測的效能和動態延展性來處理任務關鍵性工作負載。

從版本 4.5.0 ,Spring Cloud Azure 支援各種類型的認證,以進行驗證,以適用於 MySQL 的 Azure 資料庫彈性伺服器。

支援的 MySQL 版本

入門版的目前版本應該使用 適用於 MySQL 的 Azure 資料庫彈性伺服器版本 5.78.0

核心功能

無密碼連線

無密碼連線會使用 Microsoft Entra 驗證來連線到 Azure 服務,而不需將任何認證儲存在應用程式、其組態檔或環境變數中。 Microsoft Entra 驗證是使用 Microsoft Entra 識別碼中定義的身分識別連線到適用於 MySQL 的 Azure 資料庫的機制。 透過 Microsoft Entra 驗證,您可以在中央位置管理資料庫使用者身分識別和其他Microsoft 服務,以簡化版權管理。

運作方式

Spring Cloud Azure 會根據應用程式驗證組態,先建置下列其中一種類型的認證:

  • ClientSecretCredential
  • ClientCertificateCredential
  • UsernamePasswordCredential
  • ManagedIdentityCredential
  • DefaultAzureCredential

如果找不到這些類型的認證, DefaultAzureCredential 則會從應用程式屬性、環境變數、受控識別或 IDE 取得認證。 如需詳細資訊,請參閱 Spring Cloud Azure 驗證

下列高階圖表摘要說明如何使用 OAuth 認證驗證搭配適用於 MySQL 的 Azure 資料庫進行驗證。 箭頭表示通訊路徑。

Diagram showing Microsoft Entra authentication for MySQL.

組態

Spring Cloud Azure for MySQL 支援下列兩個層級的組態選項:

  1. profile 的全域驗證組態選項 credential ,前置詞為 spring.cloud.azure

  2. 適用于 MySQL 的 Spring Cloud Azure 一般組態選項。

下表顯示適用于 MySQL 的 Spring Cloud Azure 一般組態選項:

名稱 描述
spring.datasource.azure.passwordless-enabled 是否要使用 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 執行服務主體驗證時要使用的用戶端識別碼。 這是舊版屬性。
spring.datasource.azure.credential.client-secret 使用 Azure 執行服務主體驗證時要使用的用戶端密碼。 這是舊版屬性。
spring.datasource.azure.credential.managed-identity-enabled 是否要讓受控識別向 Azure 進行驗證。 如果 為 true client-id 已設定 ,則會使用用戶端識別碼作為使用者指派的受控識別用戶端識別碼。 預設值為 false
spring.datasource.azure.credential.password 使用 Azure 執行使用者名稱/密碼驗證時要使用的密碼。
spring.datasource.azure.credential.username 使用 Azure 執行使用者名稱/密碼驗證時要使用的使用者名稱。
spring.datasource.azure.profile.cloud-type 要連線的 Azure 雲端名稱。
spring.datasource.azure.profile.environment.active-directory-endpoint 要連接的 Microsoft Entra 端點。
spring.datasource.azure.profile.tenant-id Azure 資源的租使用者識別碼。 允許 tenant-id 的值包括: commonorganizationsconsumers 或租使用者識別碼。

相依性設定

將下列相依性新增至您的專案。 這會自動在專案中以可轉移的方式包含 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 識別碼型驗證的使用者。 如需詳細資訊,請參閱 搭配使用 Spring Data JDBC 搭配適用於 MySQL 的 Azure 資料庫

在本機連線 Azure MySQL 而不需密碼

  1. 若要建立使用者並授與許可權,請參閱 使用 Spring Data JDBC 搭配適用於 MySQL 的 Azure 資料庫 的建立 MySQL 非系統管理員使用者和授與許可權 一節 。

  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 的值包括: commonorganizationsconsumers 或租使用者識別碼。 如需這些值的詳細資訊,請參閱 使用錯誤的端點(個人和組織帳戶) 一節錯誤 AADSTS50020 - 來自識別提供者的使用者帳戶不存在於租使用者 中。 如需轉換單一租使用者應用程式的資訊,請參閱 在 Microsoft Entra 識別碼 上將單一租使用者應用程式轉換成多租使用者。

在 Azure Spring Apps 中使用受控識別連線至 Azure MySQL

  1. 若要啟用受控識別,請參閱 使用移轉應用程式以使用無密碼連線與適用於 MySQL 的 Azure 資料庫 的 Azure 入口網站 一節 指派受控識別。

  2. 若要授與許可權,請參閱 將角色指派給受控識別 一節: 移轉應用程式以使用無密碼連線搭配適用於 MySQL 的 Azure 資料庫

  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 存放庫。