使用令牌连接MySQL



我一直在尝试使用令牌使用sqlalchemy库连接到RDS实例。根据文档,应该可以通过cparams['token']变量,但是这样做,我得到了一个意外参数的错误。

深入到文档中,有这样的代码,其中可以使用关键字参数attrs_before建立连接,但在这种情况下,这样的参数也不存在。

有没有人对如何使用令牌连接到DB有任何想法?

我试图通过这样的代码做,但没有效果:

import boto3
import struct
from sqlalchemy import create_engine, event
from sqlalchemy.engine.url import URL
from sqlalchemy.engine.url import URL
from sqlalchemy.orm import sessionmaker
SQL_COPT_SS_ACCESS_TOKEN = 1256
session = boto3.session.Session(profile_name='xxx')
rds = session.client('rds')
def get_authentication_token():
return rds.generate_db_auth_token(DBHostname='xxxx', Port=3306, DBUsername='xxx')
engine_url = URL.create(drivername='mysql+pymysql', host='xxxx')
engine = create_engine(engine_url)
#@event.listens_for(engine, 'do_connect')
#def provide_token(dialect, conn_rec, cargs, cparams):
#    token_struct = struct.pack(f'<I{len(token)}s', len(token), token)
#    cparams['attrs_before'] = {SQL_COPT_SS_ACCESS_TOKEN: token_struct}
@event.listens_for(engine, "do_connect")
def provide_token(dialect, conn_rec, cargs, cparams):
cparams['token'] = get_authentication_token()
Session = sessionmaker(bind=engine)
with Session() as session:
result = session.execute('select now()').first()

更准确地说,我得到了错误:TypeError: __init__() got an unexpected keyword argument 'token'

我也有同样的问题,为我解决的是用password代替token:

@event.listens_for(engine, "do_connect")
def provide_token(dialect, conn_rec, cargs, cparams):
cparams['password'] = get_authentication_token()
另一个注意事项是,您还必须在连接中传递SSL证书,我只是添加了另一个参数:
@event.listens_for(engine, "do_connect")
def provide_token(dialect, conn_rec, cargs, cparams):
cparams['password'] = get_authentication_token()
caparam['ssl'] = {"ca": "rds-combined-ca-bundle.pem"}

请记住,您可能必须将完整路径传递给rds-combined-ca-bundle.pem文件。如果你不传递SSL文件和连接参数,即使其他一切都设置正确,你仍然会得到一个Access Denied

SSL文件可从https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

下载