最近,它创造了使用 IAM 用户和角色访问 RDS 实例的可能性。我对如何配置 python 连接感到困惑,因为我不会将数据库身份验证数据与 psycopg2 一起使用。
现在我像这样使用:
conn = psycopg2.connect("dbname='%s' user='%s' host='%s' password='%s'" % (db_name, db_user, db_host, db_pass))
我不知道如何使用 IAM 凭证将我的 lambda 函数与 IAM 身份验证连接。
请帮忙。
首先,您需要创建一个 IAM 策略和一个数据库用户,如下所述:
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html
然后,您需要为 Lambda 函数创建 IAM 角色,并将上面创建的 IAM 策略附加到该角色。您的 Lambda 函数需要使用此角色执行,才能为数据库用户创建临时数据库密码。
最后,您可以使用如下代码片段在 Lambda 中为数据库用户(上面创建(生成临时密码:
from urllib.parse import quote_plus
import boto3
def get_password(rds_hostname, db_user, aws_region=None, url_encoded=True):
if (not aws_region):
aws_region = boto3.session.Session().region_name
if (not aws_region):
raise Exception("Error: no aws_region given and the default region is not set!")
rds_port = 5432
if (":" in rds_hostname):
split_hostname = rds_hostname.split(":")
rds_hostname = split_hostname[0]
rds_port = int(split_hostname[1])
rds_client = boto3.client("rds")
password = rds_client.generate_db_auth_token( Region=aws_region,
DBHostname=rds_hostname,
Port=rds_port,
DBUsername=db_user)
if url_encoded:
return quote_plus( password )
else:
return password
不要将密码分配给变量。每次运行时都获取新密码,因为密码的时间有效期有限,并且您的 Lambda 容器在过期之前可能不会回收...
最后,从您的 RDS 主机名、端口、用户名和通过上述函数获得的临时密码(<user>:<password>@<hostname>:<port>/<db_name>
(为您使用的任何 python 包创建数据库连接字符串(我建议使用一些纯 Python 实现,例如 pg8000(。
连接到 RDS 可能有点棘手。如果您不知道如何正确设置 VPC,我建议您在 VPC 之外运行 Lambda 并通过公有 IP 连接到 RDS。
此外,您可能需要强制执行 SSL 连接,并可能需要在 Lambda 部署程序包中包含 RDS CA 文件。如何做到这一点的确切方式取决于你用来连接的内容(我只能描述如何使用pymysql和sqlalchemy做到这一点(。
这些步骤中的每一个都可以在自己的教程中描述,但了解它们应该足以帮助您入门。
祝你好运!