Gerar um token de autenticação no Amazon Aurora DSQL
Para se conectar ao Amazon Aurora DSQL com um cliente SQL, gere um token de autenticação para usar como senha. Esse token é usado somente para autenticar a conexão. Depois que a conexão é estabelecida, a conexão permanece válida mesmo que o token de autenticação expire.
Se você criar um token de autenticação usando o console da AWS, ele expirará automaticamente em uma hora por padrão. Se você usar a AWS CLI ou SDKs para criar o token, o padrão será 15 minutos. O máximo é 604.800 segundos, o que equivale a uma semana. Para se conectar novamente ao Aurora DSQL por meio do seu cliente, você pode usar o mesmo token de autenticação, caso ele não tenha expirado, ou pode gerar um novo.
Para começar a gerar um token, crie uma política do IAM e um cluster no Aurora DSQL. Em seguida, use o console da AWS, a AWS CLI ou os SDKs da AWS para gerar um token.
No mínimo, você deve ter as permissões do IAM listadas em Conectar-se a um cluster usando o IAM, dependendo do perfil de banco de dados que você usa para se conectar.
Usar o console da AWS para gerar um token de autenticação no Aurora DSQL
O Aurora DSQL autentica os usuários com um token, em vez de uma senha. Você pode gerar o token no console.
Para saber mais sobre perfis de banco de dados personalizados e o IAM no Aurora DSQL, consulte Autenticação e autorização para o Aurora DSQL.
Usar a AWS CloudShell para gerar um token de autenticação no Aurora DSQL
Antes de gerar um token de autenticação usando o AWS CloudShell, você precisa Criar um cluster do Aurora DSQL.
Como gerar token de autenticação usando o AWS CloudShell
-
Faça login no AWS Management Console e abra o console do Aurora DSQL em https://console.aws.amazon.com/dsql.
-
Na parte inferior esquerda do Console da AWS, escolha AWS CloudShell.
-
Execute o comando a seguir para gerar um token de autenticação para o perfil admin
. Substitua us-east-1
pela sua região e cluster_endpoint
pelo endpoint do seu cluster.
Se você não estiver se conectando como admin
, use generate-db-connect-auth-token
em vez disso.
aws dsql generate-db-connect-admin-auth-token \
--expires-in 3600 \
--region us-east-1
\
--hostname your_cluster_endpoint
Se você tiver problemas, consulte Solucionar problemas do IAM e Como solucionar erros de acesso negado ou operação não autorizada em uma política do IAM?.
-
Use o comando a seguir para utilizar o psql
para iniciar uma conexão com o cluster.
PGSSLMODE=require \
psql --dbname postgres \
--username admin \
--host cluster_endpoint
-
Você verá uma solicitação para fornecer uma senha. Copie o token que você gerou e não inclua espaços ou caracteres adicionais. Cole-o no prompt a seguir do psql
.
Password for user admin:
-
Pressione Enter. Você verá um prompt do PostgreSQL.
postgres=>
Se você receber um erro de acesso negado, confirme se sua identidade do IAM tenha a permissão dsql:DbConnectAdmin
. Se você tiver a permissão e continuar recebendo erros de negação de acesso, consulte Solucionar problemas do IAM e Como solucionar erros de acesso negado ou operação não autorizada em uma política do IAM?.
Para saber mais sobre perfis de banco de dados personalizados e o IAM no Aurora DSQL, consulte Autenticação e autorização para o Aurora DSQL.
Usar a AWS CLI para gerar um token de autenticação no Aurora DSQL
Quando seu cluster estiver ACTIVE
, você poderá gerar um token de autenticação na CLI usando o comando aws dsql
. Use uma das seguintes técnicas:
-
Se você estiver se conectando com o perfil admin
, use a opção generate-db-connect-admin-auth-token
.
-
Se você estiver se conectando com um perfil de banco de dados personalizado, use a opção generate-db-connect-auth-token
.
O exemplo a seguir usa os atributos abaixo para gerar um token de autenticação para o perfil admin
.
-
your_cluster_endpoint
: o endpoint do cluster. Ele segue o formato your_cluster_identifier
.dsql.region
.on.aws
, como no exemplo 01abc2ldefg3hijklmnopqurstu.dsql.us-east-1.on.aws
.
-
region
: a Região da AWS, como us-east-2
ou us-east-1
.
Os exemplos a seguir definem que o token deve expirar em 3.600 segundos (1 hora).
- Linux and macOS
-
aws dsql generate-db-connect-admin-auth-token \
--region region
\
--expires-in 3600 \
--hostname your_cluster_endpoint
- Windows
-
aws dsql generate-db-connect-admin-auth-token ^
--region=region
^
--expires-in=3600 ^
--hostname=your_cluster_endpoint
Usar os SDKs para gerar um token no Aurora DSQL
Você pode gerar um token de autenticação para o cluster quando ele estiver no status ACTIVE
. Os exemplos de SDK usam os seguintes atributos para gerar um token de autenticação para o perfil admin
:
-
your_cluster_endpoint
(ou yourClusterEndpoint
): o endpoint do cluster do Aurora DSQL. O formato de nomenclatura é your_cluster_identifier
.dsql.region
.on.aws
, como no exemplo 01abc2ldefg3hijklmnopqurstu.dsql.us-east-1.on.aws
.
-
region
(ou RegionEndpoint
): a Região da AWS em que o cluster está localizado, como us-east-2
ou us-east-1
.
- Python SDK
-
Você pode gerar o token das seguintes maneiras:
-
Se você estiver se conectando com um perfil admin
, use generate_db_connect_admin_auth_token
.
-
Se você estiver se conectando com um perfil de banco de dados personalizada, use generate_connect_auth_token
.
def generate_token(your_cluster_endpoint, region):
client = boto3.client("dsql", region_name=region)
# use `generate_db_connect_auth_token` instead if you are not connecting as admin.
token = client.generate_db_connect_admin_auth_token(your_cluster_endpoint, region)
print(token)
return token
- C++ SDK
-
Você pode gerar o token das seguintes maneiras:
-
Se você estiver se conectando com um perfil admin
, use GenerateDBConnectAdminAuthToken
.
-
Se você estiver se conectando com um perfil de banco de dados personalizada, use GenerateDBConnectAuthToken
.
#include <aws/core/Aws.h>
#include <aws/dsql/DSQLClient.h>
#include <iostream>
using namespace Aws;
using namespace Aws::DSQL;
std::string generateToken(String yourClusterEndpoint, String region) {
Aws::SDKOptions options;
Aws::InitAPI(options);
DSQLClientConfiguration clientConfig;
clientConfig.region = region;
DSQLClient client{clientConfig};
std::string token = "";
// If you are not using the admin role to connect, use GenerateDBConnectAuthToken instead
const auto presignedString = client.GenerateDBConnectAdminAuthToken(yourClusterEndpoint, region);
if (presignedString.IsSuccess()) {
token = presignedString.GetResult();
} else {
std::cerr << "Token generation failed." << std::endl;
}
std::cout << token << std::endl;
Aws::ShutdownAPI(options);
return token;
}
- JavaScript SDK
-
Você pode gerar o token das seguintes maneiras:
-
Se você estiver se conectando com um perfil admin
, use getDbConnectAdminAuthToken
.
-
Se você estiver se conectando com um perfil de banco de dados personalizada, use getDbConnectAuthToken
.
import { DsqlSigner } from "@aws-sdk/dsql-signer";
async function generateToken(yourClusterEndpoint, region) {
const signer = new DsqlSigner({
hostname: yourClusterEndpoint,
region,
});
try {
// Use `getDbConnectAuthToken` if you are _not_ logging in as the `admin` user
const token = await signer.getDbConnectAdminAuthToken();
console.log(token);
return token;
} catch (error) {
console.error("Failed to generate token: ", error);
throw error;
}
}
- Java SDK
-
Você pode gerar o token das seguintes maneiras:
-
Se você estiver se conectando com um perfil admin
, use generateDbConnectAdminAuthToken
.
-
Se você estiver se conectando com um perfil de banco de dados personalizada, use generateDbConnectAuthToken
.
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.services.dsql.DsqlUtilities;
import software.amazon.awssdk.regions.Region;
public class GenerateAuthToken {
public static String generateToken(String yourClusterEndpoint, Region region) {
DsqlUtilities utilities = DsqlUtilities.builder()
.region(region)
.credentialsProvider(DefaultCredentialsProvider.create())
.build();
// Use `generateDbConnectAuthToken` if you are _not_ logging in as `admin` user
String token = utilities.generateDbConnectAdminAuthToken(builder -> {
builder.hostname(yourClusterEndpoint)
.region(region);
});
System.out.println(token);
return token;
}
}
- Rust SDK
-
Você pode gerar o token das seguintes maneiras:
-
Se você estiver se conectando com um perfil admin
, use db_connect_admin_auth_token
.
-
Se você estiver se conectando com um perfil de banco de dados personalizada, use db_connect_auth_token
.
use aws_config::{BehaviorVersion, Region};
use aws_sdk_dsql::auth_token::{AuthTokenGenerator, Config};
async fn generate_token(your_cluster_endpoint
: String, region
: String) -> String {
let sdk_config = aws_config::load_defaults(BehaviorVersion::latest()).await;
let signer = AuthTokenGenerator::new(
Config::builder()
.hostname(&your_cluster_endpoint)
.region(Region::new(region))
.build()
.unwrap(),
);
// Use `db_connect_auth_token` if you are _not_ logging in as `admin` user
let token = signer.db_connect_admin_auth_token(&sdk_config).await.unwrap();
println!("{}", token);
token.to_string()
}
- Ruby SDK
-
Você pode gerar o token das seguintes maneiras:
-
Se você estiver se conectando com um perfil admin
, use generate_db_connect_admin_auth_token
.
-
Se você estiver se conectando com um perfil de banco de dados personalizada, use generate_db_connect_auth_token
.
require 'aws-sdk-dsql'
def generate_token(your_cluster_endpoint, region)
credentials = Aws::SharedCredentials.new()
begin
token_generator = Aws::DSQL::AuthTokenGenerator.new({
:credentials => credentials
})
# if you're not using admin role, use generate_db_connect_auth_token instead
token = token_generator.generate_db_connect_admin_auth_token({
:endpoint => your_cluster_endpoint,
:region => region
})
rescue => error
puts error.full_message
end
end
- .NET
-
O SDK oficial para .NET não inclui uma chamada de API integrada para gerar um token de autenticação para o Aurora DSQL. Em vez disso, você deve usar DSQLAuthTokenGenerator
, que é uma classe de utilitário. O exemplo de código a seguir mostra como gerar o token de autenticação para .NET.
Você pode gerar o token das seguintes maneiras:
-
Se você estiver se conectando com um perfil admin
, use DbConnectAdmin
.
-
Se você estiver se conectando com um perfil de banco de dados personalizada, use DbConnect
.
O exemplo a seguir usa a classe utilitária DSQLAuthTokenGenerator
para gerar o token de autenticação para um usuário com o perfil admin
. Substitua insert-dsql-cluster-endpoint pelo endpoint do cluster
.
using Amazon;
using Amazon.DSQL.Util;
using Amazon.Runtime;
var yourClusterEndpoint = "insert-dsql-cluster-endpoint
";
AWSCredentials credentials = FallbackCredentialsFactory.GetCredentials();
var token = DSQLAuthTokenGenerator.GenerateDbConnectAdminAuthToken(credentials, RegionEndpoint.USEast1, yourClusterEndpoint);
Console.WriteLine(token);
- Golang
-
O SDK do Golang não fornece um método integrado para gerar um token pré-assinado. Você deve construir a solicitação assinada manualmente, conforme mostrado no exemplo de código a seguir.
No exemplo de código a seguir, especifique o action
com base no usuário do PostgreSQL:
-
Se você estiver se conectando com um perfil admin
, use a ação DbConnectAdmin
.
-
Se você estiver se conectando com um perfil de banco de dados personalizado, use a ação DbConnect
.
Além de yourClusterEndpoint
e region
, o exemplo a seguir usa action
. Especifique a ação
com base no usuário do PostgreSQL.
func GenerateDbConnectAdminAuthToken(yourClusterEndpoint
string, region
string, action
string) (string, error) {
// Fetch credentials
sess, err := session.NewSession()
if err != nil {
return "", err
}
creds, err := sess.Config.Credentials.Get()
if err != nil {
return "", err
}
staticCredentials := credentials.NewStaticCredentials(
creds.AccessKeyID,
creds.SecretAccessKey,
creds.SessionToken,
)
// The scheme is arbitrary and is only needed because validation of the URL requires one.
endpoint := "https://" + yourClusterEndpoint
req, err := http.NewRequest("GET", endpoint, nil)
if err != nil {
return "", err
}
values := req.URL.Query()
values.Set("Action", action)
req.URL.RawQuery = values.Encode()
signer := v4.Signer{
Credentials: staticCredentials,
}
_, err = signer.Presign(req, nil, "dsql", region, 15*time.Minute, time.Now())
if err != nil {
return "", err
}
url := req.URL.String()[len("https://"):]
return url, nil
}