私は現在、EclipseとAWS Toolkit forEclipseを使用しています。私のプロジェクトはすでに機能しており、RDSインスタンスに接続し、JSONオブジェクトをAPIGateway呼び出しに返すという仕事をしています。
新しい要件がありました。サービスSecretsManagerを使用して、ユーザーやパスワードなどのRDS構成を自動的にローテーションします。
問題は、GetSecretValueResponse
などのクラスをインポートしようとすると、The import com.amazonaws.services.secretsmanager cannot be resolved
が返されることです。ドキュメントとSDKを調べてみると、GetSecretValueRequest
は存在しますが、GetSecretValueResponse
は存在しないため、どうすればよいかわからず、類似したものも見つかりませんでした。私が勉強できる例。
次のコードは私が実装しようとしているものであり、Amazon自体によって提供されます(Secrets Managerページには、クリックしてJavaでどのように動作するかを確認できるボタンがあります)。これは変更なしで表示されます。しかし、私が言ったように、いくつかのクラスをインポートする方法がわからないためです。
// Use this code snippet in your app.
public static void getSecret() {
String secretName = "secretName";
String endpoint = "secretEndpoint";
String region = "region";
AwsClientBuilder.EndpointConfiguration config = new AwsClientBuilder.EndpointConfiguration(endpoint, region);
AWSSecretsManagerClientBuilder clientBuilder = AWSSecretsManagerClientBuilder.standard();
clientBuilder.setEndpointConfiguration(config);
AWSSecretsManager client = clientBuilder.build();
String secret;
ByteBuffer binarySecretData;
GetSecretValueRequest getSecretValueRequest = GetSecretValueRequest.builder()
.withSecretId(secretName)
.build();
GetSecretValueResponse getSecretValueResponse = null;
try {
getSecretValueResponse = client.getSecretValue(getSecretValueRequest);
} catch(ResourceNotFoundException e) {
System.out.println("The requested secret " + secretName + " was not found");
} catch (InvalidRequestException e) {
System.out.println("The request was invalid due to: " + e.getMessage());
} catch (InvalidParameterException e) {
System.out.println("The request had invalid params: " + e.getMessage());
}
if(getSecretValueResponse == null) {
return;
}
// Decrypted secret using the associated KMS CMK
// Depending on whether the secret was a string or binary, one of these fields will be populated
if(getSecretValueResponse.getSecretString() != null) {
secret = getSecretValueResponse.getSecretString();
}
else {
binarySecretData = getSecretValueResponse.getSecretBinary();
}
// Your code goes here.
}
同じ問題が発生しました。AWSページにあるコードはそのままでは機能しません。探しているクラスはGetSecretValueResult
です。最新のJava docs)
これが機能する部分です:
public void printRdsSecret() throws IOException {
String secretName = "mySecretName";
System.out.println("Requesting secret...");
AWSSecretsManager client = AWSSecretsManagerClientBuilder.standard().build();
GetSecretValueRequest getSecretValueRequest = new GetSecretValueRequest().withSecretId(secretName);
GetSecretValueResult getSecretValueResult = client.getSecretValue(getSecretValueRequest);
System.out.println("secret retrieved ");
final String secretBinaryString = getSecretValueResult.getSecretString();
final ObjectMapper objectMapper = new ObjectMapper();
final HashMap<String, String> secretMap = objectMapper.readValue(secretBinaryString, HashMap.class);
String url = String.format("jdbc:postgresql://%s:%s/dbName", secretMap.get("Host"), secretMap.get("port"));
System.out.println("Secret url = "+url);
System.out.println("Secret username = "+secretMap.get("username"));
System.out.println("Secret password = "+secretMap.get("password"));
}
これは、バージョンaws-Java-sdk-secretsmanager
の1.11.337
でテストされました。
RDSにアクセスするにはawsシークレットマネージャーjdbcラッパーを使用することをお勧めします( https://github.com/aws/aws-secretsmanager-jdbc )。 RDSクライアントに渡す前に、シークレットのフェッチ、デコード、テキスト内のパスワードを使用した移動を行う必要はありません。
シークレットIDをRDSクライアントに渡すだけで、残りはjdbcラッパーが処理します。