db身份验证和python在mysql-rds中进行身份验证

ioekq8ef  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(343)

我有一个运行MySQL5.6.39的aws rds数据库,启用了iam db身份验证。
首先,我成功地完成了教程:在amazonvpc中配置lambda函数来访问amazonrds,这是我下一步的出发点。
我想使用iam凭据登录,因此,遵循本教程,我做到了:
当我创建rds mysql示例时,我选择了 Enabling IAM database authentication .
创建了一个名为 lambda :

CREATE USER 'lambda' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';
GRANT ALL PRIVILEGES ON test_db.* TO 'lambda'@'%';
FLUSH PRIVILEGES;

创建了iam策略,并将其附加到我用作lambda函数的执行角色的角色:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "rds-db:connect"
      ],
      "Resource": [
        "<DB-ARN>/lambda"
      ]
    }
  ]
}

创建了lambda函数:

import sys
import boto3
import logging
import pymysql

# rds settings

rds_host  = "<RDS-ENDPOINT>"
username = "lambda"
db_name = "test_db"

logger = logging.getLogger()
logger.setLevel(logging.INFO)

client = boto3.client('rds',region_name='eu-west-2')
token = client.generate_db_auth_token(rds_host,3306, name)
ssl = {'ca': 'rds-combined-ca-bundle.pem'} 
logger.info("token: "+ token)

conn = pymysql.connect(rds_host, user=username, passwd=token, db=db_name, connect_timeout=5, ssl=ssl)

logger.info("SUCCESS: Connection to RDS mysql instance succeeded")
def handler(event, context):
  ...

我得到以下错误:

error: (1045, "Access denied for user 'lambda'@'<LAMBDA_IP>' (using password: YES)")

为了找出是否是python错误,我使用了awscli,它来自附加了策略的ec2示例。
获取令牌:

aws rds generate-db-auth-token --hostname <RDS-ENDPOINT> --port 3306 --username lambda

使用我在上一步得到的令牌连接到数据库:

mysql -h <RDS-ENDPOINT> -u lambda --enable-cleartext-plugin --password='<TOKEN>'

我也犯了同样的错误:

mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'lambda'@'<EC2_IP>' (using password: YES)
snz8szmq

snz8szmq1#

政策不对!
这个 Resource 不是db arn,而是 "arn:aws:rds-db:<AWS_REGION>:<AWS_ACCOUNT_ID>:dbuser:<AWS_DB_RESOURCE_ID>/<DB_USERNAME>" 要从管理控制台获取此信息,可以转到:
例如,地区代码 eu-west-2 或者其他的。
aws\u account\u id-从帐户设置获取它。
aws\u db\u resource\u id-在中查找 Details\Configuration\Resource ID 在数据库页面中,它以 db- .
db\u用户名-is lambda 因为它是第二步创建的。
顺便说一句,正如michael-sqlbot在这里和这个答案中指出的,令牌的生成是本地的,所以获取它不应该被解释为获取正确的密码。

相关问题