應用程式可以採用多種方式接入憑據管家,動態使用憑據。
接入方式
應用程式可以使用多種開發工具接入憑據管家,不同開發工具說明及其應用情境如下:
開發工具 | 說明 | 應用情境 |
KMS SDK協助您構造HTTPS請求,更好地使用KMS API。 |
| |
憑據管家用戶端(SecretsManager Client)支援簡單地配置用戶端緩衝頻率,並定時重新整理儲存在憑據管家的憑據。 |
| |
憑據管家JDBC用戶端(SecretsManager JDBC)支援在JDBC串連中簡單地使用託管在憑據管家的憑據。 | 使用動態RDS憑據通過Java程式訪問資料庫 | |
多種阿里雲SDK的託管憑據外掛程式是一個協助您更有效通過動態RAM憑據快速使用阿里雲服務的外掛程式。 | 使用動態RAM憑據擷取阿里雲訪問憑據訪問阿里雲服務 | |
憑據管家Kubernetes外掛程式是一種以無代碼方式快速整合憑據管家能力的外掛程式。 | 以無代碼的方式周期性更新配置 |
使用KMS SDK
以下以Java語言為例,為您介紹如何在應用程式中使用動態RDS憑據。如果您使用的不是動態RDS憑據而是其他類型的憑據,也可以使用此方法。
擷取Key Management ServiceJava 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>
應用程式從憑據管家擷取資料庫帳號和口令,建立資料庫連接。
說明阿里雲帳號AccessKey擁有所有OpenAPI的存取權限,建議您使用RAM使用者進行API訪問或日常營運。強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
本樣本以將AccessKey配置在環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET的方式來實現身分識別驗證為例。
更多認證資訊配置方式,請參見管理訪問憑據。
不同作業系統的環境變數配置方法不同,具體操作,請參見在Linux、macOS和Windows系統配置環境變數。
範例程式碼如下:
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); } } // 通過憑據資訊擷取MySQL連結。 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()); } // 通過憑據資訊擷取MSSQL連結。 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()); } // 通過憑據資訊擷取指定的資料庫帳號和口令。 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")); } }