python - 使用令牌连接到 MySQL
问题描述
我一直在尝试sqlalchemy
使用令牌使用库连接到 RDS 实例。根据文档,它应该可以通过cparams['token']
变量来实现,但是这样做我得到了一个意外参数的错误。
深入了解文档,有这段代码可以使用关键字参数建立连接attrs_before
,但在这种情况下,这样的参数也不存在。
有谁知道如何使用令牌连接到数据库?
我试图通过这样的代码来做到这一点,但没有效果:
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'
解决方案
我遇到了同样的问题,为我解决的问题是替换token
为password
:
@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下载
推荐阅读
- reactjs - 有什么办法可以避免在 React 应用程序的页面加载时加载 npm 包
- python - 错误:save() 采用 1 个位置参数,但给出了 2 个
- c# - 始终从 C# 中的同一线程调用非托管 dll
- vue.js - Vue 单元测试 - 动态组件 & 子组件 & require.context
- animation - 全屏封面/模式的替代动画 - iOS 14
- ios - 我如何更改 stackView 中的元素或获取元素并更改
- vue.js - 是否有将 vuejs 集成到现有项目文件夹的简单方法?
- javascript - 输入错误,试图在 TSX 中显示一些 onclick 但未定义
- excel - 使用变量处理非连续范围的正确语法
- java - CallableStatement - InOut 参数返回空值