Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用IAM DB身份验证和Python在MySQL RDS中进行身份验证_Python_Mysql_Amazon Web Services_Aws Lambda_Amazon Rds - Fatal编程技术网

如何使用IAM DB身份验证和Python在MySQL RDS中进行身份验证

如何使用IAM DB身份验证和Python在MySQL RDS中进行身份验证,python,mysql,amazon-web-services,aws-lambda,amazon-rds,Python,Mysql,Amazon Web Services,Aws Lambda,Amazon Rds,我有一个运行MySQL 5.6.39的AWS RDS DB,启用了IAM DB身份验证 首先,我取得了成功,这是我下一步的起点 我想使用IAM凭据登录,因此,在以下内容和教程中,我做到了: 创建RDS MySQL实例时,我选择了启用IAM数据库身份验证 创建了名为lambda的用户: CREATE USER 'lambda' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS'; GRANT ALL PRIVILEGES ON test_db.* TO

我有一个运行MySQL 5.6.39的AWS RDS DB,启用了IAM DB身份验证

首先,我取得了成功,这是我下一步的起点

我想使用IAM凭据登录,因此,在以下内容和教程中,我做到了:

  • 创建RDS MySQL实例时,我选择了
    启用IAM数据库身份验证

  • 创建了名为
    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"
          ]
        }
      ]
    }
    
    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):
      ...
    
    {
    “版本”:“2012-10-17”,
    “声明”:[
    {
    “效果”:“允许”,
    “行动”:[
    “rds数据库:连接”
    ],
    “资源”:[
    “/lambda”
    ]
    }
    ]
    }
    
  • 创建了lambda函数:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "rds-db:connect"
          ],
          "Resource": [
            "<DB-ARN>/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):
      ...
    
    导入系统 进口boto3 导入日志记录 导入pymysql #rds设置 rds_host=“” username=“lambda” db\u name=“test\u db” logger=logging.getLogger() logger.setLevel(logging.INFO) 客户机=boto3.客户机('rds',地区名称='eu-west-2') 令牌=客户端。生成\u db\u auth\u令牌(rds\u主机,3306,名称) ssl={'ca':'rds组合ca bundle.pem'} logger.info(“令牌:”+令牌) conn=pymysql.connect(rds_主机,用户=用户名,密码=令牌,db=db_名称,连接超时=5,ssl=ssl) logger.info(“成功:连接到RDS mysql实例成功”) def处理程序(事件、上下文): ...
  • 我得到了以下错误:

    error: (1045, "Access denied for user 'lambda'@'<LAMBDA_IP>' (using password: YES)")
    
    错误:(1045,“用户'lambda'@'的访问被拒绝(使用密码:YES)”)
    
  • 为了找出这是否是python错误,我从附加了策略的EC2实例中使用了AWS CLI

  • 获取令牌:

    aws rds generate-db-auth-token --hostname <RDS-ENDPOINT> --port 3306 --username lambda
    
    aws rds生成db身份验证令牌--主机名--端口3306--用户名lambda
    
  • 使用我在上一步中获得的令牌连接到DB:

    mysql -h <RDS-ENDPOINT> -u lambda --enable-cleartext-plugin --password='<TOKEN>'
    
    mysql-h-u lambda——启用明文插件——密码=“”
    
  • 我也犯了同样的错误:

    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)
    
    mysql:[警告]在命令行界面上使用密码可能不安全。
    错误1045(28000):拒绝用户“lambda@”的访问(使用密码:是)
    

  • 政策不对

    资源
    不是DB ARN,而是
    “ARN:aws:rds DB:”
    
  • AWS\u帐户\u ID-从中获取
  • AWS\u DB\u RESOURCE\u ID-在DB页面的
    Details\Configuration\RESOURCE ID
    中找到它,它以
    DB-
    开头
  • DB_USERNAME-是
    lambda
    ,因为它是在步骤2中创建的

  • 顺便说一句,正如本文所指出的,令牌的生成是本地的,因此获取它不应被解释为获取正确的密码。

    请注意,生成令牌时不会发生身份验证。令牌与预签名的URL完全相同-它们是在本地生成的,不与任何API进行任何交互,并且在您尝试使用它们之前未实际检查。您的意思是,问题可能在于我如何获取令牌?我最严重的怀疑是在策略中,因为AWS管理控制台向我提供了此信息
    IAM无法识别此服务。该服务可能包括键入错误,或者可能是预览或自定义服务。
    在策略中,您的ARN的资源部分(在帐号和以下
    之后)需要包括文本字符串
    dbuser:
    +数据库标识符(以
    db-
    开头)+
    /
    +用户名。IAM控制台不理解这些策略,因此发出警告是正常的。此外,不,我不想建议您获取令牌的方式存在问题,而是检查以确保您理解,能够获取令牌并不能以任何方式证明您的身份配置。任何用户都可以获得令牌,即使具有无效或虚构的凭据。它在登录时不起作用,但仍会生成。根据您所说的更改了
    资源
    。它再次失败,但我将等待一段时间,以确保更改已传播到Dnbajanca,@Michael-sqlbot-我将获得相同的exact错误,无法找出问题所在。已经花了将近半天的时间,仍然没有到达任何地方。我的IAM策略与您提到的完全相同。在AWS CLI中的第2步中,是否要求您输入密码?如果是,您为“lambda”输入了什么密码?无论我输入了什么,都会向我询问密码我得到了错误。你为什么不在你的
    mysql
    命令中指定“-ssl ca=”呢?我几分钟前就发布了一个问题:。