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 执行此操作)。
这些步骤中的每一个都可以在它自己的教程中进行描述,但是了解它们应该足以让您入门。
祝你好运!
最近创造了使用 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 执行此操作)。
这些步骤中的每一个都可以在它自己的教程中进行描述,但是了解它们应该足以让您入门。
祝你好运!