RDS Proxy

RDS Proxy可以通过连接池和多路复用帮助进行连接管理,并通过自动连接到备用数据库实例同时保留应用程序连接,使应用程序能够更好地应对数据库故障。RDS Proxy 还可以通过对数据库实施 IAM 身份验证并将凭证安全地存储在 AWS Secrets Manager 中来帮助添加一层安全性。

创建RDS proxy

进入RDS Proxy页面,创建一个Proxy:

image-20231105094621759

Proxy configuration部分中,将Proxy identifier设置为rds-pg-labs-proxy并选择PostgreSQL引擎; 空闲客户端连接超时 设置选择合适的值,该值确定代理在终止空闲客户端连接之前保留它们的时间。默认值为 1,800 秒(30 分钟);在Target group configuration,选择之前创建的数据库;Connection pool maximum connections部分,定义了代理可以在数据库上建立的最大连接数,以参数值百分比表示:

image-20231105094825512

在Authentication部分,选择创建一个新的IAM Role;选择一开始创建的secret manager; 与 RDS 实例不同,RDS Proxy 一次仅支持一种身份验证方法,因此代理只能使用本机身份验证(用户名/密码)或 IAM 身份验证。这里先不选择IAM Authentication

image-20231105095209646

接下来,选择代理的子网以及安全组,最后创建proxy:

image-20231105095221976

获取Proxy Endpoint:

代理可能需要几分钟才能可用。为了通过代理连接到数据库实例,需要找到proxy的Endpoint:

image-20231105095550383

有兴趣可以查看RDS Proxy自动创建出来的Role,上面的权限如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetSecretValue",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:secretsmanager:us-west-2:145197526627:secret:secretPostgresMasterUser-NhpOuf"
            ]
        },
        {
            "Sid": "DecryptSecretValue",
            "Action": [
                "kms:Decrypt"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:kms:us-west-2:145197526627:key/2b18c9d9-1e00-43aa-a6d7-51a3a38ec199"
            ],
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "secretsmanager.us-west-2.amazonaws.com"
                }
            }
        }
    ]
}

信任实体:

image-20231105095527321

这里我们把RDS Proxy Endpoint保存为环境变量:

AWSREGION=`aws configure get region`

PRXENDP=`aws rds describe-db-proxies \
    --db-proxy-name rds-pg-labs-proxy \
    --region $AWSREGION \
    --query 'DBProxies[].Endpoint' \
    --output text`

image-20231105095729636

连接到Proxy

使用用户名和密码连接到RDS Proxy:

psql -h $PRXENDP -U $DBUSER -d pglab -W

上面一样可以正常执行命令:

image-20231105114251252

如果选择的是IAM认证,使用以下方式进行连接:

## Download the SSL CA certificate for RDS Proxy
wget https://www.amazontrust.com/repository/AmazonRootCA1.pem

## Set SSL related environment variables that `psql` will use
export PGSSLMODE='verify-full'
export PGSSLROOTCERT='./AmazonRootCA1.pem'

## Generate the token and set it in the `PGPASSWORD` environment variable that `psql` will use
export PGPASSWORD=`aws rds generate-db-auth-token \
    --hostname $PRXENDP \
    --port 5432 \
    --region $AWSREGION \
    --username $DBUSER`

## Connect using `psql`
psql -h $PRXENDP -U $DBUSER -d pglab