最近,这使得使用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身份验证连接。
请帮助。
答案 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进行连接)。
这些步骤中的每一个都可以在单独的教程中进行描述,但是了解它们应该足以使您入门。
祝你好运!