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 資格情報認証を使用した認証のしくみをまとめたものです。 矢印は通信経路を示します。
構成
Spring Cloud Azure for MySQL では、次の 2 つのレベルの構成オプションがサポートされています。
credential
のプレフィックスを持つprofile
とspring.cloud.azure
のグローバル認証構成オプション。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-enabled | マネージド ID を有効にして Azure で認証するかどうかを指定します。
true と client-id が設定されている場合は、クライアント ID をユーザー割り当てマネージド ID クライアント ID として使用します。 既定値は false です。 |
spring.datasource.azure.credential.password | Azure でユーザー名/パスワード認証を実行するときに使用するパスワード。 |
spring.datasource.azure.credential.ユーザー名 | 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 に使用できる値は、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 開発者ガイド」の「Getting started」セクションを参照してください。
基本的な使用方法
以降のセクションでは、従来の Spring Boot アプリケーションの使用シナリオを示します。
大事な
パスワードレス接続では、Microsoft Entra 認証が使用されます。 Microsoft Entra 認証を使用するには、まず Microsoft Entra 管理者ユーザーを設定する必要があります。 Microsoft Entra ID ベースの認証に対してユーザーを作成して有効にできるのは、Microsoft Entra 管理者ユーザーだけです。 詳細については、「Spring Data JDBC と Azure Database for MySQLを使用する」を参照してください。
パスワードなしで Azure MySQL にローカルに接続する
ユーザーを作成し、アクセス許可を付与するには、「Spring Data JDBC と Azure Database for MySQLを使用する」の「MySQL 非管理者ユーザーの作成とアクセス許可の付与」セクションを参照してください。
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 に接続する
サービス プリンシパル用の Microsoft Entra ユーザーを作成し、アクセス許可を付与します。
まず、次のコマンドを使用して、いくつかの環境変数を設定します。
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)
次に、管理者以外のユーザーを作成するための 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
次のコマンドを使用して 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
次のコマンドを使用して、一時 SQL スクリプト ファイルを削除します。
rm create_ad_user_sp.sql
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 に接続する
マネージド ID を有効にするには、「
アプリケーションを移行して Azure Database for MySQL とのパスワードレス接続を使用する」の「Azure portal を使用してマネージド ID を割り当てる」のセクションを参照してください。 アクセス許可を付与するには、「アプリケーションを移行して Azure Database for MySQLとのパスワードレス接続を使用する
」の「 マネージド ID へのロールの割り当て 」セクションを参照してください。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 リポジトリを参照してください。