このチュートリアルでは、Spring Data JDBC を使用して Azure Database for MySQL データベースにデータを格納する方法について説明します。
JDBC は、従来のリレーショナル データベースに接続するための標準の 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 に格納されるため、ユーザーが自分でパスワードのローテーションを管理する必要があります。
前提条件
Azure サブスクリプション - 無料で作成します。
Java Development Kit (JDK)、バージョン 8 以降。
Spring Boot アプリケーションがない場合は、 Spring Initializr を使用して Maven プロジェクトを作成します。 必ず Maven プロジェクトを選択し、[依存関係] で Spring Web、Spring Data JDBC、および MySQL ドライバーの依存関係を追加してから、Java バージョン 8 以降を選択してください。
- お持ちでない場合は、
mysqlflexibletest
という名前の Azure Database for MySQL フレキシブル サーバー インスタンスを作成します。 手順については、「 クイック スタート: Azure portal を使用して Azure Database for MySQL フレキシブル サーバーを作成する」を参照してください。 次に、demo
という名前のデータベースを作成します。 手順については、「 Azure Database for MySQL フレキシブル サーバーのデータベースの作成と管理」を参照してください。
サンプル アプリケーションを確認する
このチュートリアルでは、サンプル アプリケーションをコーディングします。 より早く進めたい場合は、このアプリケーションは既にコーディングされており、https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql で入手できます。
MySQL サーバーのファイアウォール規則を構成する
Azure Database for MySQL インスタンスは、既定でセキュリティ保護されています。 受信接続を一切許可しないファイアウォールがあります。
データベースを使えるようにするには、サーバーのファイアウォールを開き、ローカル IP アドレスがデータベース サーバーにアクセスできるようにします。 詳細については、 Azure portal を使用した Azure Database for MySQL - フレキシブル サーバーのファイアウォール規則の管理に関するページを参照してください。
Windows コンピューター上の Linux 用 Windows サブシステム (WSL) から MySQL サーバーに接続している場合は、WSL ホストの IP アドレスをファイアウォールに追加する必要があります。
MySQL の非管理者ユーザーを作成し、アクセス許可を付与する
このステップでは、非管理者ユーザーを作成し、demo
データベースに対するすべてのアクセス許可を付与します。
次の方法を使って、パスワードレス接続を使う非管理者ユーザーを作成できます。
次のコマンドを使用して、Azure CLI 用の Service Connector パスワードレス拡張機能をインストールします。
az extension add --name serviceconnector-passwordless --upgrade
次のコマンドを使って、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.23.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
注
Spring Boot 2.x をお使いの場合は、必ず
spring-cloud-azure-dependencies
バージョンを4.20.0
に設定してください。 この部品表 (BOM) は、pom.xml ファイルの<dependencyManagement>
セクションで構成する必要があります。 これにより、すべての 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>
注
パスワードレス接続は、バージョン 4.5.0
からサポートされるようになっています。
Azure Database for MySQL を使用するように Spring Boot を構成する
Spring Data JDBC を使って Azure Database for MySQL からデータを格納するには、次の手順のようにしてアプリケーションを構成します。
application.properties 構成ファイルに次のプロパティを追加して、Azure Database for MySQL 資格情報を構成します。
logging.level.org.springframework.jdbc.core=DEBUG spring.datasource.url=jdbc:mysql://mysqlflexibletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC spring.datasource.username=<your_mysql_ad_non_admin_username> spring.datasource.azure.passwordless-enabled=true spring.sql.init.mode=always
警告
spring.sql.init.mode=always
構成プロパティは、サーバーが起動されるたびに、次に作成するschema.sql ファイルを使用して、Spring Boot によってデータベース スキーマが自動的に生成されることを意味します。 この機能はテストには適していますが、再起動するたびにデータが削除されるため、運用環境では使わないでください。構成プロパティ
spring.datasource.url
に?serverTimezone=UTC
が追加されているのは、データベースへの接続時に UTC 日付形式 (協定世界時) を使用するように JDBC ドライバーに指示するためです。 このパラメーターがないと、Java サーバーではデータベースと同じ日付形式が使われず、エラーが発生します。
- お持ちでない場合は、
mysqlsingletest
という名前の Azure Database for MySQL 単一サーバー インスタンスを作成します。 手順については、「 クイック スタート: Azure portal を使用して Azure Database for MySQL サーバーを作成する」を参照してください。 次に、demo
という名前のデータベースを作成します。 手順については、「Azure Database for MySQL でユーザーを作成する」の「データベースの作成」セクションを参照してください。
サンプル アプリケーションを確認する
この記事では、サンプル アプリケーションをコーディングします。 より早く進めたい場合は、このアプリケーションは既にコーディングされており、https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql で入手できます。
MySQL サーバーのファイアウォール規則を構成する
Azure Database for MySQL インスタンスは、既定でセキュリティ保護されています。 受信接続を一切許可しないファイアウォールがあります。
データベースを使えるようにするには、サーバーのファイアウォールを開き、ローカル IP アドレスがデータベース サーバーにアクセスできるようにします。 詳細については、 Azure portal を使用した Azure Database for MySQL ファイアウォール規則の作成と管理に関するページを参照してください。
Windows コンピューター上の Linux 用 Windows サブシステム (WSL) から MySQL サーバーに接続している場合は、WSL ホストの IP アドレスをファイアウォールに追加する必要があります。
MySQL の非管理者ユーザーを作成し、アクセス許可を付与する
このステップでは、非管理者ユーザーを作成し、demo
データベースに対するすべてのアクセス許可を付与します。
重要
パスワードレス接続を使うには、Azure Database for MySQL インスタンス用の Microsoft Entra 管理者ユーザーを作成します。 詳細については、「MySQL での認証に Microsoft Entra ID を使用する」の「Microsoft Entra Admin ユーザーの設定」セクションを参照してください。
管理者以外のユーザーを作成するための 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 管理者ユーザーでサインインし、アクセス トークンをパスワードとして取得する必要があります。 詳細については、「 MySQL での認証に Microsoft Entra ID を使用する」を参照してください。
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.23.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
注
Spring Boot 2.x をお使いの場合は、必ず
spring-cloud-azure-dependencies
バージョンを4.20.0
に設定してください。 この部品表 (BOM) は、pom.xml ファイルの<dependencyManagement>
セクションで構成する必要があります。 これにより、すべての 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>
注
パスワードレス接続は、バージョン 4.5.0
からサポートされるようになっています。
Azure Database for MySQL を使用するように Spring Boot を構成する
Spring Data JDBC を使って Azure Database for MySQL からデータを格納するには、次の手順のようにしてアプリケーションを構成します。
application.properties 構成ファイルに次のプロパティを追加して、Azure Database for MySQL 資格情報を構成します。
logging.level.org.springframework.jdbc.core=DEBUG 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.datasource.azure.passwordless-enabled=true spring.sql.init.mode=always
警告
spring.sql.init.mode=always
構成プロパティは、サーバーが起動されるたびに、次に作成するschema.sql ファイルを使用して、Spring Boot によってデータベース スキーマが自動的に生成されることを意味します。 この機能はテストには適していますが、再起動するたびにデータが削除されるため、運用環境では使わないでください。構成プロパティ
spring.datasource.url
に?serverTimezone=UTC
が追加されているのは、データベースへの接続時に UTC 日付形式 (協定世界時) を使用するように JDBC ドライバーに指示するためです。 このパラメーターがないと、Java サーバーではデータベースと同じ日付形式が使われず、エラーが発生します。
src/main/resources/schema.sql 構成ファイルを作成してデータベース スキーマを構成し、次の内容を追加します。
DROP TABLE IF EXISTS todo; CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
新しい
Todo
Java クラスを作成します。 このクラスは、Spring Boot によって自動的に作成されるtodo
テーブルにマップされるドメイン モデルです。 次のコードでは、getters
とsetters
メソッドは無視されています。import org.springframework.data.annotation.Id; public class Todo { public Todo() { } public Todo(String description, String details, boolean done) { this.description = description; this.details = details; this.done = done; } @Id private Long id; private String description; private String details; private boolean done; }
次に示す内容になるように、スタートアップ クラス ファイルを編集します。
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.repository.CrudRepository; 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)).toList()) .forEach(System.out::println); } } interface TodoRepository extends CrudRepository<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 とは」を参照してください。
アプリケーションを起動します。 アプリケーションがデータベースにデータを格納します。 次の例のようなログが表示されます。
2023-02-01 10:22:36.701 DEBUG 7948 --- [main] o.s.jdbc.core.JdbcTemplate : Executing prepared SQL statement [INSERT INTO todo (description, details, done) VALUES (?, ?, ?)] com.example.demo.Todo@4bdb04c8
Azure Spring Apps にデプロイする
Spring Boot アプリケーションがローカル環境で動くようになったので、運用環境に移行します。 Azure Spring Apps を使用すると、コードを変更することなく、Spring Boot アプリケーションを Azure に簡単にデプロイできます。 Spring アプリケーションのインフラストラクチャはこのサービスによって管理されるため、開発者はコードに専念できます。 Azure Spring Apps では、包括的な監視と診断、構成管理、サービス検出、CI/CD 統合、ブルー/グリーン デプロイなどを使用して、ライフサイクルを管理できます。 Azure Spring Apps にアプリケーションをデプロイするには、「 初めてのアプリケーションを Azure Spring Apps にデプロイする」を参照してください。