【问题标题】:AWS RDS MySQL connection using IAM Role is not working使用 IAM 角色的 AWS RDS MySQL 连接不起作用
【发布时间】:2018-10-27 06:25:48
【问题描述】:

想提前通知我,我是 AWS 的新手。对于我的项目,我正在尝试通过 IAM 身份验证(IAM 角色)从部署在 EC2 实例上的 Tomcat 上的 Java 应用程序使用 AWS RDS MySQL。在从 Java 中尝试之前,我正在从 EC2 实例上的命令提示符中尝试它。我正在关注这个链接:

https://aws.amazon.com/premiumsupport/knowledge-center/users-connect-rds-iam/

到目前为止,我已经完成了以下操作(如果我没有使用正确的术语,请原谅):

  • 使用 AWS RDS 的 MySQL
  • 在我的 MySQL 实例上启用 IAM 身份验证
  • 为 EC2 创建 IAM 角色
  • 为上述 IAM 角色创建内联策略并授予所需的“操作”。还包括“资源”(我的数据库的用户名端点),如下所示:

    {
       "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>"
               ]
           }
       ]
    }
    
  • 将此 IAM 角色分配给我创建的 EC2 实例

我遵循了link at the top 中给出的所有内容,除了最后一个命令外,一切似乎都正常工作。

在链接中我创建了 DB 用户,如下所示:

CREATE USER dev_user IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';

链接中最后一个不起作用的命令是:

mysql -h {db or cluser endpoint} --ssl-ca={certificate file name with complete path} --ssl-verify-server-cert -u {dbusername2} -p"{authenticationtoken}" --enable-cleartext-plugin

每次我运行此命令时,它都会要求输入密码,然后出现错误。我不知道如何解决它。

在上面的 mysql 命令中,如果我传递我的 ma​​ster user-id(我将其创建为“admin”)并输入它的密码,我会收到如下错误:

[ec2-user@ip-xxx-xx-xx-16 ~]$ mysql -h <endpoint of my RDS DB instance> --ssl-ca=rds-combined-ca-bundle.pem --ssl-verify-server-cert -u admin -p 'aws rds generate-db-auth-token --hostname <endpoint of my RDS DB instance> --port 3306 --username dev_user' --enable-cleartext-plugin

输入密码: 错误 1059 (42000):标识符名称 'aws rds generate-db-auth-token --hostname --port' 太长

如果在同一个命令中我提供了上面创建的数据库用户 (dev_user)。如果在命令中提供“dev_user”作为用户以及是否输入密码,我会收到以下错误。 [在这种情况下,上面的链接没有设置密码,所以当它要求输入密码时我该怎么办?]

[ec2-user@ip-xxx-xx-xx-16 ~]$ mysql -h <endpoint of my RDS DB instance> --ssl-ca=rds-combined-ca-bundle.pem --ssl-verify-server-cert -u dev_user -p 'aws rds generate-db-auth-token --hostname <endpoint of my RDS DB instance> --port 3306 --username dev_user' --enable-cleartext-plugin

输入密码: 错误 1045 (28000): 用户 'dev_user'@'xxx.xx.xx.16' 的访问被拒绝(使用密码:YES)

当我在上述命令的两个位置输入“admin”时,我得到相同的“访问被拒绝...”错误。

我们将不胜感激。

谢谢。

【问题讨论】:

  • 我从未使用过 IAM,但有什么理由不能只配置安全组以允许 EC2 和 MySQL 实例相互通信(这是我使用的设置,它工作正常)。
  • @TimBiegeleisen 这不是安全组问题,因为错误 1045 表明存在连接,但访问被拒绝。 IAM 身份验证在开始时有点繁琐,但非常很有用,因为您不再需要在代码中嵌入密码或以其他方式管理它们。 IAM auth 使用的东西在底层非常类似于预签名的 URL 作为密码。
  • @Gauzy 这不应该要求你输入密码。确保-p&lt;here&gt;'token' 中没有空格或使用--password='token'。如果系统提示您输入密码,则说明您的命令行格式存在问题。
  • @Michael-sqlbot 很高兴知道。
  • 另一个烦恼是 IAM 策略编辑器不了解这些 ARN 或策略的工作原理,或者 rds-db:connect 是什么,因此它无法帮助您正确处理...... db-resource-id 是一个类似db-XXXXXX 的字符串,它在控制台中可见,但许多用户不太可能给予太多关注。

标签: amazon-rds amazon-iam aws-iam


【解决方案1】:

首先,-p 参数后面不能有空格。

其次,如果要内联执行aws rds generate-db-auth-token...,应该用打勾,而不是单引号。

mysql -h <endpoint of my RDS DB instance> --ssl-ca=rds-combined-ca-bundle.pem --ssl-verify-server-cert -u dev_user -p`aws rds generate-db-auth-token --hostname <endpoint of my RDS DB instance> --port 3306 --username dev_user` --enable-cleartext-plugin

【讨论】:

  • 感谢您指出这些错误并解决问题,非常感谢!为什么空间适用于某些参数而不适用于其他参数。标准是什么?我应该注意刻度而不是单引号,在其中一个 SO 回复中遇到它并使用它。您的回复和 Michael-sqlbot 帮助我清除了我的理解。如果可以的话,我会将您和他的回复都标记为答案。对于那些来到这里的人后记:请参考上面@Michael-sqlbot的评论,他还确认如果命令正确,它将不会要求输入密码。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 2016-11-21
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
相关资源
最近更新 更多