

# Amazon Aurora DSQL에서 인증 토큰 생성
<a name="SECTION_authentication-token"></a>

SQL 클라이언트를 사용하여 Amazon Aurora DSQL에 연결하려면 암호로 사용할 인증 토큰을 생성합니다. 이 토큰은 연결을 인증하는 데만 사용됩니다. 연결이 설정되면 인증 토큰이 만료되더라도 연결이 유효합니다.

AWS Console, AWS CLI 또는 SDK를 사용하여 인증 토큰을 생성하면 토큰은 기본적으로 15분 후에 자동으로 만료됩니다. 최대 기간은 1주일인 604,800초입니다. 클라이언트에서 Aurora DSQL에 다시 연결하려면 만료되지 않은 동일한 인증 토큰을 사용하거나 새 토큰을 생성할 수 있습니다.

토큰 생성을 시작하려면 [Aurora DSQL](https://docs.aws.amazon.com/aurora-dsql/latest/userguide/getting-started.html#getting-started-quickstart)에서 [IAM 정책과 클러스터를 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)합니다. 그런 다음 AWS Console, AWS CLI 또는 AWS SDK를 사용하여 토큰을 생성합니다.

연결하는 데 사용하는 데이터베이스 역할에 따라 최소한 [IAM을 사용하여 클러스터에 연결](authentication-authorization.md#authentication-authorization-iam-role-connect)에 나열된 IAM 권한이 있어야 합니다.

**Topics**
+ [AWS Console을 사용하여 Aurora DSQL에서 인증 토큰 생성](#authentication-token-console)
+ [AWS CloudShell을 사용하여 Aurora DSQL에서 인증 토큰 생성](#authentication-token-cloudshell)
+ [AWS CLI를 사용하여 Aurora DSQL에서 인증 토큰 생성](#authentication-token-cli)
+ [SDK를 사용하여 Aurora DSQL에서 토큰 생성](#authentication-token-sdks)

## AWS Console을 사용하여 Aurora DSQL에서 인증 토큰 생성
<a name="authentication-token-console"></a>

Aurora DSQL은 암호가 아닌 토큰으로 사용자를 인증합니다. 콘솔에서 토큰을 생성할 수 있습니다.

**인증 토큰을 생성하는 방법**

1. AWS Management Console에 로그인한 다음, [https://console.aws.amazon.com/dsql](https://console.aws.amazon.com/dsql)에서 Aurora DSQL 콘솔을 엽니다.

1. 인증 토큰을 생성할 클러스터의 클러스터 ID를 선택합니다. 클러스터를 아직 생성하지 않은 경우 [1단계: Aurora DSQL 단일 리전 클러스터 생성](getting-started.md#getting-started-create-cluster) 또는 [4단계 (선택 사항): 다중 리전 클러스터 생성](getting-started.md#getting-started-multi-region)의 단계를 따릅니다.

1. **연결**을 선택한 다음 **토큰 가져오기**를 선택합니다.

1. `admin`으로 연결할지, 아니면 [사용자 지정 데이터베이스 역할](https://docs.aws.amazon.com/aurora-dsql/latest/userguide/authentication-authorization.html#authentication-authorization-iam-role-connect)로 연결할지를 선택합니다.

1. 생성된 인증 토큰을 복사하여 [SQL 클라이언트를 사용하여 Aurora DSQL에 액세스](accessing.md#accessing-sql-clients)에 사용합니다.

Aurora DSQL의 사용자 지정 데이터베이스 역할 및 IAM에 대한 자세한 내용은 [Aurora DSQL에 대한 인증 및 권한 부여](authentication-authorization.md) 섹션을 참조하세요.

## AWS CloudShell을 사용하여 Aurora DSQL에서 인증 토큰 생성
<a name="authentication-token-cloudshell"></a>

AWS CloudShell를 사용하여 인증 토큰을 생성하려면 먼저 [Aurora DSQL 클러스터를 생성](https://docs.aws.amazon.com/aurora-dsql/latest/userguide/getting-started.html#getting-started-quickstart)해야 합니다.

**AWS CloudShell을 사용하여 인증 토큰을 생성하는 방법**

1. AWS Management Console에 로그인한 다음, [https://console.aws.amazon.com/dsql](https://console.aws.amazon.com/dsql)에서 Aurora DSQL 콘솔을 엽니다.

1. AWS Console 왼쪽 하단에서 AWS CloudShell을 선택합니다.

1. 다음 명령을 실행하여 `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 문제 해결](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot.html) 및 [IAM 정책을 적용할 때 액세스 거부 또는 승인되지 않은 작업 오류를 해결하려면 어떻게 해야 합니까?](https://repost.aws/knowledge-center/troubleshoot-iam-policy-issues)를 참조하세요.

1. 다음 명령을 사용하여 `psql`을 사용해 클러스터에 대한 연결을 시작합니다.

   ```
   PGSSLMODE=require \
   psql --dbname postgres \
     --username admin \
     --host cluster_endpoint
   ```

1. 암호를 입력하라는 프롬프트가 표시됩니다. 생성한 토큰을 복사하고 추가 공백이나 문자를 포함하지 않도록 합니다. `psql`의 다음 프롬프트에 붙여 넣습니다.

   ```
   Password for user admin: 
   ```

1. **Enter**를 누릅니다. PostgreSQL 프롬프트가 표시됩니다.

   ```
   postgres=>
   ```

   액세스 거부 오류가 발생하면 IAM ID에 `dsql:DbConnectAdmin` 권한이 있는지 확인합니다. 권한이 있고 액세스 거부 오류가 계속 발생하는 경우 [IAM 문제 해결](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot.html) 및 [IAM 정책을 적용할 때 액세스 거부 또는 승인되지 않은 작업 오류를 해결하려면 어떻게 해야 합니까?](https://repost.aws/knowledge-center/troubleshoot-iam-policy-issues)를 참조하세요.

Aurora DSQL의 사용자 지정 데이터베이스 역할 및 IAM에 대한 자세한 내용은 [Aurora DSQL에 대한 인증 및 권한 부여](authentication-authorization.md) 섹션을 참조하세요.

## AWS CLI를 사용하여 Aurora DSQL에서 인증 토큰 생성
<a name="authentication-token-cli"></a>

클러스터가 `ACTIVE`인 경우 `aws dsql` 명령을 사용하여 CLI에서 인증 토큰을 생성할 수 있습니다. 다음 중 한 가지 방법을 사용합니다.

**참고**  
토큰 생성은 현재 IAM 자격 증명을 사용하여 요청에 서명하는 로컬 작업입니다. 자격 증명을 검증하기 위해 AWS에 연결하지 않습니다. 자격 증명이 만료되었거나 유효하지 않은 경우에도 토큰 생성은 성공하지만 연결 시도는 실패합니다. 토큰을 생성하기 전에 IAM 자격 증명이 유효한지 확인합니다.
+ `admin` 역할로 연결하는 경우 `generate-db-connect-admin-auth-token` 옵션을 사용합니다.
+ 사용자 지정 데이터베이스 역할로 연결하는 경우 `generate-db-connect-auth-token` 옵션을 사용합니다.

다음 예시에서는 다음 속성을 사용하여 `admin` 역할에 대한 인증 토큰을 생성합니다.
+ {{your\_cluster\_endpoint}} - 클러스터의 엔드포인트입니다. 예시 `01abc2ldefg3hijklmnopqurstu.dsql.us-east-1.on.aws`와 같이 `{{your_cluster_identifier}}.dsql.{{region}}.on.aws` 형식을 따릅니다.
+ {{region}} - `us-east-2` 또는 `us-east-1`과 같은 AWS 리전입니다.

다음 예시에서는 토큰이 3,600초(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에서 토큰 생성
<a name="authentication-token-sdks"></a>

클러스터가 `ACTIVE` 상태일 때 클러스터에 대한 인증 토큰을 생성할 수 있습니다. SDK 예시에서는 다음 속성을 사용하여 `admin` 역할에 대한 인증 토큰을 생성합니다.
+ {{your\_cluster\_endpoint}}(또는 {{yourClusterEndpoint}}) - Aurora DSQL 클러스터의 엔드포인트입니다. 예시 `01abc2ldefg3hijklmnopqurstu.dsql.us-east-1.on.aws`와 같이 이름 지정 형식은 `{{your_cluster_identifier}}.dsql.{{region}}.on.aws`입니다.
+ {{region}}(또는 {{RegionEndpoint}}) - `us-east-2` 또는 `us-east-1`과 같이 클러스터가 위치한 AWS 리전입니다.

------
#### [ Python SDK ]

**작은 정보**  
AWS에서는 토큰 생성을 자동으로 처리하는 [Python용 Aurora DSQL 커넥터커넥터 정보Aurora DSQL 인증이란 무엇입니까?특성빠른 시작 설명서요구 사항설치psycopg 또는 psycopg2 또는 asyncpg를 별도로 설치기본 사용법psycopgpsycopg2asyncpg호스트만 사용psycopgpsycopg2asyncpg클러스터 ID만 사용psycopgpsycopg2asyncpgpsycopgpsycopg2asyncpg연결 문자열psycopgpsycopg2asyncpg고급 구성psycopgpsycopg2asyncpg구성 옵션연결 풀링과 함께 Python용 Aurora DSQL 커넥터 사용psycopgpsycopg2asyncpgAuthentication관리자 및 일반 사용자예제psycopgpsycopg2asyncpg](SECTION_program-with-dsql-connector-for-python.md) 사용을 권장합니다.

다음과 같은 방법으로 토큰을 생성할 수 있습니다.
+ `admin` 역할로 연결하는 경우 `generate_db_connect_admin_auth_token`을 사용합니다.
+ 사용자 지정 데이터베이스 역할로 연결하는 경우 `generate_connect_auth_token`을 사용합니다.

```
import boto3

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) {
    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;
    return token;
}

int main() {
    Aws::SDKOptions options;
    Aws::InitAPI(options);
    // Replace with your cluster endpoint and region
    std::string token = generateToken("your_cluster_endpoint.dsql.us-east-1.on.aws", "us-east-1");
    Aws::ShutdownAPI(options);
    return 0;
}
```

------
#### [ JavaScript SDK ]

**작은 정보**  
AWS에서는 토큰 생성을 자동으로 처리하는 [Node.js용 Aurora DSQL 커넥터](SECTION_Node-js-connectors.md) 사용을 권장합니다.

다음과 같은 방법으로 토큰을 생성할 수 있습니다.
+ `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 ]

**작은 정보**  
AWS에서는 토큰 생성을 자동으로 처리하는 [Java JDBC용 Aurora DSQL 커넥터](SECTION_program-with-jdbc-connector.md) 사용을 권장합니다.

다음과 같은 방법으로 토큰을 생성할 수 있습니다.
+ `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.builder().build())
                .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 ]

**작은 정보**  
AWS에서는 토큰 생성을 자동으로 처리하는 [Rust SQLx용 Aurora DSQL 커넥터](SECTION_program-with-dsql-connector-for-rust-sqlx.md) 사용을 권장합니다.

다음과 같은 방법으로 토큰을 생성할 수 있습니다.
+ `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 ]

**작은 정보**  
AWS에서는 토큰 생성을 자동으로 처리하는 [Ruby pg용 Aurora DSQL 커넥터](SECTION_program-with-dsql-connector-for-ruby-pg.md) 사용을 권장합니다.

다음과 같은 방법으로 토큰을 생성할 수 있습니다.
+ `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::CredentialProviderChain.new.resolve

  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
  })
end
```

------
#### [ PHP SDK ]

**작은 정보**  
AWS에서는 토큰 생성을 자동으로 처리하는 [PHP `PDO_PGSQL`용 Aurora DSQL 커넥터](SECTION_program-with-dsql-connector-for-php-pdo-pgsql.md) 사용을 권장합니다.

다음과 같은 방법으로 토큰을 생성할 수 있습니다.
+ `admin` 역할로 연결하는 경우 `generateDbConnectAdminAuthToken`을 사용합니다.
+ 사용자 지정 데이터베이스 역할로 연결하는 경우 `generateDbConnectAuthToken`을 사용합니다.

```
<?php
require 'vendor/autoload.php';

use Aws\DSQL\AuthTokenGenerator;
use Aws\Credentials\CredentialProvider;

function generateToken(string $yourClusterEndpoint, string $region): string {
    $provider = CredentialProvider::defaultProvider();
    $generator = new AuthTokenGenerator($provider);

    // Use generateDbConnectAuthToken if you are not connecting as admin
    $token = $generator->generateDbConnectAdminAuthToken($yourClusterEndpoint, $region);

    echo $token . PHP_EOL;
    return $token;
}
```

------
#### [ .NET ]

**작은 정보**  
AWS에서는 토큰 생성을 자동으로 처리하는 [.NET Npgsql용 Aurora DSQL 커넥터](SECTION_program-with-dsql-connector-for-dotnet-npgsql.md) 사용을 권장합니다.

**참고**  
공식 SDK for .NET에는 Aurora DSQL에 대한 인증 토큰을 생성하기 위한 기본 제공 API 직접 호출이 포함되어 있지 않습니다. 대신 유틸리티 클래스인 `DSQLAuthTokenGenerator`를 사용해야 합니다. 다음 코드 샘플은 .NET에 대한 인증 토큰을 생성하는 방법을 보여줍니다.

다음과 같은 방법으로 토큰을 생성할 수 있습니다.
+ `admin` 역할로 연결하는 경우 `DbConnectAdmin`을 사용합니다.
+ 사용자 지정 데이터베이스 역할로 연결하는 경우 `DbConnect`을 사용합니다.

다음 예시에서는 `DSQLAuthTokenGenerator` 유틸리티 클래스를 사용하여 `admin` 역할이 있는 사용자의 인증 토큰을 생성합니다. {{insert-dsql-cluster-endpoint}}를 실제 클러스터 엔드포인트로 바꿉니다.

```
using Amazon;
using Amazon.DSQL.Util;

var yourClusterEndpoint = "{{insert-dsql-cluster-endpoint}}";

// Use `DSQLAuthTokenGenerator.GenerateDbConnectAuthToken` if you are _not_ logging in as `admin` user
var token = DSQLAuthTokenGenerator.GenerateDbConnectAdminAuthToken(RegionEndpoint.USEast1, yourClusterEndpoint);

Console.WriteLine(token);
```

------
#### [ Go ]

**작은 정보**  
AWS에서는 토큰 생성을 자동으로 처리하는 [Go pgx용 Aurora DSQL 커넥터](SECTION_program-with-go-pgx-connector.md) 사용을 권장합니다.

Go용 AWS SDK v2는 [https://github.com/aws/aws-sdk-go-v2/tree/main/feature/dsql/auth](https://github.com/aws/aws-sdk-go-v2/tree/main/feature/dsql/auth) 패키지에서 인증 토큰을 생성하기 위한 기본 제공 방법을 제공합니다.
+ `admin` 역할로 연결하는 경우 `auth.GenerateDBConnectAdminAuthToken`을 사용합니다.
+ 사용자 지정 데이터베이스 역할로 연결하는 경우 `auth.GenerateDbConnectAuthToken`을 사용합니다.

```
package main

import (
	"context"
	"fmt"

	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/feature/dsql/auth"
)

func main() {
	ctx := context.Background()

	cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("{{region}}"))
	if err != nil {
		panic(err)
	}

	// Use auth.GenerateDbConnectAuthToken for non-admin users
	token, err := auth.GenerateDBConnectAdminAuthToken(ctx, "{{yourClusterEndpoint}}", "{{region}}", cfg.Credentials)
	if err != nil {
		panic(err)
	}

	fmt.Println(token)
}
```

------