Conecte-se a um banco de dados SQL com credenciais em um segredo do AWS Secrets Manager - AWS Secrets Manager

Conecte-se a um banco de dados SQL com credenciais em um segredo do AWS Secrets Manager

Em aplicações Java, você pode usar os drivers de conexão SQL do Secrets Manager para se conectar aos bancos de dados MySQL, PostgreSQL, Oracle e MSSQLServer usando credenciais armazenadas no Secrets Manager. Cada driver empacota o driver JDBC base para que você possa usar chamadas JDBC para acessar o seu banco de dados. No entanto, em vez de passar um nome de usuário e senha para a conexão, você fornece o ID de um segredo. O driver chama o Secrets Manager para recuperar o valor do segredo e usa as credenciais no segredo para se conectar ao banco de dados. O driver também armazena em cache as credenciais usando a biblioteca em cache no lado do cliente de Java. Assim, as conexões futuras não exigem uma chamada para o Secrets Manager. Por padrão, o cache é atualizado a cada hora e também quando o segredo é alternado. Para configurar o cache, consulte SecretCacheConfiguration.

É possível baixar o código-fonte no GitHub.

Para usar os drivers de conexão SQL do Secrets Manager:

  • A sua aplicação deve estar em Java 8 ou superior.

  • O seu segredo deve ser um dos seguintes:

Se o banco de dados for replicado para outras regiões, para se conectar a uma réplica de banco de dados em outra região, especifique o endpoint regional e a porta ao criar a conexão. Você pode armazenar informações de conexão regional no segredo como pares de chave-valor adicionais, nos parâmetros do SSM Parameter Store ou na configuração do código.

Para adicionar o driver ao seu projeto, no arquivo de compilação do Maven pom.xml, adicione a seguinte dependência para o driver. Para obter mais informações, consulte Secrets Manager SQL Connection Library (Biblioteca de conexões SQL do Secrets Manager) no site Maven Central Repository.

<dependency> <groupId>com.amazonaws.secretsmanager</groupId> <artifactId>aws-secretsmanager-jdbc</artifactId> <version>1.0.8</version> </dependency>

O driver usa a cadeia de fornecedores de credenciais padrão. Se você executar o driver no Amazon EKS, ele poderá retirar as credenciais do nó em que está sendo executado, em vez do perfil da conta de serviço. Para resolver isso, adicione a versão 1 de com.amazonaws:aws-java-sdk-sts ao seu arquivo de projeto Gradle ou Maven como uma dependência.

Para definir um URL de endpoint de DNS do AWS PrivateLink e uma região no arquivo secretsmanager.properties:

drivers.vpcEndpointUrl = endpoint URL drivers.vpcEndpointRegion = endpoint region

Para substituir a região primária, defina a variável de ambiente AWS_SECRET_JDBC_REGION ou faça a seguinte alteração no arquivo secretsmanager.properties:

drivers.region = region

Estabeleça uma conexão com um banco de dados

O exemplo a seguir mostra como estabelecer uma conexão com um banco de dados usando as credenciais e informações sobre a conexão em um segredo. Assim que você tiver uma conexão, será possível usar chamadas JDBC para acessar o banco de dados. Para obter mais informações, consulte JDBC Basics (Conceitos básicos de JDBC) no site da documentação de Java.

MySQL
// Load the JDBC driver Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver" ).newInstance(); // Retrieve the connection info from the secret String URL = "secretId"; // Populate the user property with the secret ARN to retrieve user and password from the secret Properties info = new Properties( ); info.put( "user", "secretId" ); // Establish the connection conn = DriverManager.getConnection(URL, info);
PostgreSQL
// Load the JDBC driver Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerPostgreSQLDriver" ).newInstance(); // Retrieve the connection info from the secret String URL = "secretId"; // Populate the user property with the secret ARN to retrieve user and password from the secret Properties info = new Properties( ); info.put( "user", "secretId" ); // Establish the connection conn = DriverManager.getConnection(URL, info);
Oracle
// Load the JDBC driver Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerOracleDriver" ).newInstance(); // Retrieve the connection info from the secret String URL = "secretId"; // Populate the user property with the secret ARN to retrieve user and password from the secret Properties info = new Properties( ); info.put( "user", "secretId" ); // Establish the connection conn = DriverManager.getConnection(URL, info);
MSSQLServer
// Load the JDBC driver Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerMSSQLServerDriver" ).newInstance(); // Retrieve the connection info from the secret String URL = "secretId"; // Populate the user property with the secret ARN to retrieve user and password from the secret Properties info = new Properties( ); info.put( "user", "secretId" ); // Establish the connection conn = DriverManager.getConnection(URL, info);

Estabelecer uma conexão especificando o endpoint e a porta

O exemplo a seguir mostra como estabelecer uma conexão com um banco de dados usando as credenciais em um segredo com um endpoint e uma porta que você especifica.

Os segredos gerenciados pelo Amazon RDS não incluem o endpoint e a porta do banco de dados. Para se conectar a um banco de dados usando credenciais principais em um segredo gerenciado pelo Amazon RDS, você as especifica em seu código.

Segredos que são replicados para outras regiões podem melhorar a latência da conexão com o banco de dados regional, mas não contêm informações diferentes de conexão em relação ao segredo da origem. Cada réplica é uma cópia do segredo de origem. Para armazenar informações de conexão regional no segredo, adicione mais pares de chave-valor para as informações de endpoint e porta das regiões.

Assim que você tiver uma conexão, será possível usar chamadas JDBC para acessar o banco de dados. Para obter mais informações, consulte JDBC Basics (Conceitos básicos de JDBC) no site da documentação de Java.

MySQL
// Load the JDBC driver Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver" ).newInstance(); // Set the endpoint and port. You can also retrieve it from a key/value pair in the secret. String URL = "jdbc-secretsmanager:mysql://example.com:3306"; // Populate the user property with the secret ARN to retrieve user and password from the secret Properties info = new Properties( ); info.put( "user", "secretId" ); // Establish the connection conn = DriverManager.getConnection(URL, info);
PostgreSQL
// Load the JDBC driver Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerPostgreSQLDriver" ).newInstance(); // Set the endpoint and port. You can also retrieve it from a key/value pair in the secret. String URL = "jdbc-secretsmanager:postgresql://example.com:5432/database"; // Populate the user property with the secret ARN to retrieve user and password from the secret Properties info = new Properties( ); info.put( "user", "secretId" ); // Establish the connection conn = DriverManager.getConnection(URL, info);
Oracle
// Load the JDBC driver Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerOracleDriver" ).newInstance(); // Set the endpoint and port. You can also retrieve it from a key/value pair in the secret. String URL = "jdbc-secretsmanager:oracle:thin:@example.com:1521/ORCL"; // Populate the user property with the secret ARN to retrieve user and password from the secret Properties info = new Properties( ); info.put( "user", "secretId" ); // Establish the connection conn = DriverManager.getConnection(URL, info);
MSSQLServer
// Load the JDBC driver Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerMSSQLServerDriver" ).newInstance(); // Set the endpoint and port. You can also retrieve it from a key/value pair in the secret. String URL = "jdbc-secretsmanager:sqlserver://example.com:1433"; // Populate the user property with the secret ARN to retrieve user and password from the secret Properties info = new Properties( ); info.put( "user", "secretId" ); // Establish the connection conn = DriverManager.getConnection(URL, info);

Use o grupo de conexões c3p0 para estabelecer uma conexão

O exemplo a seguir mostra como estabelecer um pool de conexões com um arquivo c3p0.properties que usa o driver para recuperar credenciais e informações de conexão do segredo. Em user e jdbcUrl, insira o ID do segredo para configurar o grupo de conexões. Em seguida, você pode recuperar conexões do grupo e usá-las como qualquer outra conexão de banco de dados. Para obter mais informações, consulte JDBC Basics (Conceitos básicos de JDBC) no site da documentação de Java.

Para obter mais informações sobre c3p0, consulte c3p0 no site Machinery For Change.

MySQL
c3p0.user=secretId c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver c3p0.jdbcUrl=secretId
PostgreSQL
c3p0.user=secretId c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerPostgreSQLDriver c3p0.jdbcUrl=secretId
Oracle
c3p0.user=secretId c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerOracleDriver c3p0.jdbcUrl=secretId
MSSQLServer
c3p0.user=secretId c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerMSSQLServerDriver c3p0.jdbcUrl=secretId

Usar o agrupamento de conexões c3p0 para estabelecer uma conexão especificando o endpoint e a porta

O exemplo a seguir mostra como estabelecer um pool de conexões com um arquivo c3p0.properties que use o driver para recuperar credenciais em um segredo com um endpoint e uma porta que você especifica. Em seguida, você pode recuperar conexões do grupo e usá-las como qualquer outra conexão de banco de dados. Para obter mais informações, consulte JDBC Basics (Conceitos básicos de JDBC) no site da documentação de Java.

Os segredos gerenciados pelo Amazon RDS não incluem o endpoint e a porta do banco de dados. Para se conectar a um banco de dados usando credenciais principais em um segredo gerenciado pelo Amazon RDS, você as especifica em seu código.

Segredos que são replicados para outras regiões podem melhorar a latência da conexão com o banco de dados regional, mas não contêm informações diferentes de conexão em relação ao segredo da origem. Cada réplica é uma cópia do segredo de origem. Para armazenar informações de conexão regional no segredo, adicione mais pares de chave-valor para as informações de endpoint e porta das regiões.

MySQL
c3p0.user=secretId c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver c3p0.jdbcUrl=jdbc-secretsmanager:mysql://example.com:3306
PostgreSQL
c3p0.user=secretId c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerPostgreSQLDriver c3p0.jdbcUrl=jdbc-secretsmanager:postgresql://example.com:5432/database
Oracle
c3p0.user=secretId c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerOracleDriver c3p0.jdbcUrl=jdbc-secretsmanager:oracle:thin:@example.com:1521/ORCL
MSSQLServer
c3p0.user=secretId c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerMSSQLServerDriver c3p0.jdbcUrl=jdbc-secretsmanager:sqlserver://example.com:1433