すべてのプロダクト
Search
ドキュメントセンター

:アプリケーションをSecrets Managerに接続する

最終更新日:Dec 18, 2024

複数の方法を使用して、アプリケーションをSecrets Managerに接続できます。 次に、アプリケーションは動的秘密を使用できます。

メソッド

次の表に、アプリケーションをSecrets Managerに接続するために使用できる方法を示します。

メソッド

説明

シナリオ

KMS SDK

KMS SDKを使用すると、HTTPSリクエストを構築してKMS APIをより有効に活用できます。

  • より少ない頻度でシークレット値を照会します。

  • シークレットを作成または削除するか、新しいバージョンのシークレット値を追加します。

Secrets Managerクライアント

Secrets Manager Clientでは、Secrets Manager Clientがsecrets Managerからシークレットを取得してキャッシュを更新する頻度を設定できます。

  • クライアントのシークレット値を定期的または頻繁にクエリします。

  • シークレット値に関連する操作を実行します。

Secrets Manager JDBC

Secrets Manager JDBCでは、Java Database Connectivity (JDBC) 接続を確立することで、secrets Managerで管理されているシークレットを使用できます。

動的ApsaraDB RDSシークレットとJavaプログラムを使用してデータベースにアクセスします。 詳細については、「Dynamic ApsaraDB RDSシークレットの概要」をご参照ください。

Managed secret plug-in for Alibaba Cloud SDKs

Alibaba Cloud SDKのマネージドシークレットプラグインを使用すると、動的なRAM (Resource Access Management) シークレットを使用して、より効率的にAlibaba Cloudサービスにアクセスできます。

ダイナミックRAMシークレットを使用してAlibaba Cloudサービスにアクセスします。 詳細については、「Dynamic RAMシークレットの概要」をご参照ください。

Secrets Manager Kubernetesプラグイン

Secrets Manager Kubernetesプラグインを使用すると、Secrets Managerを迅速かつコードレスな方法でシステムに統合できます。

定期的にコードレスで設定を更新します。

KMS SDKの使用

次の例は、KMS SDK for Javaを使用し、アプリケーションで動的ApsaraDB RDSシークレットを使用する方法を示しています。 動的ApsaraDB RDSシークレットの代わりに他のタイプのシークレットを使用する場合は、この方法を使用することもできます。

  1. KMS SDK for Javaの依存関係宣言を取得します。

    必要なSDKバージョンの詳細については、「SDKの概要」をご参照ください。 サンプル文:

     <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-core</artifactId>
        <version>4.5.16</version>
      </dependency>
      <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-kms</artifactId>
        <version>2.12.0</version>
      </dependency>
      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.4</version>
      </dependency> 
  2. アプリケーションをSecrets Managerに接続して、データベースへの接続に使用されるアカウントのユーザー名とパスワードを取得します。 次に、データベースへの接続を確立します。

    説明

    Alibaba CloudアカウントのAccessKeyペアには、すべてのAPI操作に対する権限があります。 AccessKeyペアを使用して操作を実行することは、リスクの高い操作です。 RAMユーザーを使用してAPI操作を呼び出したり、ルーチンのO&Mを実行することを推奨します。プロジェクトコードにAccessKey IDとAccessKey Secretを保存しないことを推奨します。 そうしないと、AccessKeyペアが漏洩し、アカウントに属するすべてのリソースのセキュリティが侵害される可能性があります。

    この例では、AccessKeyペアは、ID認証を実装するためにALIBABA_CLOUD_ACCESS_KEY_IDとALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数に保存されます。

    サンプルコード:

    package com.aliyun.kms.samples;
    
    import java.util.Map;
    import com.google.gson.Gson;
    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.http.FormatType;
    import com.aliyuncs.http.MethodType;
    import com.aliyuncs.http.ProtocolType;
    import com.aliyuncs.kms.model.v20160120.GetSecretValueRequest;
    import com.aliyuncs.kms.model.v20160120.GetSecretValueResponse;
    import com.aliyuncs.profile.DefaultProfile;
    import com.aliyuncs.profile.IClientProfile;
    import org.apache.commons.lang3.tuple.Pair;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class RdsSecretSampleCode {
    
        private static final String MYSQL_JDBC_DRIVER = "com.mysql.jdbc.Driver";
        private static final String MSSQL_JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    
        private static KmsClient kmsClient;
    
        static {
            kmsClient = KmsClient.getKMSClient("<regionId>", System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        }
    
        static class KmsClient {
            private DefaultAcsClient acsClient;
    
            private KmsClient(DefaultAcsClient acsClient) {
                this.acsClient = acsClient;
            }
    
            private static KmsClient getKMSClient(String regionId, String accessKeyId, String accessKeySecret) {
                IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
                DefaultAcsClient client = new DefaultAcsClient(profile);
                return new KmsClient(client);
            }
        }
    
        // Obtain the connection string of a database that is created on an ApsaraDB RDS for MySQL instance by using the obtained secret. 
        public static Connection getMySQLConnectionBySecret(String secretName, String jdbcUrl) throws ClassNotFoundException, SQLException, ClientException {
            Class.forName(MYSQL_JDBC_DRIVER);
            Pair<String, String> userAndPasswordPair = getUserAndPasswordPair(secretName);
            return DriverManager.getConnection(jdbcUrl, userAndPasswordPair.getKey(), userAndPasswordPair.getValue());
        }
    
        // Obtain the connection string of a database that is created on a Microsoft SQL Server instance by using the obtained secret. 
        public static Connection getMSSQLConnectionBySecret(String secretName, String jdbcUrl) throws ClassNotFoundException, SQLException, ClientException {
            Class.forName(MSSQL_JDBC_DRIVER);
            Pair<String, String> userAndPasswordPair = getUserAndPasswordPair(secretName);
            return DriverManager.getConnection(jdbcUrl, userAndPasswordPair.getKey(), userAndPasswordPair.getValue());
        }
    
        // Obtain the username and password of the account that is used to connect to the database from the obtained secret. 
        private static Pair<String, String> getUserAndPasswordPair(String secretName) throws ClientException {
            final GetSecretValueRequest request = new GetSecretValueRequest();
            request.setProtocol(ProtocolType.HTTPS);
            request.setAcceptFormat(FormatType.JSON);
            request.setMethod(MethodType.POST);
            request.setSecretName(secretName);
            GetSecretValueResponse response = kmsClient.acsClient.getAcsResponse(request);
            Map<String,String> map = new Gson().fromJson(response.getSecretData(), Map.class);
            return Pair.of(map.get("AccountName"), map.get("AccountPassword"));
        }
    }