Secrets Manager JDBCは、secrets Managerが提供する動的ApsaraDB RDSシークレットに基づいて、ビジネスロジック、ベストプラクティス、およびデザインパターンをカプセル化します。 Secrets Manager JDBCを使用すると、Secrets Managerをビジネスシステムに統合できます。 Secrets Manager JDBCでは、データベースアプリケーションで動的ApsaraDB RDSシークレットを使用できます。 これにより、データベースアカウントのパスワードをハードコードする必要がなくなります。

機能

  • 一般的なJava Database Connectivity (JDBC) ドライバとシンプルなデータベース接続を提供します。
  • c3p0またはデータベース接続プール (DBCP) を使用してデータベースに接続します。
  • さまざまなアクセス方法を使用して、動的ApsaraDB RDSシークレットを取得できます。 たとえば、AccessKeyペア、Security Token Service (STS) 、またはElastic Compute Service (ECS) インスタンスのRAMロールを使用して、動的ApsaraDB RDSシークレットを取得できます。
  • シークレットの回転間隔をカスタマイズできます。

制限事項

  • 動的ApsaraDB RDSシークレットのみがサポートされています。 デュアルアカウントモードで動的ApsaraDB RDSシークレットを使用することを推奨します。 動的ApsaraDB RDSシークレットの作成方法の詳細については、「動的ApsaraDB RDSシークレットの作成」をご参照ください。
  • Java 1.8以降のみがサポートされています。
  • MySQL、SQL Server、PostgreSQL、またはMariaDB TXを実行するApsaraDB RDSインスタンスのみがサポートされています。

Secrets Manager JDBCのインストール

Secrets Manager JDBCはJavaで開発されています。 Secrets Manager JDBCのインストール方法の詳細については、aliyun-secretsmanager-jdbcをご参照ください。

次のMaven依存関係を追加することで、Secrets Manager JDBCをインストールできます。

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-secretsmanager-jdbc</artifactId>
    <version>x.x.x</version>
</dependency>
Secrets Manager JDBCのバージョンの詳細については、aliyun-secretsmanager-jdbc releaseをご参照ください。

アクセス方法の設定

Secrets Manager JDBCが起動すると、secretsmanager.propertiesファイルでアクセス方法が確認されます。 次の例は、異なるアクセス方法を設定する方法を示しています。

  • アプリケーションアクセスポイントのクライアントキーを使用したSecrets Managerへのアクセス

    この方法をお勧めします。 クライアントキーの作成方法の詳細については、「クライアントキーをAAPにバインドする」をご参照ください。

    Secrets Manager JDBC 1.0.7以降のバージョンは、アプリケーションアクセスポイントのクライアントキーを使用してSecrets Managerにアクセスすることをサポートしています。
    ## アクセス方法を指定します。 
    credentials_type=client_key
    ## クライアント鍵の復号化パスワードを読み取ります。 環境変数またはファイルからパスワードを読み込むことができます。 
    client_key_password_from_env_variable=# クライアント鍵秘密鍵パスワード環境変数#
    client_key_password_from_file_path=# クライアント鍵秘密鍵パスワードファイルパス#
    ## クライアント鍵の秘密鍵ファイルを読み込みます。 
    client_key_private_key_path=# クライアント鍵秘密鍵ファイルパス#
    ## Key Management Service (KMS) のリージョンを指定します。 
    cache_client_region_id=[{"regionId":"#regionId#"}]
  • AccessKeyペアを使用したSecrets Managerへのアクセス
    ## アクセス方法を指定します。 
    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#"}]
    ## 回転間隔をカスタマイズします。 デフォルト値: 21600000 最小値: 300000。 単位:ミリ秒。 デフォルト値は6時間に相当し、最小値は5分に相当します。 
    refresh_secret_ttl=21600000
    AccessKey ペアの取得方法については、AccessKey ペアの取得をご参照ください。
  • STSを使用したSecrets Managerへのアクセス
    ## アクセス方法を指定します。 
    credentials_type=sts
    ## AccessKey IDを指定します。 
    credentials_access_key_id=#credentials_access_key_id#
    ## AccessKey secretを指定します。 
    credentials_access_secret=#credentials_access_secret#
    ## 動的ApsaraDB RDSシークレットを取得するセッションの名前を指定します。 
    credentials_role_session_name=#credentials_role_session_name#
    ## RAMロールのAlibaba Cloudリソース名 (ARN) を指定します。 
    credentials_role_arn=#credentials_role_arn#
    ## 動的ApsaraDB RDSシークレットの取得に使用するポリシーを指定します。 
    credentials_policy=#credentials_policy#
    ## KMSのリージョンを指定します。 
    cache_client_region_id=[{"regionId":"#regionId#"}]
    ## 回転間隔をカスタマイズします。 デフォルト値: 21600000 最小値: 300000。 単位:ミリ秒。 デフォルト値は6時間に相当し、最小値は5分に相当します。 
    refresh_secret_ttl=21600000
    AccessKey ペアの取得方法については、AccessKey ペアの取得をご参照ください。
  • ECSインスタンスのRAMロールを使用したSecrets Managerへのアクセス
    ## アクセス方法を指定します。 
    credentials_type=ecs_ram_role
    ## RAMロールの名前を指定します。 
    credentials_role_name=#credentials_role_name#
    ## KMSのリージョンを指定します。 
    cache_client_region_id=[{"regionId":"#regionId#"}]
    ## 回転間隔をカスタマイズします。 デフォルト値: 21600000 最小値: 300000。 単位:ミリ秒。 デフォルト値は6時間に相当し、最小値は5分に相当します。 
    refresh_secret_ttl=21600000
    RAMロールを作成し、RAMロールをECSインスタンスに割り当てる方法の詳細については、「t1996953.html#task_2001511」をご参照ください。

サンプルコード

  • JDBCによるデータベースへのアクセス

    次のサンプルコードは、JDBCを使用してApsaraDB RDS for MySQLインスタンスにアクセスする方法の例を示しています。

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class SecretManagerJDBCSample {
    
        public static void main(String[] args) throws Exception {
            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();
            }
        }
    }
  • c3p0接続プールを使用したデータベースへのアクセス

    次のサンプルコードは、c3p0.properties設定ファイルの例を示しています。

    c3p0.us er=#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>
  • オープンソースフレームワークを使用したデータベースへのアクセス

    次のサンプルコードは、Spring構成ファイルの例を示しています。

    <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="500" />
          <property name="minPoolSize" value="5" />
          <property name="initialPoolSize" value="20" />
      </bean>
      <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
          <property name="dataSource" ref="dataSource" />
      </bean>