适用于 AWS Lambda Python RDS Postgres IAM 身份验证的 Conn Configurat



最近,它创造了使用 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做到这一点(。

这些步骤中的每一个都可以在自己的教程中描述,但了解它们应该足以帮助您入门。

祝你好运!

相关内容

最新更新