NBa*_*nca 5 python mysql amazon-web-services amazon-rds aws-lambda
我有一个运行 MySQL 5.6.39 的 AWS RDS 数据库,并启用了 IAM 数据库身份验证。
首先,我成功完成了教程:配置 Lambda 函数以访问 Amazon VPC 中的 Amazon RDS,这是我后续步骤的起点。
当我创建 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;
Run Code Online (Sandbox Code Playgroud)创建了一个 IAM 策略,并将其附加到我用作 lambda 函数的执行角色的角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds-db:connect"
],
"Resource": [
"<DB-ARN>/lambda"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)创建了一个 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):
...
Run Code Online (Sandbox Code Playgroud)我收到以下错误:
error: (1045, "Access denied for user 'lambda'@'<LAMBDA_IP>' (using password: YES)")
Run Code Online (Sandbox Code Playgroud)为了查找是否是 python 错误,我使用了 AWS CLI,从附加了策略的 EC2 实例。
获取令牌:
aws rds generate-db-auth-token --hostname <RDS-ENDPOINT> --port 3306 --username lambda
Run Code Online (Sandbox Code Playgroud)使用我在上一步中获得的令牌连接到数据库:
mysql -h <RDS-ENDPOINT> -u lambda --enable-cleartext-plugin --password='<TOKEN>'
Run Code Online (Sandbox Code Playgroud)我得到了同样的错误:
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)
Run Code Online (Sandbox Code Playgroud)政策不正确!
不是ResourceDB ARN,而是"arn:aws:rds-db:<AWS_REGION>:<AWS_ACCOUNT_ID>:dbuser:<AWS_DB_RESOURCE_ID>/<DB_USERNAME>"
要从管理控制台获取此信息,您可以访问:
eu-west-2的任何其他代码。Details\Configuration\Resource ID,它以db-.lambda因为它是在步骤 2 中创建的。顺便说一句,正如Michael - sqlbot在这里和这个答案中指出的那样,令牌的生成是本地的,因此获取它不应被解释为获取正确的密码。
| 归档时间: |
|
| 查看次数: |
4121 次 |
| 最近记录: |