【发布时间】:2018-05-13 18:30:21
【问题描述】:
我有一个运行 MySQL 5.6.39 并启用了 IAM DB 身份验证的 AWS RDS 数据库。
首先,我成功完成了Tutorial: Configuring a Lambda Function to Access Amazon RDS in an Amazon VPC,这是我下一步的起点。
我想使用 IAM 凭据登录,因此按照 this 和 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 实例中尝试查找是否是 python 错误。
-
获取令牌:
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)
【问题讨论】:
-
请注意,当您生成令牌时不会发生身份验证。令牌与预签名 URL 完全一样——它们是在本地生成的,不与任何 API 进行任何交互,并且在您尝试使用它们之前不会实际检查。
-
你的意思是问题可能在于我如何获得令牌?我最重要的疑问是政策,因为 AWS 管理控制台给了我这个信息
IAM does not recognize this service. The service might include a typo or might be a previewed or custom service. -
在策略中,您的 ARN 的资源部分(在帐号之后和后面的
:)需要包含文字字符串dbuser:+ db 标识符(以db-开头) +/+ 用户名。 IAM 控制台不理解这些策略,因此出现警告是正常的。 -
另外,不,我并不是要暗示您获取令牌的方式存在问题,而是要检查以确保您了解能够获取令牌确实不要以某种方式证明您的配置。任何用户都可以获得令牌,即使是无效或虚构的凭据。无法登录,但仍会生成。
-
按照你说的改了
Resource。它再次失败,但我将等待一段时间以确保更改已传播
标签: python mysql amazon-web-services aws-lambda amazon-rds