Spring Cloud Azure MySQL のサポート

この記事の対象: ✔️ バージョン 4.14.0 ✔️ バージョン 5.8.0

Azure Database for MySQL は、MySQL コミュニティ エディションを利用したリレーショナル データベース サービスです。 単一サーバーまたはフレキシブル サーバーを使用して、Azure で MySQL データベースをホストすることができます。 これは、予測可能なパフォーマンスと動的なスケーラビリティを備えたミッション クリティカルなワークロードを処理できる、フル マネージドのサービスとしてのデータベース オファリングです。

バージョン4.5.0から、Spring 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

これらの種類の資格情報が見つからない場合、 DefaultAzureCredential 資格情報はアプリケーションのプロパティ、環境変数、マネージド ID、または IDE から取得されます。 詳細については、「Spring Cloud Azure の認証」を参照してください。

次の大まかな図は、Azure Database for MySQL で OAuth 資格情報認証を使用した認証のしくみをまとめたものです。 矢印は通信経路を示します。

Diagram showing Microsoft Entra authentication for MySQL.

構成

Spring Cloud Azure for MySQL では、次の 2 つのレベルの構成オプションがサポートされています。

  1. spring.cloud.azure というプレフィックスを持つ credentialprofile のグローバル認証構成オプション。

  2. Spring Cloud Azure for MySQL の一般的な構成オプション。

次の表に、Spring Cloud Azure for MySQL の一般的な構成オプションを示します。

名前 説明
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 でサービス プリンシパル認証を実行するときに使用するクライアント ID。 これは、レガシ プロパティです。
spring.datasource.azure.credential.client-secret Azure でサービス プリンシパル認証を実行するときに使用するクライアント シークレット。 これは、レガシ プロパティです。
spring.datasource.azure.credential.managed-identity-enabled マネージド 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-type 接続先の Azure クラウドの名前。
spring.datasource.azure.profile.environment.active-directory-endpoint 接続先の Microsoft Entra エンドポイント。
spring.datasource.azure.profile.tenant-id Azure リソースのテナント ID。 使用できる tenant-id 値は、次のとおりです。 commonorganizationsconsumers、またはテナント ID です。

依存関係のセットアップ

次の依存関係を自分のプロジェクトに追加します。 これにより、spring-boot-starter 依存関係がプロジェクトに推移的かつ自動的に組み込まれます。

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

Note

パスワードレス接続はバージョン 4.5.0以降サポートされています。

上記の依存関係と共に BOM spring-cloud-azure-dependencies を必ず追加してください。 詳細については、Spring Cloud Azure 開発者ガイドの「はじめに」セクションを参照してください。

基本的な使用方法

以降のセクションでは、従来の Spring Boot アプリケーションの使用シナリオを示します。

重要

パスワードレス接続では、Microsoft Entra 認証が使用されます。 Microsoft Entra 認証を使用するには、まず Microsoft Entra 管理者ユーザーを設定する必要があります。 Microsoft Entra ID ベースの認証に対してユーザーを作成して有効にできるのは、Microsoft Entra 管理者ユーザーだけです。 詳細については、「Azure Database for MySQL で Spring Data JDBC を使用する」を参照してください

パスワードなしで Azure MySQL にローカルに接続する

  1. ユーザーを作成してアクセス許可を付与するには、「Azure Database for MySQL で Spring Data JDBC を使用する」の「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
    

Note

使用できる tenant-id 値は、次のとおりです。 commonorganizationsconsumers、またはテナント 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」リポジトリを参照してください。