如何使用 IAM 数据库身份验证和 Python 在 MySQL RDS 中进行身份验证
How to authenticate in MySQL RDS using IAM DB Authentication and Python
我有一个 AWS RDS 数据库 运行 MySQL 5.6.39,启用了 IAM 数据库身份验证。
首先,我成功完成了 Tutorial: Configuring a Lambda Function to Access Amazon RDS in an Amazon VPC,这是我下一步的起点。
我想使用 IAM 凭据登录,因此,按照 this and this 教程,我做了:
创建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)")
我使用 AWS CLI 从附加了策略的 EC2 实例中尝试查找 If it was a python error。
获取令牌:
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)
政策不正确!
Resource
不是 DB ARN,而是 "arn:aws:rds-db:<AWS_REGION>:<AWS_ACCOUNT_ID>:dbuser:<AWS_DB_RESOURCE_ID>/<DB_USERNAME>"
要从管理控制台获取此信息,您可以转到:
- AWS_REGION - 地区代码,例如
eu-west-2
或 here. 中的任何其他代码
- AWS_ACCOUNT_ID - 从 Account Settings.
中获取
- AWS_DB_RESOURCE_ID - 在数据库页面的
Details\Configuration\Resource ID
中找到它,它以 db-
. 开头
- DB_USERNAME - 是
lambda
因为它是在步骤 2 中创建的。
顺便说一下,和 Michael - sqlbot pointed out here and in this 一样,令牌的生成是本地的,因此获取它不应被解释为获取正确的密码。
我有一个 AWS RDS 数据库 运行 MySQL 5.6.39,启用了 IAM 数据库身份验证。
首先,我成功完成了 Tutorial: Configuring a Lambda Function to Access Amazon RDS in an Amazon VPC,这是我下一步的起点。
我想使用 IAM 凭据登录,因此,按照 this and this 教程,我做了:
创建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)")
我使用 AWS CLI 从附加了策略的 EC2 实例中尝试查找 If it was a python error。
获取令牌:
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)
政策不正确!
Resource
不是 DB ARN,而是 "arn:aws:rds-db:<AWS_REGION>:<AWS_ACCOUNT_ID>:dbuser:<AWS_DB_RESOURCE_ID>/<DB_USERNAME>"
要从管理控制台获取此信息,您可以转到:
- AWS_REGION - 地区代码,例如
eu-west-2
或 here. 中的任何其他代码
- AWS_ACCOUNT_ID - 从 Account Settings. 中获取
- AWS_DB_RESOURCE_ID - 在数据库页面的
Details\Configuration\Resource ID
中找到它,它以db-
. 开头
- DB_USERNAME - 是
lambda
因为它是在步骤 2 中创建的。
顺便说一下,和 Michael - sqlbot pointed out here and in this