AWS Lambda Python RDS Postgres IAM 身份验证的连接配置

Conn Configuration for AWS Lambda Python RDS Postgres IAM Authentication

最近创造了使用 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 主机名、端口、用户名和临时文件,为你使用的任何 python 包创建数据库连接字符串(我建议一些纯粹的 Python 实现,例如 pg8000)通过上述函数获得的密码(<user>:<password>@<hostname>:<port>/<db_name>).

连接到 RDS 可能有点棘手。如果您不知道如何正确设置 VPC,我建议您 运行 您在 VPC 之外的 Lambda 并通过 public IP 连接到 RDS。

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

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

祝你好运!