AWS RDS Proxy 完整配置指南(PostgreSQL)
本文记录 Aurora PostgreSQL 使用 RDS Proxy 的全流程,包括 Secrets Manager 配置、IAM 角色创建、Proxy 创建、TLS 连接以及常见报错处理。适合需要反复查阅的运维参考。
目录
- 为什么需要 RDS Proxy
- 整体架构
- 前提条件
- Step 1:创建 Secrets Manager Secret
- Step 2:创建 IAM Role(Proxy 专用)
- Step 3:创建 RDS Proxy
- Step 4:通过 Proxy 连接数据库(psql)
- 密码重置后更新 Secret
- 常见报错与解决方法
- 安装扩展(CREATE EXTENSION)
1. 为什么需要 RDS Proxy
| 问题 | RDS Proxy 的解决方案 |
|---|---|
| 短连接太多(Lambda 等无服务器场景) | 连接池复用,大幅减少连接数 |
| 数据库故障切换慢 | Proxy 自动感知 Failover,应用层无感知 |
| 密码明文写在代码里 | 统一通过 Secrets Manager 管理凭证 |
| 连接泄露风险 | Proxy 统一管理连接生命周期 |
2. 整体架构
应用 / psql
│
▼
[RDS Proxy Endpoint] ─── 读取凭证 ──▶ [Secrets Manager]
│ ▲
│ 使用 IAM Role 读取 secret │
│ [IAM Role]
▼
[Aurora PostgreSQL 集群]
关键依赖关系:
- Proxy 使用 IAM Role 来调用 Secrets Manager API
- IAM Role 的策略需要允许
secretsmanager:GetSecretValue - Secrets Manager 的 secret 存储
{"username":"xxx","password":"xxx"} - Proxy 用 secret 中的凭证去连接真实的 RDS/Aurora
3. 前提条件
- 已有 Aurora PostgreSQL 或 RDS PostgreSQL 实例
- VPC / Subnet / Security Group 已配置好
- 有 AWS 控制台或 CLI 操作权限
- AWS CLI 已安装并配置 (
aws configure)
4. Step 1:创建 Secrets Manager Secret
RDS Proxy 只能通过 Secrets Manager 获取数据库凭证,不能直接传密码。每个数据库用户需要一个 secret。
控制台操作
- 进入 AWS Secrets Manager → Store a new secret
- Secret type 选择 Credentials for Amazon RDS database
- 填写:
- User name:
postgres(或你的主用户名) - Password:数据库密码
- User name:
- 选择对应的 RDS 实例 / Aurora 集群
- Secret name 填写,例如:
rds/myapp/admin - 其余保持默认 → Store
CLI 操作
aws secretsmanager create-secret \
--name "rds/myapp/admin" \
--description "RDS Proxy credentials for postgres user" \
--region ap-northeast-1 \
--secret-string '{"username":"postgres","password":"your-password-here"}'
⚠️ Secret 格式要求
Secret 必须是以下 JSON 格式,字段名不能错:
{
"username": "postgres",
"password": "your-password-here"
}
如果格式不对,Proxy 会报
This RDS proxy has no credentials for the role错误。
5. Step 2:创建 IAM Role
RDS Proxy 需要一个 IAM Role 来读取 Secrets Manager 中的凭证。这是最容易被遗漏的步骤。
控制台操作
- 进入 IAM → Roles → Create role
- Trusted entity type 选 AWS service
- Use case 选 RDS → RDS – Add Role to Database
- 点击 Next,在权限策略搜索并勾选 AmazonRDSDataFullAccess(或创建自定义策略,见下方)
- Role name 填写,例如:
rds-proxy-role - Create role
更精细的自定义 IAM 策略(推荐)
只授予读取指定 secret 的权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowProxyReadSecret",
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": [
"arn:aws:secretsmanager:ap-northeast-1:YOUR_ACCOUNT_ID:secret:rds/myapp/admin-*"
]
},
{
"Sid": "AllowKMSDecrypt",
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "*",
"Condition": {
"StringEquals": {
"kms:ViaService": "secretsmanager.ap-northeast-1.amazonaws.com"
}
}
}
]
}
Trust Policy(信任策略)
IAM Role 的 Trusted Entity 必须设置为 RDS 服务:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "rds.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
CLI 创建 IAM Role
# 1. 创建信任策略文件
cat > /tmp/trust-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "rds.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
}
EOF
# 2. 创建 Role
aws iam create-role \
--role-name rds-proxy-role \
--assume-role-policy-document file:///tmp/trust-policy.json
# 3. 创建权限策略
cat > /tmp/proxy-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": "arn:aws:secretsmanager:ap-northeast-1:YOUR_ACCOUNT_ID:secret:rds/*"
},
{
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "*",
"Condition": {
"StringEquals": {
"kms:ViaService": "secretsmanager.ap-northeast-1.amazonaws.com"
}
}
}
]
}
EOF
# 4. 附加策略到 Role
aws iam put-role-policy \
--role-name rds-proxy-role \
--policy-name rds-proxy-secrets-policy \
--policy-document file:///tmp/proxy-policy.json
6. Step 3:创建 RDS Proxy
控制台操作
- 进入 RDS → 左侧导航 → Proxies → Create proxy
- 填写配置:
| 配置项 | 填写内容 |
|---|---|
| Proxy identifier | my-proxy(自定义名称) |
| Engine family | PostgreSQL |
| Require Transport Layer Security | ✅ 勾选(推荐) |
| Idle client connection timeout | 1800(默认) |
-
Target group configuration:
- Database → 选择你的 Aurora 集群或 RDS 实例
-
Connectivity:
- Secrets Manager ARN → 选择 Step 1 创建的 secret(可添加多个,对应多个 DB 用户)
- IAM role → 选择 Step 2 创建的
rds-proxy-role - Subnets → 选择与 RDS 同 VPC 的子网(至少 2 个 AZ)
- VPC security group → 选择允许访问 RDS 端口(5432)的 Security Group
-
Create proxy → 等待状态变为
available(约 5 分钟)
CLI 操作
aws rds create-db-proxy \
--db-proxy-name my-proxy \
--engine-family POSTGRESQL \
--role-arn arn:aws:iam::YOUR_ACCOUNT_ID:role/rds-proxy-role \
--vpc-subnet-ids subnet-xxxxx subnet-yyyyy \
--require-tls \
--auth '[{"AuthScheme":"SECRETS","SecretArn":"arn:aws:secretsmanager:ap-northeast-1:YOUR_ACCOUNT_ID:secret:rds/myapp/admin-xxxxx","IAMAuth":"DISABLED"}]'
# 绑定 Proxy 到 Aurora 集群
aws rds register-db-proxy-targets \
--db-proxy-name my-proxy \
--db-cluster-identifiers your-aurora-cluster-id
查看 Proxy 状态
# 查看 Proxy 状态
aws rds describe-db-proxies --db-proxy-name my-proxy
# 查看后端目标健康状态(应为 AVAILABLE)
aws rds describe-db-proxy-targets --db-proxy-name my-proxy
7. Step 4:通过 Proxy 连接数据库
下载 RDS SSL 证书
wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
psql 连接命令
psql "host=your-proxy-name.proxy-xxxxxx.ap-northeast-1.rds.amazonaws.com \
port=5432 \
dbname=your_database \
user=postgres \
sslmode=require \
sslrootcert=global-bundle.pem"
通过环境变量设置 TLS(可写入 .bashrc)
export PGSSLMODE=require
export PGSSLROOTCERT=/path/to/global-bundle.pem
之后直接:
psql -h your-proxy-endpoint -U postgres -d your_database
8. 密码重置后更新 Secret
重置 RDS 主密码后,必须同步更新 Secrets Manager 中的 secret,否则 Proxy 会因密码不一致报错。
方法一:控制台更新(推荐)
- Secrets Manager → 搜索你的 secret → 点击进入
- Retrieve secret value → Edit
- 修改
password字段为新密码 - Save
方法二:CLI 更新
aws secretsmanager update-secret \
--secret-id arn:aws:secretsmanager:ap-northeast-1:YOUR_ACCOUNT_ID:secret:rds/myapp/admin-xxxxx \
--secret-string '{"username":"postgres","password":"your-new-password"}'
⚠️ 注意 JSON 引号转义问题:在 Linux/Mac 用单引号包裹整体;在 Windows PowerShell 中需转义双引号。
验证是否更新成功
aws secretsmanager get-secret-value \
--secret-id arn:aws:secretsmanager:ap-northeast-1:YOUR_ACCOUNT_ID:secret:rds/myapp/admin-xxxxx \
--query SecretString \
--output text | python3 -m json.tool
输出应为:
{
"username": "postgres",
"password": "your-new-password"
}
9. 常见报错与解决方法
报错 1:no credentials for the role
FATAL: This RDS proxy has no credentials for the role "postgres".
Check the credentials for this role and try again.
原因:Proxy 在 Secrets Manager 中找不到对应用户的 secret。
解决:
- 检查 secret 中
username字段是否与连接时使用的用户名完全一致 - 在 Proxy 配置 → Modify → 确认该 secret 已关联到 Proxy
- 检查 IAM Role 是否有权限读取该 secret
报错 2:requires TLS connections
FATAL: This RDS Proxy requires TLS connections.
原因:Proxy 开启了 Require TLS,但 psql 未使用 SSL。
解决:
psql "host=proxy-endpoint dbname=mydb user=postgres sslmode=require"
报错 3:password is wrong
FATAL: The password that was provided for the role "postgres" is wrong.
原因:Secrets Manager 中的密码与数据库实际密码不一致(常见于密码重置后未更新 secret)。
解决:按照 Step 8 更新 secret。
报错 4:permission denied to create extension
ERROR: permission denied to create extension "dblink"
HINT: Must be superuser to create this extension.
原因:当前用户不是 superuser。
解决:见 Step 10。
报错 5:IAM role cannot retrieve credentials
Credentials couldn't be retrieved. The IAM role "arn:aws:iam::xxx:role/rds-proxy-role"
doesn't have access to retrieve credentials from Secrets Manager.
原因:IAM Role 策略缺少 secretsmanager:GetSecretValue 权限,或 Resource ARN 不匹配。
解决:检查并更新 IAM Role 策略,确认 Resource 中的 secret ARN 正确。
# 查看当前 Role 策略
aws iam get-role-policy \
--role-name rds-proxy-role \
--policy-name rds-proxy-secrets-policy
10. 安装扩展(CREATE EXTENSION)
Aurora / RDS 不支持直接使用 OS 级 superuser,需通过以下方式。
使用 postgres 主账号安装
# 直接用 postgres 主账号连接(主账号具有 rds_superuser 权限)
psql "host=your-proxy-endpoint dbname=postgres user=postgres sslmode=require"
CREATE EXTENSION dblink;
CREATE EXTENSION pg_stat_statements;
-- 其他扩展...
将安装权限委托给其他用户
-- 以 postgres 账号执行
GRANT rds_extension TO your_user;
-- 之后 your_user 可自行安装
CREATE EXTENSION dblink;
查看已安装的扩展
SELECT * FROM pg_extension;
参考链接
- AWS 官方文档:RDS Proxy 创建
- RDS Proxy 凭证配置(Secrets Manager)
- RDS Proxy IAM 认证配置
- RDS Proxy 故障排除
- RDS SSL/TLS 证书下载
最后更新:2026-03-11
