首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法通过AWS.RDS.Signer连接到RDS

无法通过AWS.RDS.Signer连接到RDS
EN

Stack Overflow用户
提问于 2021-03-18 10:47:33
回答 1查看 1.8K关注 0票数 1

我试图使用以下代码和MySQL凭据从Lambda通过AWS.RDS.Signer连接到我的fake RDS:

代码语言:javascript
复制
1  const DB_REGION = 'ap-southeast-2a'
2  const DB_HOST = 'dbinstance.ddtev8utygt.ap-southeast-2.rds.amazonaws.com'
3  const DB_PORT = 3306
4  const DB_USER = 'anyuser'
5  const DB_NAME = 'anydb'
6
7  const signerOptions = {
8    region: DB_REGION,
9    hostname: DB_HOST,
10   port: DB_PORT,
11   username: DB_USER
12 }
13
14 const signer = new AWS.RDS.Signer(signerOptions)
15 const token = await signer.getAuthToken()
16 
17 const config = {
18   host: DB_HOST,
19   user: DB_USER,
20   password: token, // "Password123"
21   database: DB_NAME,
22   ssl: 'Amazon RDS',
23   authPlugins: {
24     mysql_clear_password: () => () => token
25   }
26 }

但我总是会犯这样的错误

代码语言:javascript
复制
"Access denied for user 'anyuser'@'172.14.1.12' (using password: NO)"

我不完全确定AWS.RDS.Signer是否需要这样做,但我选择了数据库中的以下选项:

代码语言:javascript
复制
Password and IAM database authentication
Authenticates using the database password and user credentials through AWS IAM users and roles. 

注意:,如果我将密码从令牌交换到line 20上的"Password123",我可以成功地连接到RDS。

我是在这里遗漏了什么,还是AWS.RDS.Signer只与RDS Proxy一起工作?

顺便说一句:getAuthToken函数给了我类似的东西(令牌截断)

"dbinstance.ddtev8utygt.apsoutheast2.rds.amazonaws.com:3306/Action=connect&DBUser=anyuser&&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAU7VGXF6UCWYZCFEG%2F20210318%2Fap-southeast-2a%2Frds-db%2Faws4_request&X-Amz-Date=20210318T105145Z&X-Amz-Expires=900&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEAsaDmFwLXNvdXRoZWFzdC0yIkgwRgIhAKg8ibwNJ4E3hSOuq7HtDFvqHxmTlpOUk3I6EH2%2B9VdOV3RQ%2F03xiVdvjhEBkHqEXHQ%3D&X-Amz-Signature=749d931f74873e6c2c0d4fec94f0743f42efd5aa95ca0ac0f05c4bef30e3bd4d&X-Amz-SignedHeaders=host"

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-21 02:51:27

我终于可以使用IAM(又名AWS.RDS.Signer)通过Lamdba连接到我的RDS

那么问题出在哪里?

  • 短篇小说:

我在我的AWS.RDS.Signer.策略和道具中使用了错误的区域

我假设可用性区域 (ap-southeast-2a)等于该区域,但事实并非如此。在创建AWS命令行creds时,将实际描述正确的区域。要查找该区域,请从终端调用cat ~/.aws/config。我的默认区域实际上是region=ap-southeast-2

  • 长篇故事:

当我开始使用AWS.RDS.Signer时,我按照这里的指令提取策略的DB信息,我使用了以下命令

代码语言:javascript
复制
aws rds describe-db-instances --db-instance-identifier <MY INSTANCE NAME> --query "DBInstances[*].DbiResourceId" --region ap-southeast-2a

但是我得到了一个错误Could not connect to the endpoint URL: "https://rds.ap-southeast-2a.amazonaws.com/"

在谷歌上搜索了一段时间后,我意识到这个地区是不对的。这给了我一个提示,可以在策略和Lambda函数的代码中改变这个区域。

代码语言:javascript
复制
{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Allow",
           "Action": [
               "rds-db:connect"
           ],
           "Resource": [
               "arn:aws:rds-db:<my-region>:<my-account-id>:dbuser:<my-db-resource-id>/<my-db-username>"
           ]
       }
   ]
}

然后,我在DB中创建了一个额外的用户(ssluser)来连接AWS.RDS.Signer令牌。

代码语言:javascript
复制
CREATE USER 'ssluser' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';
GRANT ALL PRIVILEGES ON <MY DB NAME>.* TO 'ssluser'@'%';
GRANT USAGE ON <MY DB NAME>.* TO 'ssluser'@'%' REQUIRE SSL;

下一步是将上述策略添加到EC2实例中,将ssh添加到实例中,安装MySQL客户端yum install mysql并尝试使用令牌连接到实例。

代码语言:javascript
复制
mysql --host=dbinstance.chteb5kjtggo.ap-southeast-2.rds.amazonaws.com --port=3306 --ssl-ca=rds-combined-ca-bundle.pem --enable-cleartext-plugin --user=ssluser --password=`aws rds generate-db-auth-token --hostname dbinstance.chteb5kjtggo.ap-southeast-2.rds.amazonaws.com --port 3306 --region ap-southeast-2 --username ssluser`

在没有提供密码的情况下成功连接到RDS之后,我只需将策略附加到我的 Lambda ,并将我的Lambda代码中的用户名和区域更改为

代码语言:javascript
复制
1  const DB_REGION = 'ap-southeast-2'
2  const DB_HOST = 'dbinstance.ddtev8utygt.ap-southeast-2.rds.amazonaws.com'
3  const DB_PORT = 3306
4  const DB_USER = 'ssluser'
5  const DB_NAME = 'anydb'

我希望这会对未来的人有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66689521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档