- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 SSL 连接通过 SQLAlchemy 连接到 Amazon Aurora,将 IAM 角色指定为数据库用户帐户并将身份验证 token 指定为密码,如 [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)
最佳答案
我的答案有三个:
这里没有提到一个步骤:您需要分配一个 IAM 角色,让您的客户端有权连接到 RDS。
对于“客户端”,我的意思是任何 AWS 资源正在运行这个问题的代码。可以是 lambda 函数、EC2 实例或其他东西。不管它是什么,它都有一个 ARN,并且必须允许它执行 rds-db:connect
操作。
那么 RDS 凭据可能存在问题。如果密码包含 URL 中不允许的字符,您可能必须在 URL 中引用密码。
passwd = urllib.parse.quote(rds_password)
passwd = urllib.quote(rds_password)
最后,可能是您的 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}
def create_sqlalchemy_engine(self):
conn_str = f"{protocol}://{rds_host}:{rds_port}/{database}"
kw = dict()
kw.update(rds_credentials)
# kw.update({'ssl': {'ca': /path/to/pem-file.pem}}) # MySQL
# kw.update({'sslmode': 'verify-full', 'sslrootcert /path/to/pem-file.pem}) # PostgreSQL
return create_engine(conn_str, connect_args=kw)
我将用户和密码参数从连接字符串移至 connect_args
。这消除了对 URL 引用的需要。
另请参阅:https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html
关于python - 使用 SQLAlchemy 连接到 Amazon Aurora,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46328762/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!