【发布时间】:2018-03-01 21:51:34
【问题描述】:
我正在尝试使用 SSL 连接通过 SQLAlchemy 连接到 Amazon Aurora,将 IAM 角色指定为数据库用户帐户,并将身份验证令牌指定为密码,如 [AWS 文档] 中所述 (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.OperationalError: (_mysql_exceptions.OperationalError) (1045, "Access denied for user...")'
我的代码如下。
import boto3
client = boto3.client('rds', region_name='us-west-2')
dialect='mysql'
user = ‘dt_analyst’
host = 'datadbcluster-1.cluster-xxxxxxxxxxxx.us-west-2.rds.amazonaws.com'
port = 3306
data = ‘datadb’
region='us-west-2'
token = client.generate_db_auth_token(host,port,user,region)
host1 = 'datadbinstance2nd. xxxxxxxxxxxx.us-west-2.rds.amazonaws.com'
conn_str = '%s://%s:%s@%s:%d/%s'%(dialect,user,token,host1,port,data)
conn_str += '?ssl_key=%s'%token
conn_str += '&ssl_cert=’/home/ubuntu/rds-combined-ca-bundle.pem'
ssl_args = {
'ssl': {
'ca_cert': '/home/ubuntu/rds-combined-ca-bundle.pem',
'sslmode': 'require',
'verify_ssl_cert': True
}
}
engine = create_engine(conn_str,connect_args=ssl_args, echo=True)
【问题讨论】:
-
您的互动对我来说看起来不错,因此我建议您联系 AWS Support。如果你能弄清楚,请分享!谢谢。
-
代码 sn-p 有一处遗漏:
create_engine来自哪里。我将其追踪到sqlalchemy.create_engine,它将connect_args作为kwarg 转发到底层PyMySQL或mysqlclient连接器库。
标签: python sqlalchemy amazon-aurora