AWS RDS Proxy 完整配置指南(PostgreSQL)
AWS RDS Proxy 完整配置指南(PostgreSQL)

AWS RDS Proxy 完整配置指南(PostgreSQL)

内容目录

AWS RDS Proxy 完整配置指南(PostgreSQL)

本文记录 Aurora PostgreSQL 使用 RDS Proxy 的全流程,包括 Secrets Manager 配置、IAM 角色创建、Proxy 创建、TLS 连接以及常见报错处理。适合需要反复查阅的运维参考。


目录

  1. 为什么需要 RDS Proxy
  2. 整体架构
  3. 前提条件
  4. Step 1:创建 Secrets Manager Secret
  5. Step 2:创建 IAM Role(Proxy 专用)
  6. Step 3:创建 RDS Proxy
  7. Step 4:通过 Proxy 连接数据库(psql)
  8. 密码重置后更新 Secret
  9. 常见报错与解决方法
  10. 安装扩展(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。

控制台操作

  1. 进入 AWS Secrets ManagerStore a new secret
  2. Secret type 选择 Credentials for Amazon RDS database
  3. 填写:
    • User namepostgres(或你的主用户名)
    • Password:数据库密码
  4. 选择对应的 RDS 实例 / Aurora 集群
  5. Secret name 填写,例如:rds/myapp/admin
  6. 其余保持默认 → 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 中的凭证。这是最容易被遗漏的步骤。

控制台操作

  1. 进入 IAMRolesCreate role
  2. Trusted entity type 选 AWS service
  3. Use case 选 RDSRDS – Add Role to Database
  4. 点击 Next,在权限策略搜索并勾选 AmazonRDSDataFullAccess(或创建自定义策略,见下方)
  5. Role name 填写,例如:rds-proxy-role
  6. 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

控制台操作

  1. 进入 RDS → 左侧导航 → ProxiesCreate proxy
  2. 填写配置:
配置项 填写内容
Proxy identifier my-proxy(自定义名称)
Engine family PostgreSQL
Require Transport Layer Security 勾选(推荐)
Idle client connection timeout 1800(默认)
  1. Target group configuration

    • Database → 选择你的 Aurora 集群或 RDS 实例
  2. 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
  3. 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 会因密码不一致报错。

方法一:控制台更新(推荐)

  1. Secrets Manager → 搜索你的 secret → 点击进入
  2. Retrieve secret valueEdit
  3. 修改 password 字段为新密码
  4. 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。

解决

  1. 检查 secret 中 username 字段是否与连接时使用的用户名完全一致
  2. 在 Proxy 配置 → Modify → 确认该 secret 已关联到 Proxy
  3. 检查 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;

参考链接


最后更新:2026-03-11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注