Rust SQLx용 Aurora DSQL 커넥터
Rust용 Aurora DSQL 커넥터
커넥터는 토큰 생성, SSL 구성 및 연결 관리를 처리하므로 애플리케이션 로직에 집중할 수 있습니다.
커넥터 정보
Rust용 Aurora DSQL 커넥터는 IAM 토큰 생성을 처리하는 SQLx 위에 인증 계층을 추가하여 기존 SQLx 워크플로를 변경하지 않고도 Aurora DSQL에 연결할 수 있도록 합니다.
Aurora DSQL 인증이란 무엇인가요?
Aurora DSQL에서 인증에는 다음이 포함됩니다.
-
IAM 인증: 모든 연결은 시간 제한 토큰이 있는 IAM 기반 인증을 사용합니다.
-
토큰 생성: 커넥터는 AWS 자격 증명을 사용하여 인증 토큰을 생성하며 이러한 토큰에는 구성 가능한 수명이 있습니다.
Rust용 Aurora DSQL 커넥터는 이러한 요구 사항을 이해하고 연결을 설정할 때 IAM 인증 토큰을 자동으로 생성합니다.
특성
-
자동 IAM 인증 - Aurora DSQL 토큰 생성 및 새로 고침 처리
-
SQLx 기반 - Rust용 주요 비동기식 PostgreSQL 드라이버 래핑
-
원활한 통합 - 기존 SQLx 워크플로와 함께 작동
-
연결 풀링 -
pool기능을 통해 백그라운드 토큰 새로 고침을 사용한 옵트인 풀 지원 -
리전 자동 감지 - DSQL 클러스터 호스트 이름에서 AWS 리전 추출
-
AWS 자격 증명 지원 - AWS 프로필 및 기본 자격 증명 체인 지원
-
OCC 재시도 - 지수 백오프 및 지터를 사용하여 옵트인 낙관적 동시성 제어 재시도
애플리케이션 예시
전체 예제는 GitHub의 예제 애플리케이션
빠른 시작 설명서
요구 사항
-
Rust 1.80 이상
-
AWS CLI, 환경 변수 또는 IAM 역할을 통해 AWS 자격 증명 구성
설치
Cargo.toml에 추가합니다.
[dependencies] aurora-dsql-sqlx-connector = "0.1.2"
대부분의 애플리케이션에서 pool 및 occ 기능을 모두 활성화합니다.
[dependencies] aurora-dsql-sqlx-connector = { version = "0.1.2", features = ["pool", "occ"] }
기능 플래그
| 기능 | 기본값 | 설명 |
|---|---|---|
pool |
아니요 | 백그라운드 토큰 새로 고침이 포함된 SQLx 풀 도우미 |
occ |
아니요 | OCC 재시도 도우미(retry_on_occ, is_occ_error) |
사용법
풀 연결
use sqlx::Row; #[tokio::main] async fn main() -> anyhow::Result<()> { let pool = aurora_dsql_sqlx_connector::pool::connect( "postgres://admin@your-cluster.dsql.us-east-1.on.aws/postgres" ).await?; // Read let row = sqlx::query("SELECT 'Hello, DSQL!' as greeting") .fetch_one(&pool) .await?; let greeting: &str = row.get("greeting"); println!("{}", greeting); // Write — you must wrap writes in a transaction let mut tx = pool.begin().await?; sqlx::query("INSERT INTO users (id, name) VALUES (gen_random_uuid(), $1)") .bind("Alice") .execute(&mut *tx) .await?; tx.commit().await?; pool.close().await; Ok(()) }
단일 연결
간단한 스크립트의 경우 또는 연결 풀링이 필요하지 않은 경우:
use sqlx::Row; #[tokio::main] async fn main() -> anyhow::Result<()> { let mut conn = aurora_dsql_sqlx_connector::connection::connect( "postgres://admin@your-cluster.dsql.us-east-1.on.aws/postgres" ).await?; let row = sqlx::query("SELECT 1 as value") .fetch_one(&mut conn) .await?; let value: i32 = row.get("value"); println!("Result: {}", value); Ok(()) }
connection::connect()를 직접적으로 호출할 때마다 새 IAM 토큰이 생성됩니다. 토큰 기간보다 긴 작업의 경우 새 연결을 생성합니다.
고급 사용
호스트 구성
커넥터는 전체 클러스터 엔드포인트(리전 자동 감지)와 클러스터 ID(리전 필수)를 모두 지원합니다.
// Full endpoint (region auto-detected) let opts = DsqlConnectOptions::from_connection_string( "postgres://admin@your-cluster.dsql.us-east-1.on.aws/postgres" )?; // Cluster ID (region required) let opts = DsqlConnectOptions::from_connection_string( "postgres://admin@your-cluster-id/postgres?region=us-east-1" )?;
AWS 프로필
자격 증명에 대한 AWS 프로파일 지정:
let pool = aurora_dsql_sqlx_connector::pool::connect( "postgres://admin@your-cluster.dsql.us-east-1.on.aws/postgres?profile=production" ).await?;
연결 문자열 형식
커넥터는 다음의 PostgreSQL 연결 문자열 형식을 지원합니다.
postgres://[user@]host[:port]/[database][?param=value&...] postgresql://[user@]host[:port]/[database][?param=value&...]
지원되는 쿼리 파라미터는 region, profile, tokenDurationSecs, ormPrefix입니다.
풀 구성
사용자 지정 풀 설정의 경우 PgPoolOptions를 connect_with()에 전달합니다.
use aurora_dsql_sqlx_connector::DsqlConnectOptions; use sqlx::postgres::PgPoolOptions; let config = DsqlConnectOptions::from_connection_string( "postgres://admin@your-cluster.dsql.us-east-1.on.aws/postgres" )?; let pool = aurora_dsql_sqlx_connector::pool::connect_with( &config, PgPoolOptions::new().max_connections(20), ).await?;
프로그래밍 방식 구성
프로그래밍 방식 구성을 위해서는 DsqlConnectOptionsBuilder를 사용합니다.
use aurora_dsql_sqlx_connector::{DsqlConnectOptionsBuilder, Region}; use sqlx::postgres::PgConnectOptions; let pg = PgConnectOptions::new() .host("your-cluster.dsql.us-east-1.on.aws") .username("admin") .database("postgres"); let opts = DsqlConnectOptionsBuilder::default() .pg_connect_options(pg) .region(Some(Region::new("us-east-1"))) .build()?; let mut conn = aurora_dsql_sqlx_connector::connection::connect_with(&opts).await?;
OCC 재시도
Aurora DSQL은 낙관적 동시성 제어(OCC)를 사용합니다. 두 개의 트랜잭션이 동일한 데이터를 수정할 경우, 먼저 커밋된 트랜잭션이 우선권을 가지며 두 번째 트랜잭션은 OCC 오류를 수신합니다.
OCC 재시도가 옵트인되었습니다. occ 기능을 활성화하고 retry_on_occ를 사용하여 지수 백오프 및 지터로 자동 재시도를 활성화합니다.
use aurora_dsql_sqlx_connector::{retry_on_occ, OCCRetryConfig}; let config = OCCRetryConfig::default(); // max_attempts: 3, exponential backoff retry_on_occ(&config, || async { let mut tx = pool.begin().await?; sqlx::query("UPDATE accounts SET balance = balance - 100 WHERE id = $1") .bind(account_id) .execute(&mut *tx) .await?; tx.commit().await?; Ok(()) }).await?;
주의
OCC 충돌 시 retry_on_occ는 전체 클로저를 다시 실행하므로 클로저가 데이터베이스 작업만 포함해야 하며 재시도해도 안전해야 합니다.
구성 옵션
| Field | Type | 기본값 | 설명 |
|---|---|---|---|
host |
String |
(필수) | 클러스터 엔드포인트 또는 클러스터 ID |
region |
Option<Region> |
(자동 탐지됨) | AWS 리전, 호스트가 클러스터 ID인 경우 필수 |
user |
String |
"admin" |
데이터베이스 사용자 |
database |
String |
"postgres" |
데이터베이스 이름 |
port |
u16 |
5432 |
데이터베이스 포트 |
profile |
Option<String> |
None |
자격 증명의 AWS 프로파일 이름 |
tokenDurationSecs |
u64 |
900(15분) |
토큰 유효 기간(초 단위) |
ormPrefix |
Option<String> |
None |
application_name의 ORM 접두사(예: "diesel"에서 "diesel:aurora-dsql-rust-sqlx/{version}" 생성) |
Authentication
커넥터는 AWS 자격 증명을 사용해 토큰을 생성하여 Aurora DSQL 인증을 자동으로 처리합니다. AWS 리전을 제공하지 않으면 커넥터가 호스트 이름에서 리전을 구문 분석합니다.
Aurora DSQL의 인증에 대한 자세한 내용은 Aurora DSQL에 대한 인증 및 권한 부여 섹션을 참조하세요.
토큰 생성
-
연결 풀: 백그라운드 작업은 토큰 기간의 80% 시점에 토큰을 새로 고칩니다.
pool.close().await를 직접적으로 호출하여 새로 고침 작업을 중지하고 풀 리소스를 해제합니다. -
단일 연결: 커넥터는 연결 시 새 토큰을 생성합니다.
-
토큰 생성은 비용이 거의 들지 않는 로컬 SigV4 사전 서명 작업입니다.
관리자와 일반 사용자
-
"admin"이라는 사용자는 관리자 인증 토큰을 자동으로 사용
-
다른 모든 사용자는 일반 인증 토큰을 사용합니다.
-
커넥터는 각 연결에 대해 동적으로 토큰을 생성합니다.