我尝试使用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}$
我的回答有三个方面:
IAM角色
有一个步骤在这里没有提到:您需要分配一个IAM角色,该角色赋予您的客户端连接到RDS的权限。在
对于“客户机”,我指的是任何AWS资源运行这个问题的代码。可能是lambda函数,或者EC2实例,或者其他东西。不管它是什么,它都有一个ARN,并且必须允许操作
rds-db:connect
。在URL引用连接字符串
那么,RDS凭据可能有问题。如果密码包含URL中不允许的字符,则可能需要URL引用密码。在
passwd = urllib.parse.quote(rds_password)
passwd = urllib.quote(rds_password)
RDS临时凭据
最后,您的RDS数据库可能需要临时凭据。此代码示例演示如何获取这些信息:
整合:
^{pr2}$我将user和passwd参数从连接字符串移到
connect_args
。这样就不需要URL引用了。在另请参见:https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html
相关问题 更多 >
编程相关推荐