Azure Database for MySQL で Spring Data JPA を使用する

このチュートリアルでは、Spring Data JPA を使用して Azure Database for MySQL データベースにデータを格納する方法について説明します。

Java Persistence API (JPA) は、オブジェクト リレーショナル マッピング用の標準的な Java API です。

このチュートリアルには、Microsoft Entra 認証と MySQL 認証の 2 つの認証方法が含まれています。 [パスワードレス] タブには Microsoft Entra 認証が表示され、[パスワード] タブには MySQL 認証が表示されます。

Microsoft Entra 認証は、Microsoft Entra ID で定義された ID を使用して Azure Database for MySQL に接続するための仕組みです。 Microsoft Entra 認証を使用すると、データベース ユーザーの ID や他の Microsoft サービスを一元管理でき、アクセス許可の管理が容易になります。

MySQL 認証では、MySQL に格納されているアカウントが使用されます。 アカウントの資格情報としてパスワードを使用することを選択した場合、これらの資格情報は user テーブルに格納されます。 これらのパスワードは MySQL に保存されるため、パスワードのローテーションは自分で管理する必要があります。

前提条件

  • MySQL コマンド ライン クライアント

  • Spring Boot アプリケーションがない場合は、Spring Initializr で Maven プロジェクトを作成します。 [Maven プロジェクト] を選択して、[依存関係] で、[Spring Web][Spring Data JPA][MySQL Driver] 依存関係を追加したら、バージョン 8 以降の Java を選択します。

重要

パスワードレス接続を使用するには、Azure Database for MySQL インスタンスの Microsoft Entra 管理者ユーザーを作成します。 手順については、「Azure Database for MySQL - フレキシブル サーバーの Microsoft Entra 認証を設定する」の「Microsoft Entra 管理者の構成」セクションを参照してください。

サンプル アプリケーション参照

このチュートリアルでは、サンプル アプリケーションをコーディングします。 より早く進めたい場合は、このアプリケーションは既にコーディングされており、https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql で入手できます。

MySQL サーバーのファイアウォール規則を構成する

Azure Database for MySQL インスタンスは、既定でセキュリティ保護されています。 受信接続を一切許可しないファイアウォールがあります。

データベースを使用できるようにするには、サーバーのファイアウォールを開いて、データベース サーバーにアクセスするためのローカル IP アドレスを許可する必要があります。 詳細については、「Azure portal を使用した Azure Database for MySQL フレキシブル サーバーのファイアウォール規則の作成と管理」を参照してください。

Windows コンピューター上の Windows Subsystem for Linux (WSL) から MySQL サーバーに接続する場合は、WSL ホストの IP アドレスをファイアウォールに追加する必要があります。

MySQL の非管理者ユーザーを作成し、アクセス許可を付与する

この手順では、管理者以外のユーザーを作成し、demo データベースに対するすべてのアクセス許可をそのユーザーに付与します。

次の方法を使用して、パスワードレス接続を使用する管理者以外のユーザーを作成できます。

  1. 次のコマンドを使用して、Azure CLIの Service Connector パスワードレス拡張機能をインストールし ます。

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. 次のコマンドを使用して、Microsoft Entra の管理者以外のユーザーを作成します。

      az connection create mysql-flexible \
           --resource-group <your_resource_group_name> \
           --connection mysql_conn \
           --target-resource-group <your_resource_group_name> \
           --server mysqlflexibletest \
           --database demo \
           --user-account mysql-identity-id=/subscriptions/<your_subscription_id>/resourcegroups/<your_resource_group_name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<your_user_assigned_managed_identity_name> \
           --query authInfo.userName \
           --output tsv
    

    コマンドが完了したら、コンソール出力のユーザー名を書き留めます。

Azure Database for MySQL のデータを格納する

Azure Database for MySQL フレキシブル サーバー インスタンスが作成されたので、Spring Cloud Azure を使用してデータを格納できます。

Spring Cloud Azure Starter JDBC MySQL モジュールをインストールするには、次の依存関係を pom.xml ファイルに追加します。

  • Spring Cloud Azure 部品表 (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.11.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Note

    Spring Boot 2.xを使用している場合は、spring-cloud-azure-dependenciesバージョンを4.17.0に設定してください。 この部品表(BOM)は、<dependencyManagement>pom.xmlファイルのセクションで設定する必要があります。 これにより、すべてのSpring Cloud Azure依存関係が同じバージョンを使用していることが保証されます。 このBOMに使用されるバージョンの詳細については、「Spring Cloud Azureのどのバージョンを使うべきか」を参照してください。

  • Spring Cloud Azure Starter JDBC MySQL アーティファクト:

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

Note

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

Azure Database for MySQL を使用するように Spring Boot を構成する

Spring Data JPA を使用して Azure Database for MySQL のデータを格納するには、次の手順に従ってアプリケーションを構成します。

  1. application.properties 構成ファイルに次のプロパティを追加して、Azure Database for MySQL 資格情報を構成します。

    logging.level.org.hibernate.SQL=DEBUG
    
    spring.datasource.azure.passwordless-enabled=true
    spring.datasource.url=jdbc:mysql://mysqlflexibletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC
    spring.datasource.username=<your_mysql_ad_non_admin_username>
    
    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL8Dialect
    

    警告

    構成プロパティ spring.datasource.url?serverTimezone=UTC が追加されているのは、データベースへの接続時に UTC 日付形式 (協定世界時) を使用するように JDBC ドライバーに指示するためです。 このパラメーターがないと、Java サーバーではデータベースと同じ日付形式が使用されず、エラーが発生します。

重要

パスワードレス接続を使用するには、Azure Database for MySQL インスタンスの Microsoft Entra 管理者ユーザーを作成します。 手順については、「MySQL での認証に Microsoft Entra ID を使用する」の「Microsoft Entra 管理 ユーザーの設定」セクションを参照してください。

サンプル アプリケーション参照

この記事では、サンプル アプリケーションをコーディングします。 より早く進めたい場合は、このアプリケーションは既にコーディングされており、https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql で入手できます。

MySQL サーバーのファイアウォール規則を構成する

Azure Database for MySQL インスタンスは、既定でセキュリティ保護されています。 受信接続を一切許可しないファイアウォールがあります。

データベースを使用できるようにするには、サーバーのファイアウォールを開いて、データベース サーバーにアクセスするためのローカル IP アドレスを許可する必要があります。 詳細は、「Azure Portal を使用した Azure Database for MySQL ファイアウォール規則の作成と管理」を参照してください。

Windows コンピューター上の Windows Subsystem for Linux (WSL) から MySQL サーバーに接続する場合は、WSL ホストの IP アドレスをファイアウォールに追加する必要があります。

MySQL の非管理者ユーザーを作成し、アクセス許可を付与する

この手順では、管理者以外のユーザーを作成し、demo データベースに対するすべてのアクセス許可をそのユーザーに付与します。

重要

パスワードレス接続を使用するには、Azure Database for MySQL インスタンスの Microsoft Entra 管理者ユーザーを作成します。 詳細は、「MySQL での認証に Microsoft Entra ID を使用する」の「Microsoft Entra 管理 ユーザーの設定」セクションを参照してください。

非管理者ユーザーを作成するための create_ad_user.sql という名前の SQL スクリプトを作成します。 次の内容を追加し、ローカルに保存します。

export AZ_MYSQL_AD_NON_ADMIN_USERID=$(az ad signed-in-user show --query id --output tsv)

cat << EOF > create_ad_user.sql
SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER '<your_mysql_ad_non_admin_username>' IDENTIFIED BY '$AZ_MYSQL_AD_NON_ADMIN_USERID';
GRANT ALL PRIVILEGES ON demo.* TO '<your_mysql_ad_non_admin_username>'@'%';
FLUSH privileges;
EOF

次に、次のコマンドを使用して SQL スクリプトを実行し、Microsoft Entra の非管理者ユーザーを作成します。

mysql -h mysqlsingletest.mysql.database.azure.com --user <your_mysql_ad_admin_username>@mysqlsingletest --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql

ヒント

Microsoft Entra 認証を使用して Azure Database for MySQL に接続するには、設定した Microsoft Entra 管理者ユーザーでサインインし、アクセス トークンをパスワードとして取得する必要があります。 詳細については、「Microsoft Entra ID を使用して MySQL での認証を行う」を参照してください。

Azure Database for MySQL のデータを格納する

Azure Database for MySQL 単一サーバー インスタンスが作成されたので、Spring Cloud Azure を使用してデータを格納できます。

Spring Cloud Azure Starter JDBC MySQL モジュールをインストールするには、次の依存関係を pom.xml ファイルに追加します。

  • Spring Cloud Azure 部品表 (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.11.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Note

    Spring Boot 2.xを使用している場合は、spring-cloud-azure-dependenciesバージョンを4.17.0に設定してください。 この部品表(BOM)は、<dependencyManagement>pom.xmlファイルのセクションで設定する必要があります。 これにより、すべてのSpring Cloud Azure依存関係が同じバージョンを使用していることが保証されます。 このBOMに使用されるバージョンの詳細については、「Spring Cloud Azureのどのバージョンを使うべきか」を参照してください。

  • Spring Cloud Azure Starter JDBC MySQL アーティファクト:

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

Note

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

Azure Database for MySQL を使用するように Spring Boot を構成する

Spring Data JPA を使用して Azure Database for MySQL のデータを格納するには、次の手順に従ってアプリケーションを構成します。

  1. application.properties 構成ファイルに次のプロパティを追加して、Azure Database for MySQL 資格情報を構成します。

    logging.level.org.hibernate.SQL=DEBUG
    
    spring.datasource.azure.passwordless-enabled=true
    spring.datasource.url=jdbc:mysql://mysqlsingletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC
    spring.datasource.username=<your_mysql_ad_non_admin_username>@mysqlsingletest
    
    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL8Dialect
    

    警告

    構成プロパティ spring.datasource.url?serverTimezone=UTC が追加されているのは、データベースへの接続時に UTC 日付形式 (協定世界時) を使用するように JDBC ドライバーに指示するためです。 このパラメーターがないと、Java サーバーではデータベースと同じ日付形式が使用されず、エラーが発生します。

  1. 新しい Todo Java クラスを作成します。 このクラスは、JPA によって自動的に作成される、todo テーブルにマップされたドメイン モデルです。 次のコードは、getters メソッドと setters メソッドを無視します。

    package com.example.demo;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    @Entity
    public class Todo {
    
        public Todo() {
        }
    
        public Todo(String description, String details, boolean done) {
            this.description = description;
            this.details = details;
            this.done = done;
        }
    
        @Id
        @GeneratedValue
        private Long id;
    
        private String description;
    
        private String details;
    
        private boolean done;
    
    }
    
  2. スタートアップ クラス ファイルを編集して、次の内容を表示します。

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.context.event.ApplicationReadyEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.annotation.Bean;
    import org.springframework.data.jpa.repository.JpaRepository;
    
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    @SpringBootApplication
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @Bean
        ApplicationListener<ApplicationReadyEvent> basicsApplicationListener(TodoRepository repository) {
            return event->repository
                .saveAll(Stream.of("A", "B", "C").map(name->new Todo("configuration", "congratulations, you have set up correctly!", true)).collect(Collectors.toList()))
                .forEach(System.out::println);
        }
    
    }
    
    interface TodoRepository extends JpaRepository<Todo, Long> {
    
    }
    

    ヒント

    このチュートリアルでは、構成またはコードに認証操作はありません。 ただし、Azure サービスに接続するには認証が必要です。 認証を完了するには、Azure ID を使用する必要があります。 Spring Cloud Azure では、DefaultAzureCredential を使用します。これは、コードを変更せずに資格情報を取得できるようにするために、Azure ID ライブラリで提供されます。

    DefaultAzureCredential は複数の認証方法をサポートしており、実行時に使用する方法が決定されます。 このアプローチを採用すると、環境固有のコードを実装することなく、異なる環境 (ローカルと運用環境など) で異なる認証方法をアプリに使用できます。 詳細については、DefaultAzureCredential を参照してください。

    ローカル開発環境で認証を完了するには、Azure CLI、Visual Studio Code、PowerShell、またはその他の方法を使用できます。 詳細については、「Java 開発環境での Azure 認証」を参照してください。 Azure ホスティング環境で認証を完了するには、ユーザー割り当てマネージド ID を使用することをお勧めします。 詳細については、「Azure リソースのマネージド ID とは」を参照してください。

  3. アプリケーションを起動します。 次の例のようなログが表示されます。

    2023-02-01 10:29:19.763 DEBUG 4392 --- [main] org.hibernate.SQL : insert into todo (description, details, done, id) values (?, ?, ?, ?)
    com.example.demo.Todo@1f
    

Azure Spring Apps にデプロイする

Spring Boot アプリケーションがローカルで実行されたので、運用環境に移行します。 Azure Spring Apps では、コードを変更せずに、Spring Boot アプリケーションを Azure に簡単にデプロイできます。 Spring アプリケーションのインフラストラクチャはこのサービスによって管理されるため、開発者はコードに専念できます。 Azure Spring Apps では、包括的な監視と診断、構成管理、サービス検出、CI/CD 統合、ブルー/グリーン デプロイなどを使用して、ライフサイクルを管理できます。 Azure Spring Apps にアプリケーションをデプロイするには、「初めてのアプリケーションを Azure Spring Apps にデプロイする」を参照してください。

次のステップ