我有一个运行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)
1条答案
按热度按时间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在这里和这个答案中指出的,令牌的生成是本地的,所以获取它不应该被解释为获取正确的密码。