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

时间:2018-10-04 14:15:45

标签: amazon-web-services aws-lambda amazon-rds aws-iam

最近,这使得使用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身份验证连接。

请帮助。

1 个答案:

答案 0 :(得分:2)

首先,您需要按照以下说明创建一个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主机名,端口,用户名和通过上述功能({{1获得的临时密码),为您使用的任何python包(我建议使用一些纯Python实现,例如pg8000)创建数据库连接字符串。 }}。

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

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

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

祝你好运!