使用SQLAlchemy连接到Amazon Aurora

2024-09-30 18:19:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用SSL连接SQLAlchemy连接到amazonaura,指定IAM角色作为数据库用户帐户,将身份验证令牌指定为密码,如[AWS docs]中所述 (http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html#UsingWithRDS.IAMDBAuth.Connecting

这些是我遵循的步骤。在

wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

export LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1

aws rds generate-db-auth-token --hostname 'datadbcluster-1.cluster-xxxxxxxxxxxx.us-west-2.rds.amazonaws.com' --port 3306 --username dt_analyst --region us-west-2 > /home/ubuntu/dt_analyst.pem

mysql -h datadbinstance2nd. xxxxxxxxxxxx.us-west-2.rds.amazonaws.com--ssl-ca /home/ubuntu/rds-combined-ca-bundle.pem -u dt_analyst --ssl-verify-server-cert --enable-cleartext-plugin -p'<token>'

我验证了我可以使用mysql客户机通过SSL进行连接。在

但是我想用sqlalchemy而不是mysql客户端进行连接。在

'sqlalchemy.exc.operational错误:(\u mysql_异常操作错误)(1045,“拒绝用户访问…”)

我的代码如下。在

^{pr2}$

Tags: 用户comawsssldocsmysqldtpem
1条回答
网友
1楼 · 发布于 2024-09-30 18:19:50

我的回答有三个方面:

IAM角色

有一个步骤在这里没有提到:您需要分配一个IAM角色,该角色赋予您的客户端连接到RDS的权限。在

对于“客户机”,我指的是任何AWS资源运行这个问题的代码。可能是lambda函数,或者EC2实例,或者其他东西。不管它是什么,它都有一个ARN,并且必须允许操作rds-db:connect。在

URL引用连接字符串

那么,RDS凭据可能有问题。如果密码包含URL中不允许的字符,则可能需要URL引用密码。在

  • Python 3:passwd = urllib.parse.quote(rds_password)
  • Python 2:passwd = urllib.quote(rds_password)

RDS临时凭据

最后,您的RDS数据库可能需要临时凭据。此代码示例演示如何获取这些信息:

# get RDS config, often done through environment variables
import os

rds_host = os.environ.get("RDS_HOST")  
rds_port = os.environ.get("RDS_PORT")
rds_username = os.environ.get("RDS_USER")   

# get temp credential
import boto3

temp_passwd = boto3.client('rds').generate_db_auth_token(
    DBHostname=rds_host,
    Port=rds_port,
    DBUsername=rds_username 
)

rds_credentials = {'user': rds_username, 'passwd': temp_passwd}

整合:

^{pr2}$

我将user和passwd参数从连接字符串移到connect_args。这样就不需要URL引用了。在

另请参见:https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html

相关问题 更多 >