使用 Ruby 连接器连接到 Aurora DSQL 集群
Aurora DSQL Connector for Ruby
此连接器处理令牌生成、SSL 配置和连接池,因此您可以专注于应用程序逻辑。
关于连接器
Amazon Aurora DSQL 要求使用 IAM 身份验证以及限时令牌,而现有 Ruby PostgreSQL 驱动程序并不原生支持这种方法。适用于 Ruby 的 Aurora DSQL 连接器在 pg gem 之上添加一个身份验证层来处理 IAM 令牌生成,使您无需更改现有 pg 工作流程即可连接到 Aurora DSQL。
什么是 Aurora DSQL 身份验证?
在 Aurora DSQL 中,身份验证包括:
-
IAM 身份验证:所有连接都使用基于 IAM 的身份验证和限时令牌
-
令牌生成:连接器使用 AWS 凭证生成身份验证令牌,并且这些令牌具有可配置的生命周期
适用于 Ruby 的 Aurora DSQL 连接器了解这些要求,并在建立连接时自动生成 IAM 身份验证令牌。
功能
-
自动 IAM 身份验证:处理 Aurora DSQL 令牌生成与刷新
-
在 pg 之上构建:封装了适用于 Ruby 的常用 PostgreSQL gem
-
无缝集成:可与现有的 pg gem 工作流程结合使用
-
连接池:通过
connection_poolgem 提供内置支持,具有 max_lifetime 强制执行 -
区域自动检测:从 Aurora DSQL 集群主机名中提取 AWS 区域
-
AWS 凭证支持:支持 AWS 配置文件和自定义凭证提供商
-
OCC 重试:选择加入乐观并发控制重试,具有指数回退
示例应用程序
有关完整的示例,请参阅 GitHub 上的示例应用程序
快速入门指南
要求
-
Ruby 3.1 或更高版本
-
已配置 AWS 凭证(通过 AWS CLI、环境变量或 IAM 角色)
安装
添加到您的 Gemfile:
gem "aurora-dsql-ruby-pg"
或者直接安装:
gem install aurora-dsql-ruby-pg
用法
池连接
require "aurora_dsql_pg" # Create a connection pool with OCC retry enabled pool = AuroraDsql::Pg.create_pool( host: "your-cluster.dsql.us-east-1.on.aws", occ_max_retries: 3 ) # Read pool.with do |conn| result = conn.exec("SELECT 'Hello, DSQL!'") puts result[0]["?column?"] end # Write — you must wrap writes in a transaction pool.with do |conn| conn.transaction do conn.exec_params("INSERT INTO users (id, name) VALUES (gen_random_uuid(), $1)", ["Alice"]) end end pool.shutdown
单一 连接
对于简单的脚本或不需要连接池时:
conn = AuroraDsql::Pg.connect(host: "your-cluster.dsql.us-east-1.on.aws") conn.exec("SELECT 1") conn.close
高级用法
主机配置
该连接器支持完整的集群端点(自动检测区域)和集群 ID(需要区域):
# Full endpoint (region auto-detected) pool = AuroraDsql::Pg.create_pool( host: "your-cluster.dsql.us-east-1.on.aws" ) # Cluster ID (region required) pool = AuroraDsql::Pg.create_pool( host: "your-cluster-id", region: "us-east-1" )
AWS 配置文件
为凭证指定 AWS 配置文件:
pool = AuroraDsql::Pg.create_pool( host: "your-cluster.dsql.us-east-1.on.aws", profile: "production" )
连接字符串格式
该连接器支持 PostgreSQL 连接字符串格式:
postgres://[user@]host[:port]/[database][?param=value&...] postgresql://[user@]host[:port]/[database][?param=value&...]
支持的查询参数:region、profile、tokenDurationSecs。
# Full endpoint with profile pool = AuroraDsql::Pg.create_pool( "postgres://admin@cluster.dsql.us-east-1.on.aws/postgres?profile=dev" )
OCC 重试
Aurora DSQL 使用乐观并发控制(OCC)。当两个事务修改相同的数据时,提交的第一个事务获胜,第二个事务收到 OCC 错误。
OCC 重试为选择加入的。当创建池时设置 occ_max_retries,以在 pool.with 上启用带指数回退和抖动的自动重试功能:
pool = AuroraDsql::Pg.create_pool( host: "your-cluster.dsql.us-east-1.on.aws", occ_max_retries: 3 ) pool.with do |conn| conn.transaction do conn.exec_params("UPDATE accounts SET balance = balance - $1 WHERE id = $2", [100, from_id]) conn.exec_params("UPDATE accounts SET balance = balance + $1 WHERE id = $2", [100, to_id]) end end
警告
pool.with 不会在事务中自动封装块。您必须自行为写入操作调用 conn.transaction。发生 OCC 冲突时,连接器会重新执行整个块,因此它应仅包含数据库操作并且可以安全地重试。
要对单个调用跳过重试,请传递 retry_occ: false:
pool.with(retry_occ: false) do |conn| conn.exec("SELECT 1") end
配置选项
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| host | 字符串 | (必需) | 集群端点或集群 ID |
| region | 字符串 | (自动检测) | AWS 区域;如果主机是集群 ID,则为必需 |
| 用户 | 字符串 | “admin” | 数据库用户 |
| database | 字符串 | “postgres” | 数据库名称 |
| 端口 | 整数 | 5432 | 数据库端口 |
| 配置文件 | 字符串 | nil | 凭证的 AWS 配置文件名称 |
| token_duration | 整数 | 900(15 分钟) | 令牌有效期以秒为单位(支持的最长时间:1 周,默认值:15 分钟) |
| credentials_provider | Aws::Credentials | nil | 自定义凭证提供商 |
| max_lifetime | 整数 | 3300(55 分钟) | 最大连接生命周期,以秒为单位 |
| application_name | 字符串 | nil | application_name 的 ORM 前缀 |
| 日志记录程序 | 记录器 | nil | OCC 重试警告的记录器 |
| occ_max_retries | 整数 | nil(已禁用) | pool.with 上的 OCC 最大重试次数;设置后启用重试 |
create_pool 还接受带有选项哈希值的 pool: 关键字,您可以直接将其传递给 ConnectionPool.new。如果忽略 pool:,则连接器默认为 {size: 5, timeout: 5}。您提供的键仅会覆盖那些特定的默认值。
pool = AuroraDsql::Pg.create_pool( host: "your-cluster.dsql.us-east-1.on.aws", pool: { size: 10, timeout: 10 } )
身份验证
该连接器通过使用 AWS 凭证生成令牌来自动处理 Aurora DSQL 身份验证。如果您未提供 AWS 区域,则连接器会从主机名中解析该区域。
有关 Aurora DSQL 中的身份验证的更多信息,请参阅 Aurora DSQL 的身份验证和授权。
管理员用户与普通用户
-
名为“admin”的用户会自动使用管理员身份验证令牌
-
所有其他用户都使用普通身份验证令牌
-
该连接器为每个连接动态生成令牌