通过IAM角色从EC2连接RDS Proxy的无密码配置咨询
从EC2通过IAM角色无密码连接RDS Proxy配置方案
一、EC2实例的IAM角色权限配置
给EC2实例附加的IAM角色添加以下权限策略,替换占位符为你的实际信息:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "rds-db:connect", "Resource": "arn:aws:rds-db:<区域ID>:<AWS账号ID>:dbuser:<RDS Proxy ID>/<数据库用户名>" }, { "Effect": "Allow", "Action": "sts:GetCallerIdentity", "Resource": "*" } ] }
占位符说明:
<区域ID>:例如us-east-1<AWS账号ID>:你的12位AWS账号数字ID<RDS Proxy ID>:RDS Proxy控制台详情页中的“Proxy ID”值<数据库用户名>:允许通过IAM认证连接的数据库账号
二、RDS Proxy与数据库配套配置
- 确认RDS Proxy已开启IAM Authentication = Required(你已完成此步骤)
- 给目标数据库用户配置IAM认证权限:
- MySQL:
ALTER USER '<数据库用户名>' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS'; - PostgreSQL:
CREATE USER <数据库用户名> WITH LOGIN; GRANT rds_iam TO <数据库用户名>;
- MySQL:
- 确保RDS Proxy的安全组允许EC2实例所在安全组访问数据库端口(如3306、5432)
三、EC2上的客户端连接操作
命令行示例(以MySQL为例)
- 生成临时认证令牌:
TOKEN=$(aws rds generate-db-auth-token --hostname <Proxy端点地址> --port <数据库端口> --username <数据库用户名> --region <区域ID>) - 使用令牌作为密码连接:
注:RDS CA证书可下载到EC2实例本地使用mysql -h <Proxy端点地址> -P <数据库端口> -u <数据库用户名> --password=$TOKEN --ssl-ca=/path/to/rds-combined-ca-bundle.pem
代码层示例(以PHP为例)
通过AWS SDK生成令牌后传入PDO连接:
require 'vendor/autoload.php'; use Aws\Rds\RdsClient; $rdsClient = new RdsClient([ 'region' => '<区域ID>', 'version' => 'latest' ]); $token = $rdsClient->generateDbAuthToken([ 'DBHostname' => '<Proxy端点地址>', 'Port' => <数据库端口>, 'DBUsername' => '<数据库用户名>' ]); $dsn = "mysql:host=<Proxy端点地址>;port=<数据库端口>;dbname=<目标数据库名>"; $pdo = new PDO($dsn, '<数据库用户名>', $token);
四、常见排查点
- 检查IAM角色策略中的Resource ARN是否完全匹配,尤其是Proxy ID和数据库用户名不能出错
- 确认EC2实例已正确附加目标IAM角色,可通过
aws sts get-caller-identity验证当前身份 - 确保数据库用户已正确配置IAM认证插件,可通过数据库客户端查询用户权限确认
- 检查RDS Proxy的日志,排查连接失败的具体原因
内容的提问来源于stack exchange,提问作者Reece
相关产品推荐
相关产品推荐

