Java Database Connectivity (JDBC) を使用してデータベースに接続する場合、データベースのアカウントとパスワードを RDS シークレットまたは汎用シークレットに保存できます。その後、secrets JDBC クライアントをアプリケーションに統合して、Key Management Service (KMS) で管理されているシークレットを使用してデータベース接続を認証できます。このトピックでは、secrets JDBC クライアントのインストール方法と使用方法について説明します。
SDK の概要
secrets JDBC クライアントは、JDBC を使用してデータベースに接続するシナリオ向けに設計されています。クライアントは KMS からシークレットを自動的に取得してデータベース接続を認証するため、統合が簡素化されます。シークレットを取得して使用する必要がある他のシナリオでは、secrets クライアントを使用することをお勧めします。または、KMS インスタンス SDK または Alibaba Cloud SDK を使用することもできます。詳細については、「SDK リファレンス」をご参照ください。
シークレットの管理操作は、Alibaba Cloud SDK を使用してのみ実行できます。
secrets JDBC クライアントは、次の特徴を提供します。
c3p0 や DBCP などの接続プール内のデータベース接続、およびデータソースを含む JDBC をサポートします。
MySQL、SQL Server、PostgreSQL、MariaDB の 4 種類のデータベースをサポートします。
カスタムのシークレット更新頻度をサポートします。
注意事項
サポートされるシークレットタイプ: 汎用シークレットと RDS シークレット。
RDS シークレットを使用する場合は、デュアルアカウントで管理される RDS シークレットを使用することをお勧めします。
汎用シークレットを使用する場合、シークレット値は次の JSON フォーマットである必要があります。
{ "AccountName":"<your_database_account_username>", "AccountPassword":"<your_database_account_password>" }
サポートされるプログラミング言語: Java 8 以降。
サポートされるデータベース接続プール: c3p0、DBCP、および Druid。
重要Spring Boot のデフォルトの HikariCP 接続プールは、JDBC エラーコードを標準的な方法で処理しません。これにより、KMS シークレットのリフレッシュが失敗する可能性があります。
ステップ 1: アクセス資格情報の作成
シナリオ 1: 共有ゲートウェイを使用してシークレット値を取得する
インターネットまたは VPC (Virtual Private Cloud) を使用できます。サポートされている RAM ベースの認証方式には、Elastic Compute Service (ECS) インスタンスのインスタンス RAM ロール、RamRoleArn、セキュリティトークンサービス (STS) トークン、および AccessKey が含まれます。詳細については、「アクセス資格情報の管理」をご参照ください。
ECS インスタンス RAM ロール
RamRoleArn
STS トークン
AccessKey
ClientKey (非推奨)
シナリオ 2: 専用ゲートウェイを使用してシークレット値を取得する (非推奨)
このシナリオでは、KMS プライベートネットワークを使用します。アクセス資格情報として使用できるのは ClientKey のみです。
ステップ 2: クライアントのインストール
Maven を使用して、プロジェクトに secrets JDBC クライアントをインストールできます。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-secretsmanager-jdbc</artifactId>
<version>x.x.x</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.x.x</version>
</dependency>SDK の 最新バージョン をインストールすることをお勧めします。インストールとソースコードの詳細については、「aliyun-secretsmanager-jdbc」をご参照ください。
ステップ 3: secretsmanager.properties 構成ファイルを使用してクライアントを初期化する
secretsmanager.properties 構成ファイルをプロジェクトに追加します。パラメーターは、使用するアクセス資格情報によって異なります。
AccessKey
## アクセス資格情報のタイプ。
credentials_type=ak
## AccessKey ID。
credentials_access_key_id=#credentials_access_key_id#
## AccessKey Secret。
credentials_access_secret=#credentials_access_secret#
## 関連付けられた KMS サービスのリージョン。
cache_client_region_id=[{"regionId":"#regionId#"}]
## カスタムの更新頻度。デフォルト値: 6 時間。最小値: 5 分。単位: ミリ秒。
refresh_secret_ttl=21600000RAMRoleArn
## アクセス資格情報のタイプ。
credentials_type=ram_role
## AccessKey ID。
credentials_access_key_id=#credentials_access_key_id#
## AccessKey Secret。
credentials_access_secret=#credentials_access_secret#
## アクセス資格情報に関連付けられたセッションの名前。
credentials_role_session_name=#credentials_role_session_name#
## RAM ロールの ARN。
credentials_role_arn=#credentials_role_arn#
## アクセス資格情報のポリシー。
credentials_policy=#credentials_policy#
## 関連付けられた KMS サービスのリージョン。
cache_client_region_id=[{"regionId":"#regionId#"}]
## カスタムの更新頻度。デフォルト値: 6 時間。最小値: 5 分。単位: ミリ秒。
refresh_secret_ttl=21600000ECS インスタンス RAM ロール
## アクセス資格情報のタイプ。
credentials_type=ecs_ram_role
## ECS RAM ロールの名前。
credentials_role_name=#credentials_role_name#
## 関連付けられた KMS サービスのリージョン。
cache_client_region_id=[{"regionId":"#regionId#"}]
## カスタムの更新頻度。デフォルト値: 6 時間。最小値: 5 分。単位: ミリ秒。
refresh_secret_ttl=21600000STS トークン
## アクセス資格情報のタイプ。
credentials_type=sts
## AccessKey ID。
credentials_access_key_id=#credentials_access_key_id#
## AccessKey Secret。
credentials_access_secret=#credentials_access_secret#
## アクセス資格情報に関連付けられたセッションの名前。
credentials_role_session_name=#credentials_role_session_name#
## RAM ロールの ARN。
credentials_role_arn=#credentials_role_arn#
## アクセス資格情報のポリシー。
credentials_policy=#credentials_policy#
## 関連付けられた KMS サービスのリージョン。
cache_client_region_id=[{"regionId":"#regionId#"}]
## カスタムの更新頻度。デフォルト値: 6 時間。最小値: 5 分。単位: ミリ秒。
refresh_secret_ttl=21600000ClientKey (共有ゲートウェイ)
## アクセス資格情報のタイプ。
credentials_type=client_key
# ClientKey ファイルのパス。
client_key_private_key_path=#your client key private key file path#
## ClientKey の復号パスワード。パスワードは環境変数またはファイルから読み取ることができます。
client_key_password_from_env_variable=#your client key private key password environment variable name#
client_key_password_from_file_path=#your client key private key password file path#
## 関連付けられた KMS サービスのリージョン。
cache_client_region_id=[{"regionId":"#regionId#"}]
## カスタムの更新頻度。デフォルト値: 6 時間。最小値: 5 分。単位: ミリ秒。
## 次の構成では、シークレットの更新頻度を 1 時間に設定します。
refresh_secret_ttl=3600000ClientKey (専用ゲートウェイ)
方法 1: 環境変数からクライアントキーのパスワードを取得する
cache_client_dkms_config_info=[{"regionId":"<DKMS_REGION_ID>","endpoint":"<DKMS_ENDPOINT>","passwordFromEnvVariable":"<PASSWORD_ENV_VARIABLE>","clientKeyFile":"<CLIENT_KEY_FILE_PATH>","ignoreSslCerts":false,"caFilePath":"<CA_CERTIFICATE_FILE_PATH>"}]ファイルを設定する前に、カスタム名で環境変数を定義し、クライアントキーのパスワードをその値として設定します。次に、
<PASSWORD_ENV_VARIABLE>を変数名に置き換えます。例:
cache_client_dkms_config_info=[{"regionId":"ap-southeast-1","endpoint":"kst-hzz634e67d126u9p9****.cryptoservice.kms.aliyuncs.com","passwordFromEnvVariable":"passwordFromEnvVariable","clientKeyFile":"C:\RamSecretPlugin\src\main\resources\clientKey_KAAP.json","ignoreSslCerts":false,"caFilePath":"C:\RamSecretPlugin\src\main\resources\PrivateKmsCA_kst-hzz634e67d126u9p9****.pem"}]方法 2: ファイルからクライアントキーのパスワードを取得する
ダウンロード後の [Client Key Password (ClientKeyPassword)] のデフォルトのファイル名は
clientKey_****_Password.txtです。ファイルの名前を変更できますが、cache_client_dkms_config_info の値にある<your Client Key file path>を新しいファイルパスに置き換える必要があります。cache_client_dkms_config_info=[{"regionId":"<your dkms regionId >","endpoint":"<your dkms endpoint>","passwordFromFilePath":"< your password file path >","clientKeyFile":"<your Client Key file path>","ignoreSslCerts":false,"caFilePath":"<your CA certificate file path>"}]例:
cache_client_dkms_config_info=[{"regionId":"cn-hangzhou","endpoint":"kst-hzz634e67d126u9p9****.cryptoservice.kms.aliyuncs.com","passwordFromFilePath":"C:\RamSecretPlugin\src\main\resources\clientKeyPassword.txt","clientKeyFile":"C:\RamSecretPlugin\src\main\resources\clientKey_KAAP.json","ignoreSslCerts":false,"caFilePath":"C:\RamSecretPlugin\src\main\resources\PrivateKmsCA_kst-hzz634e67d126u9p9****.pem"}]
ステップ 4: secrets JDBC クライアントを使用してデータベースに接続する
この例では、変更が必要なプロパティのみを提供します。必要に応じて他のプロパティを設定できます。
JDBC を使用してデータベースに接続する
MySQL データベース
説明サンプルコードの
#your-mysql-secret-name#、<your-mysql-ip>、<your-mysql-port>、および<your-database-name>を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SecretManagerJDBCSample { public static void main(String[] args) throws Exception { // Alibaba Cloud secrets JDBC クライアント com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver をロードします。 Class.forName("com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver"); Connection connect = null; try { connect = DriverManager.getConnection("secrets-manager:mysql://<your-mysql-ip>:<your-mysql-port>/<your-database-name>", "#your-mysql-secret-name#",""); } catch(SQLException e) { e.printStackTrace(); } } }SQL Server データベース
説明サンプルコードの
#your-sqlserver-secret-name#、<your-sqlserver-ip>、<your-sqlserver-port>、および<your-database-name>を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SecretManagerJDBCSqlServerSample { public static void main(String[] args) throws Exception{ // Alibaba Cloud secrets JDBC クライアント com.aliyun.kms.secretsmanager.MssqlSecretsManagerSimpleDriver をロードします。 Class.forName("com.aliyun.kms.secretsmanager.MssqlSecretsManagerSimpleDriver"); Connection connect = null; try { connect = DriverManager.getConnection("secrets-manager:sqlserver://<your-sqlserver-ip>:<your-sqlserver-port>;databaseName=<your-database-name>", "#your-sqlserver-secret-name#", ""); } catch (SQLException e) { e.printStackTrace(); } } }PostgreSQL データベース
説明サンプルコードの
#your-postgresql-secret-name#、<your-postgresql-ip>、<your-postgresql-port>、および<your-database-name>を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SecretManagerJDBCPostgreSQLSample { public static void main(String[] args) throws Exception { // Alibaba Cloud secrets JDBC クライアント com.aliyun.kms.secretsmanager.PostgreSQLSecretManagerSimpleDriver をロードします。 Class.forName("com.aliyun.kms.secretsmanager.PostgreSQLSecretManagerSimpleDriver"); Connection connect = null; try { connect = DriverManager.getConnection("secrets-manager:postgresql://<your-postgresql-ip>:<your-postgresql-port>/<your-database-name>", "#your-postgresql-secret-name#", ""); } catch (SQLException e) { e.printStackTrace(); } } }MariaDB データベース
説明サンプルコードの
#your-mariadb-secret-name#、<your-mariadb-ip>、<your-mariadb-port>、および<your-database-name>を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SecretManagerJDBCMarialDBSample { public static void main(String[] args) throws Exception{ // Alibaba Cloud secrets JDBC クライアント com.aliyun.kms.secretsmanager.MariaDBSecretManagerSimpleDriver をロードします。 Class.forName("com.aliyun.kms.secretsmanager.MariaDBSecretManagerSimpleDriver"); Connection connect = null; try { connect = DriverManager.getConnection("secrets-manager:mariadb://<your-mariadb-ip>:<your-mariadb-port>/<your-database-name>", "#your-mariadb-secret-name#", ""); } catch (SQLException e) { e.printStackTrace(); } } }
接続プールを使用してデータベースに接続する
c3p0.properties 構成ファイルで c3p0.user、c3p0.driverClass、および c3p0.jdbcUrl を設定します。c3p0.user をシークレットの名前に設定し、c3p0.driverClass を Alibaba Cloud secrets JDBC ドライバークラスの名前に設定します。c3p0.jdbcUrl の値は secrets-manager で始まる必要があります。
MySQL データベース
説明サンプルコードの
#your-mysql-secret-name#、<your-mysql-ip>、<your-mysql-port>、および<your-database-name>を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。c3p0.user=#your-mysql-secret-name# c3p0.driverClass=com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver c3p0.jdbcUrl=secrets-manager:mysql://<your-mysql-ip>:<your-mysql-port>/<your-database-name>SQL Server データベース
説明サンプルコードの
#your-sqlserver-secret-name#、<your-sqlserver-ip>、<your-sqlserver-port>、および<your-database-name>を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。c3p0.user=#your-sqlserver-secret-name# c3p0.driverClass=com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver c3p0.jdbcUrl=secrets-manager:sqlserver://<your-sqlserver-ip>:<your-sqlserver-port>/<your-database-name>PostgreSQL データベース
説明サンプルコードの
#your-postgresql-secret-name#、<your-postgresql-ip>、<your-postgresql-port>、および<your-database-name>を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。c3p0.user=#your-postgresql-secret-name# c3p0.driverClass=com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver c3p0.jdbcUrl=secrets-manager:postgresql://<your-postgresql-ip>:<your-postgresql-port>/<your-database-name>MariaDB データベース
説明サンプルコードの
#your-mariadb-secret-name#、<your-mariadb-ip>、<your-mariadb-port>、および<your-database-name>を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。c3p0.user=#your-mariadb-secret-name# c3p0.driverClass=com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver c3p0.jdbcUrl=secrets-manager:mariadb://<your-mariadb-ip>:<your-mariadb-port>/<your-database-name>
データソースを使用してデータベースに接続する
この例では、c3p0 ComboPooledDataSource と MySQL データベースを使用します。Spring 構成ファイルに次の構成を追加します。
サンプルコードの #your-mysql-secret-name#、<your-mysql-ip>、<your-mysql-port>、および <your-database-name> を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
<property name="driverClass" value="com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver" />
<property name="user" value="#your-mysql-secret-name#" />
<property name="jdbcUrl" value="secrets-manager:mysql://<your-mysql-ip>:<your-mysql-port>/<your-database-name>" />
<property name="maxPoolSize" value="***" />
<property name="minPoolSize" value="***" />
<property name="initialPoolSize" value="***" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
<property name="dataSource" ref="dataSource" />
</bean>必要に応じて、maxPoolSize、minPoolSize、および initialPoolSize パラメーターの値を設定します。
Druid 接続プールを使用してデータベースに接続する
この例では MySQL データベースを使用します。構成ファイルで次のプロパティを変更する必要があります。
サンプルコードの #your-mysql-secret-name#、<your-mysql-ip>、<your-mysql-port>、および <your-database-name> を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。
プロパティ構成ファイルの使用
username=#your-mysql-secret-name# driverClassName=com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver url=secrets-manager:mysql://<your-mysql-ip>:<your-mysql-port>/<your-database-name>Bean 構成の使用
方法 1: XML 構成ファイル
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="username" value="${your-mysql-secret-name}" /> <property name="driverClassName" value="com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver" /> <property name="url" value="secrets-manager:mysql://<your-mysql-ip>:<your-mysql-port>/<your-database-name>" /> </bean>方法 2: プロパティインジェクション
アプリケーションでドライバークラスを作成して、データベース接続情報をロードします。
@Configuration public class DataConfig { @Value("${your-mysql-secret-name}") private String username; @Value("com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver") private String driverClassName; @Value("secrets-manager:mysql://<your-mysql-ip>:<your-mysql-port>/<your-database-name>") private String url; @Bean(name = "dataSource",initMethod = "init",destroyMethod = "close") public DruidDataSource dataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setUsername(username); druidDataSource.setDriverClassName(driverClassName); druidDataSource.setUrl(url); return druidDataSource; } }