AwsRdsIamDatabasePasswordProvider Controller Service
描述
每次请求 JDBC 连接时生成 Amazon RDS IAM 认证令牌。 生成的令牌替代数据库用户密码,因此 Lynxus 无需在 DBCP 服务中存储长期有效的凭据。
标签
属性
| 名称 | 默认值 | 可选值 | 描述 |
|---|---|---|---|
| AWS Credentials Provider Service | | 控制器服务 API:AwsCredentialsProviderServicecn.org.acal.lynxus-lynxus-aws-service-api-nar-2.11.8 | 提供用于签署 IAM 身份验证请求的 AWS 凭证的Controller Service。 |
| Region | us-west-2 |
| 服务所在的 AWS 区域 |
| Custom Region | | 自定义区域,例如 AWS 兼容服务提供商的区域 支持表达式语言:是(仅使用环境/系统变量求值) | |
| Token Request Endpoint | | 令牌请求端点采用主机名:端口格式,用于 IAM 令牌签名,覆盖 JDBC URL 中的主机名和端口。 |
状态管理
该组件不存储状态。
受限 (Restricted)
该组件不受限。
提供的 Service API
DatabasePasswordProvider
详细说明
概述
AwsRdsIamDatabasePasswordProvider 在每次请求 JDBC 连接时生成
Amazon RDS IAM 认证令牌。
该 Controller Service 实现了 Lynxus 的 DatabasePasswordProvider API,
因此可以被 DBCP Controller Service 引用,避免在 Lynxus 中存储长期有效的
数据库密码。
用法
- 配置一个
AWSCredentialsProviderControllerService,让密码提供器能够 获取 AWS 凭据(例如使用 IAM 角色或AssumeRoleWithWebIdentity)。 - 创建一个
AwsRdsIamDatabasePasswordProvider并引用该凭据提供器服务。 配置 AWS 区域。主机、端口和数据库用户继承自引用它的 DBCP 服务的 JDBC URL 和 "Database User" 属性。 - 更新 DBCP Controller Service,把 Database Password Provider 属性 设为新的 IAM 提供器。配置了提供器后,静态的 Password 属性会被忽略。
- 确保 JDBC URL 启用了 TLS,并包含 AWS 推荐的 SSL 参数
(例如 PostgreSQL 的
ssl=true&sslmode=verify-full)。
每当 DBCP 服务需要创建物理 JDBC 连接时,都会生成一个新的 IAM 令牌并作为 密码提供。已有的池化连接在数据库关闭之前仍然有效,因此 "Maximum Connection Lifetime" 等标准 Lynxus 池化属性仍然适用。
配置示例
PostgreSQL 角色与权限
以超级用户身份连接到 lynxus 数据库并执行:
CREATE ROLE lynxus_app LOGIN PASSWORD 'temporary';
GRANT rds_iam TO lynxus_app;
GRANT CONNECT ON DATABASE lynxus TO lynxus_app;
GRANT USAGE ON SCHEMA public TO lynxus_app;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO lynxus_app;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO lynxus_app;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT ALL PRIVILEGES ON TABLES TO lynxus_app;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT ALL PRIVILEGES ON SEQUENCES TO lynxus_app;
IAM 权限
给你的 IAM 角色(例如 myAuroraPostgresRole)附加类似如下的策略。
把 <region>、<account-id> 和 <db-resource-id> 替换为你的值:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "rds-db:connect",
"Resource": "arn:aws:rds-db:<region>:<account-id>:dbuser:<db-resource-id>/lynxus_app"
}
]
}
确保该角色的信任策略允许 Lynxus 主机(EC2、EKS 等)扮演(assume)它。
CLI 验证
生成 IAM 认证令牌,并用 psql 连接:
TOKEN=$(aws rds generate-db-auth-token \
--hostname database-1-instance-1.ccfuwyso6lcz.us-east-1.rds.amazonaws.com \
--port 5432 \
--region us-east-1 \
--username lynxus_app)
PGPASSWORD="$TOKEN" psql \
"host=database-1-instance-1.ccfuwyso6lcz.us-east-1.rds.amazonaws.com \
port=5432 user=lynxus_app dbname=lynxus \
sslmode=verify-full sslrootcert=/path/to/rds-combined-ca-bundle.pem"
验证通过后,按下述配置 Lynxus 的 DBCP 服务:
Database Connection URL:jdbc:postgresql://database-1-instance-1.ccfuwyso6lcz.us-east-1.rds.amazonaws.com:5432/lynxus?ssl=true&sslmode=verify-fullDatabase User:lynxus_appDatabase Password Provider:AwsRdsIamDatabasePasswordProvider
之后,Lynxus 会为每个新的 JDBC 连接自动签发 IAM 令牌。
通过位于 RDS Proxy 前端的网络负载均衡器连接
通过位于 RDS Proxy 前端的网络负载均衡器(NLB)连接时,JDBC URL 必须指向 NLB 端点,但 IAM 令牌必须为 RDS Proxy 端点签名。默认情况下,令牌使用从 JDBC URL 提取的主机名生成,这会导致认证失败。
使用可选的 Token Request Endpoint 属性,可以指定用于令牌签名的
RDS Proxy 端点(hostname:port),同时让 JDBC URL 中的 NLB 端点用于
实际的 TCP 连接。
CLI 验证
NLB_ENDPOINT="nlb-example.elb.us-east-1.amazonaws.com"
RDS_PROXY_ENDPOINT="my-proxy.proxy-example.us-east-1.rds.amazonaws.com"
TOKEN=$(aws rds generate-db-auth-token \
--hostname "$RDS_PROXY_ENDPOINT" \
--port 3306 \
--region us-east-1 \
--username lynxus_app)
mysql -h "$NLB_ENDPOINT" -P 3306 -u lynxus_app --password="$TOKEN"
验证通过后,按下述配置 Lynxus 的 DBCP 服务:
Database Connection URL:jdbc:mysql://nlb-example.elb.us-east-1.amazonaws.com:3306/mydbDatabase User:lynxus_appDatabase Password Provider:AwsRdsIamDatabasePasswordProviderToken Request Endpoint:my-proxy.proxy-example.us-east-1.rds.amazonaws.com:3306