在 Amazon Aurora DSQL 中生成身份验证令牌 - Amazon Aurora DSQL

在 Amazon Aurora DSQL 中生成身份验证令牌

要使用 SQL 客户端连接到 Amazon Aurora DSQL,请生成要用作密码的身份验证令牌。此令牌仅用于对连接进行身份验证。建立连接后,连接将保持有效,即使身份验证令牌过期也是如此。

如果您使用 AWS 管理控制台创建身份验证令牌,默认情况下,该令牌将在一小时后自动过期。如果您使用 AWS CLI 或 SDK 创建令牌,则默认值为 15 分钟。最大持续时间为 604800 秒,也就是一周。要再次从客户端连接到 Aurora DSQL,您可以使用相同的身份验证令牌(如果该令牌尚未过期),也可以生成一个新令牌。

要开始生成令牌,请创建 IAM 策略a cluster in Aurora DSQL。然后,使用 AWS 管理控制台、AWS CLI 或 AWS SDK 来生成令牌。

您必须至少拥有使用 IAM 连接到集群中列出的 IAM 权限,具体取决于您使用哪个数据库角色进行连接。

使用 AWS 管理控制台在 Aurora DSQL 中生成身份验证令牌

Aurora DSQL 使用令牌而不是密码来对用户进行身份验证。您可以从控制台生成令牌。

生成身份验证令牌
  1. 登录 AWS Management Console并打开 Aurora DSQL 控制台,网址为 https://console.aws.amazon.com/dsql

  2. 选择您要为其生成身份验证令牌的集群的集群 ID。如果您尚未创建集群,请按照步骤 1:创建 Aurora DSQL 单区域集群步骤 4:创建多区域集群中的步骤操作。

  3. 选择连接,然后选择获取令牌

  4. 选择是要以 admin 身份还是要使用自定义数据库角色进行连接。

  5. 复制生成的身份验证令牌并将其用于使用 SQL 客户端访问 Aurora DSQL

要了解有关 Aurora DSQL 中的自定义数据库角色和 IAM 的更多信息,请参阅Aurora DSQL 的身份验证和授权

使用 AWS CloudShell 在 Aurora DSQL 中生成身份验证令牌

在使用 AWS CloudShell 生成身份验证令牌之前,请确保您创建 Aurora DSQL 集群

使用 AWS CloudShell 生成身份验证令牌
  1. 登录 AWS Management Console并打开 Aurora DSQL 控制台,网址为 https://console.aws.amazon.com/dsql

  2. 在 AWS 管理控制台的左下角,选择 AWS CloudShell。

  3. 运行以下命令以生成 admin 角色的身份验证令牌。将 us-east-1 替换为您的区域,并将 your_cluster_endpoint 替换为您自己的集群的端点。

    注意

    如果您没有以 admin 身份进行连接,请改用 generate-db-connect-auth-token

    aws dsql generate-db-connect-admin-auth-token \ --expires-in 3600 \ --region us-east-1 \ --hostname your_cluster_endpoint

    如果您遇到问题,请参阅排查 IAM 问题如何使用 IAM 策略解决“访问被拒绝”或“未经授权的操作”错误?

  4. 使用以下命令,通过 psql 开始与集群的连接。

    PGSSLMODE=require \ psql --dbname postgres \ --username admin \ --host cluster_endpoint
  5. 您应该会看到要求您提供密码的提示符。复制您生成的令牌,并确保不包含任何额外的空格或字符。将其从 psql 粘贴到以下提示符下。

    Password for user admin:
  6. Enter 键。您应该看到 PostgreSQL 提示符。

    postgres=>

    如果您收到拒绝访问错误,请确保您的 IAM 身份具有 dsql:DbConnectAdmin 权限。如果您拥有此权限,但继续收到拒绝访问错误,请参阅排查 IAM 问题如何使用 IAM 策略解决“访问被拒绝”或“未经授权的操作”错误?

要了解有关 Aurora DSQL 中的自定义数据库角色和 IAM 的更多信息,请参阅Aurora DSQL 的身份验证和授权

使用 AWS CLI 在 Aurora DSQL 中生成身份验证令牌

当集群处于 ACTIVE 状态时,可以在 CLI 上使用 aws dsql 命令来生成身份验证令牌。使用以下任一方法:

  • 如果您要使用 admin 角色进行连接,请使用 generate-db-connect-admin-auth-token 选项。

  • 如果您要使用自定义数据库角色进行连接,请使用 generate-db-connect-auth-token 选项。

下面的示例使用以下属性为 admin 角色生成身份验证令牌。

  • your_cluster_endpoint:集群的端点 它遵循格式 your_cluster_identifier.dsql.region.on.aws,如示例 01abc2ldefg3hijklmnopqurstu.dsql.us-east-1.on.aws 所示。

  • region:AWS 区域,例如 us-east-2us-east-1

以下示例将令牌的到期时间设置为 3600 秒(1 小时)。

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

使用 SDK 在 Aurora DSQL 中生成令牌

当集群处于 ACTIVE 状态时,您可以为其生成身份验证令牌。SDK 示例使用以下属性为 admin 角色生成身份验证令牌:

  • your_cluster_endpoint(或 yourClusterEndpoint):Aurora DSQL 集群的端点。命名格式为 your_cluster_identifier.dsql.region.on.aws,如示例 01abc2ldefg3hijklmnopqurstu.dsql.us-east-1.on.aws 中所示。

  • regionRegionEndpoint):您的集群所在的 AWS 区域,例如 us-east-2us-east-1

Python SDK

您可以通过以下方式生成令牌:

  • 如果您要使用 admin 角色进行连接,请使用 generate_db_connect_admin_auth_token

  • 如果您要使用自定义数据库角色进行连接,请使用 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

您可以通过以下方式生成令牌:

  • 如果您要使用 admin 角色进行连接,请使用 GenerateDBConnectAdminAuthToken

  • 如果您要使用自定义数据库角色进行连接,请使用 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

您可以通过以下方式生成令牌:

  • 如果您要使用 admin 角色进行连接,请使用 getDbConnectAdminAuthToken

  • 如果您要使用自定义数据库角色进行连接,请使用 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

您可以通过以下方式生成令牌:

  • 如果您要使用 admin 角色进行连接,请使用 generateDbConnectAdminAuthToken

  • 如果您要使用自定义数据库角色进行连接,请使用 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

您可以通过以下方式生成令牌:

  • 如果您要使用 admin 角色进行连接,请使用 db_connect_admin_auth_token

  • 如果您要使用自定义数据库角色进行连接,请使用 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

您可以通过以下方式生成令牌:

  • 如果您要使用 admin 角色进行连接,请使用 generate_db_connect_admin_auth_token

  • 如果您要使用自定义数据库角色进行连接,请使用 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
注意

官方适用于 .NET 的 SDK 不包括用于为 Aurora DSQL 生成身份验证令牌的内置 API 调用。而是必须使用 DSQLAuthTokenGenerator,这是一个实用程序类。以下代码示例展示了如何为 .NET 生成身份验证令牌。

您可以通过以下方式生成令牌:

  • 如果您要使用 admin 角色进行连接,请使用 DbConnectAdmin

  • 如果您要使用自定义数据库角色进行连接,请使用 DbConnect

以下示例使用 DSQLAuthTokenGenerator 实用程序类为具有 admin 角色的用户生成身份验证令牌。将 insert-dsql-cluster-endpoint 替换为您的集群端点。

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
注意

Golang SDK 未提供用于生成预签名令牌的内置方法。您必须手动构造签名请求,如以下代码示例中所示。

在以下代码示例中,根据 PostgreSQL 用户指定 action

  • 如果您要使用 admin 角色进行连接,请使用 DbConnectAdmin 操作。

  • 如果您要使用自定义数据库角色进行连接,请使用 DbConnect 操作。

除了 yourClusterEndpointregion 外,以下示例还使用了 action。请根据 PostgreSQL 用户指定 action

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 }