web-dev-qa-db-ja.com

AWS SecretsManagerを使用してRDSアクセスを管理する

私は現在、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. 
}
6
monkey intern

同じ問題が発生しました。AWSページにあるコードはそのままでは機能しません。探しているクラスはGetSecretValueResultです。最新のJava docs)

https://docs.aws.Amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/secretsmanager/model/GetSecretValueResult.html

これが機能する部分です:

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-secretsmanager1.11.337でテストされました。

4
Nune Isabekyan

RDSにアクセスするにはawsシークレットマネージャーjdbcラッパーを使用することをお勧めします( https://github.com/aws/aws-secretsmanager-jdbc )。 RDSクライアントに渡す前に、シークレットのフェッチ、デコード、テキスト内のパスワードを使用した移動を行う必要はありません。

シークレットIDをRDSクライアントに渡すだけで、残りはjdbcラッパーが処理します。

1
Prakash Tanaji
1
ido flax