gpt4 book ai didi

amazon-web-services - AWS Lambda Python RDS Postgres IAM 身份验证的 Conn 配置

转载 作者:行者123 更新时间:2023-12-04 08:15:34 25 4
gpt4 key购买 nike

最近创建了使用 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 auth 连接起来。

请帮忙。

最佳答案

首先,您需要创建一个 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 并通过公共(public) IP 连接到 RDS。

此外,您可能需要强制实现 SSL 连接,并可能在您的 Lambda 部署包中包含 RDS CA 文件。执行此操作的确切方法取决于您使用什么连接(我只能描述如何使用 pymysql 和 sqlalchemy 执行此操作)。

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

祝你好运!

关于amazon-web-services - AWS Lambda Python RDS Postgres IAM 身份验证的 Conn 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52648986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com