View a markdown version of this page

Go コネクタを使用した Aurora DSQL クラスターへの接続 - Amazon Aurora DSQL

Go コネクタを使用した Aurora DSQL クラスターへの接続

Go 用 Aurora DSQL コネクタは、自動 IAM 認証で pgx をラップします。コネクタはトークン生成、SSL 設定、および接続管理を処理するため、ユーザーはアプリケーションロジックに集中できます。

コネクタについて

Aurora DSQL には、既存の Go PostgreSQL ドライバーがネイティブにサポートしていない時間制限付きトークンを使用した IAM ベースの認証が必要です。Go 用 Aurora DSQL コネクタは、IAM トークン生成を処理する pgx ドライバーの上に認証レイヤーを追加し、既存の pgx ワークフローを変更せずに Aurora DSQL に接続できるようにします。

Aurora DSQL 認証とは

Aurora DSQL では、認証に以下が含まれます。

  • IAM 認証: すべての接続で、時間制限付きトークンによる IAM ベースの認証が使用されます

  • トークン生成: コネクタは AWS 認証情報を使用して認証トークンを生成します。これらのトークンの有効期間は設定可能です。

Go 用 Aurora DSQL コネクタは、これらの要件を理解し、接続の確立時に IAM 認証トークンを自動的に生成するように設計されています。

Go 用 Aurora DSQL コネクタの利点

Go 用 Aurora DSQL コネクタを使用すると、以下の方法で IAM 認証を有効にしながら、既存の pgx ワークフローを引き続き使用できます。

  • 自動トークン生成: コネクタは、接続ごとに IAM トークンを自動的に生成します。

  • 接続プーリング: 接続ごとにトークンを自動生成する pgxpool の組み込みサポート

  • 柔軟な設定: リージョンの自動検出による完全なエンドポイントまたはクラスター ID のサポート

  • AWS 認証情報のサポート: AWS プロファイルとカスタム認証情報プロバイダーをサポート

主な特徴

自動トークン管理

コネクタは、事前に解決された認証情報を使用して、新しい接続ごとに IAM トークンを自動生成します。

接続プーリング

接続ごとにトークンを自動生成する pgxpool を利用した接続プーリング。

柔軟なホスト設定

自動リージョン検出を備えた完全なクラスターエンドポイントとクラスター ID の両方をサポートします。

SSL セキュリティ

SSL は verify-full モードと直接 TLS ネゴシエーションで常に有効になります。

前提条件

  • Go 1.24 以降

  • AWS 認証情報が設定されている

  • Aurora DSQL クラスター

コネクタは AWS SDK for Go v2 のデフォルトの認証情報チェーンを使用し、認証情報を次の順序で解決します。

  1. 環境変数 (AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY)

  2. 共有認証情報ファイル (~/.aws/credentials)

  3. 共有設定ファイル (~/.aws/config)

  4. Amazon EC2/ECS/Lambda の IAM ロール

インストール

Go モジュールを使用してコネクタをインストールします。

go get github.com/awslabs/aurora-dsql-connectors/go/pgx/dsql

クイックスタート

次の例は、接続プールを作成し、クエリを実行する方法を示しています。

package main import ( "context" "log" "github.com/awslabs/aurora-dsql-connectors/go/pgx/dsql" ) func main() { ctx := context.Background() // Create a connection pool pool, err := dsql.NewPool(ctx, dsql.Config{ Host: "your-cluster.dsql.us-east-1.on.aws", }) if err != nil { log.Fatal(err) } defer pool.Close() // Execute a query var greeting string err = pool.QueryRow(ctx, "SELECT 'Hello, DSQL!'").Scan(&greeting) if err != nil { log.Fatal(err) } log.Println(greeting) }

設定オプション

このコネクタでは以下の設定オプションがサポートされています。

フィールド タイプ デフォルト 説明
ホスト string (必須) クラスターエンドポイントまたはクラスター ID
リージョン string (自動検出) AWS リージョン (Host がクラスター ID の場合は必須)
ユーザー string 「admin」 データベースユーザー
データベース string 「postgres」 データベース名
ポート int 5432 データベースポート
プロファイル string "" 認証情報の AWS プロファイル名
TokenDurationSecs int 900 (15 分) トークンの有効期間 (秒) (最大許容時間: 1 週間、デフォルト: 15 分)
MaxConns int32 0 最大プール接続数 (0 = pgxpool のデフォルト)
MinConns int32 0 最小プール接続数 (0 = pgxpool のデフォルト)
MaxConnLifetime time.Duration 55 分 最大接続有効期間

接続文字列形式

コネクタは、PostgreSQL および DSQL 接続文字列形式をサポートしています。

postgres://[user@]host[:port]/[database][?param=value&...] dsql://[user@]host[:port]/[database][?param=value&...]

サポートされているクエリパラメータ:

  • region - AWS リージョン

  • profile - AWS プロファイル名

  • tokenDurationSecs - トークンの有効期間 (秒)

例:

// Full endpoint (region auto-detected) pool, _ := dsql.NewPool(ctx, "postgres://admin@cluster.dsql.us-east-1.on.aws/postgres") // Using dsql:// scheme (also supported) pool, _ := dsql.NewPool(ctx, "dsql://admin@cluster.dsql.us-east-1.on.aws/postgres") // With explicit region pool, _ := dsql.NewPool(ctx, "postgres://admin@cluster.dsql.us-east-1.on.aws/mydb?region=us-east-1") // With AWS profile pool, _ := dsql.NewPool(ctx, "postgres://admin@cluster.dsql.us-east-1.on.aws/postgres?profile=dev")

高度な使用法

ホスト設定

コネクタは次の 2 つのホスト形式をサポートしています。

フルエンドポイント (リージョンの自動検出)。

pool, _ := dsql.NewPool(ctx, dsql.Config{ Host: "your-cluster.dsql.us-east-1.on.aws", })

クラスター ID (リージョンが必要)。

pool, _ := dsql.NewPool(ctx, dsql.Config{ Host: "your-cluster-id", Region: "us-east-1", })

プール設定の調整

ワークロードの接続プールを設定します。

pool, err := dsql.NewPool(ctx, dsql.Config{ Host: "your-cluster.dsql.us-east-1.on.aws", MaxConns: 20, MinConns: 5, MaxConnLifetime: time.Hour, MaxConnIdleTime: 30 * time.Minute, HealthCheckPeriod: time.Minute, })

単一接続の使用

シンプルなスクリプトの場合、または接続プーリングが必要ない場合。

conn, err := dsql.Connect(ctx, dsql.Config{ Host: "your-cluster.dsql.us-east-1.on.aws", }) if err != nil { log.Fatal(err) } defer conn.Close(ctx) // Use the connection rows, err := conn.Query(ctx, "SELECT * FROM users")

AWS プロファイルの使用

認証情報の AWS プロファイルを指定します。

pool, err := dsql.NewPool(ctx, dsql.Config{ Host: "your-cluster.dsql.us-east-1.on.aws", Profile: "production", })

OCC 再試行

Aurora DSQL は、オプティミスティック同時実行制御 (OCC) を使用します。2 つのトランザクションが同じデータを変更する場合、最初のトランザクションはコミットに成功し、2 番目のトランザクションは OCC エラーを受け取ります。

occretry パッケージには、エクスポネンシャルバックオフとジッターによる自動再試行用のヘルパーが用意されています。以下を使用して、インストールします。

go get github.com/awslabs/aurora-dsql-connectors/go/pgx/occretry

トランザクション書き込みには、WithRetry を使用します。

err := occretry.WithRetry(ctx, pool, occretry.DefaultConfig(), func(tx pgx.Tx) error { _, err := tx.Exec(ctx, "UPDATE accounts SET balance = balance - $1 WHERE id = $2", 100, fromID) if err != nil { return err } _, err = tx.Exec(ctx, "UPDATE accounts SET balance = balance + $1 WHERE id = $2", 100, toID) return err })

DDL または単一ステートメントには、ExecWithRetry を使用します。

err := occretry.ExecWithRetry(ctx, pool, occretry.DefaultConfig(), "CREATE TABLE IF NOT EXISTS users (id UUID PRIMARY KEY, name TEXT)")
重要

WithRetryBEGIN/COMMIT/ROLLBACK を内部的に管理します。コールバックはトランザクションを受け取り、データベースオペレーションのみを含むものとし、再試行しても安全であることが必要です。

より包括的な例とユースケースについては、「Go 用 Aurora DSQL コネクタの例」を参照してください。

説明
example_preferred 推奨: 同時クエリによる接続プール
トランザクション BEGIN/COMMIT/ROLLBACK によるトランザクション処理
occ_retry エクスポネンシャルバックオフによる OCC 競合の処理
connection_string 設定に接続文字列を使用する