教程:使用 Lambda 函数,以便在 Amazon VPC 中访问 Amazon RDS
在本教程中,您使用 Lambda 函数将数据写入 Amazon Relational Database Service(Amazon RDS)数据库。您的 Lambda 函数在 Amazon Simple Queue Service(Amazon SQS)队列中读取记录,每当添加消息时,都将新的项目写入您数据库的表中。在此示例中,您使用 Amazon Web Services Management Console 手动向队列添加消息。下图显示了您用于完成教程的 Amazon 资源。

借助 Amazon RDS,您可以使用 Microsoft SQL Server、MySQL 和 PostgreSQL 等常见数据库产品在云中运行托管关系数据库。通过使用 Lambda 访问您的数据库,您可以读取和写入数据以响应事件,例如在您的网站上注册的新客户。您的函数和数据库实例还可以自动扩展以满足高需求时期。
要完成本教程,请执行以下任务:
-
在您 Amazon Web Services 账户 的默认 Amazon Virtual Private Cloud(Amazon VPC)中启动 Amazon RDS MySQL 数据库实例。
-
创建并测试 Lambda 函数,该函数在您的数据库中创建新表并将数据写入其中。
-
创建 Amazon SQS 队列并将其配置为在添加新消息时调用您的 Lambda 函数。
-
使用 Amazon Web Services Management Console 向队列添加消息并使用 CloudWatch 日志监控结果,来测试完整设置。
通过完成这些步骤,您将学习:
如何使用 Lambda 打开到 Amazon RDS 数据库实例的连接
如何使用 Lambda 对 Amazon RDS 数据库执行创建和读取操作
如何使用 Amazon SQS 调用 Lambda 函数
您可以使用 Amazon Web Services Management Console 或 Amazon Command Line Interface (Amazon CLI) 完成此教程。
先决条件
如果您还没有 Amazon Web Services 账户,请完成以下步骤来创建一个。
注册 Amazon Web Services 账户
按照屏幕上的说明进行操作。
在注册时,您将接到一通电话,要求您使用电话键盘输入一个验证码。
当您注册 Amazon Web Services 账户 时,系统将会创建一个 Amazon Web Services 账户根用户。根用户有权访问该账户中的所有 Amazon Web Services和资源。作为安全最佳实践,请 为管理用户分配管理访问权限,并且只使用根用户执行 需要根用户访问权限的任务。
Amazon注册过程完成后,会向您发送一封确认电子邮件。在任何时候,您都可以通过转至 https://aws.amazon.com/
注册 Amazon Web Services 账户 后,启用多重身份验证(MFA)保护您的管理用户。有关说明,请参阅 IAM 用户指南中的为 为 IAM 用户(控制台)启用虚拟 MFA 设备。
要授予其他用户访问您的 Amazon Web Services 账户 资源的权限,请创建 IAM 用户。为了保护您的 IAM 用户,请启用 MFA 并仅向 IAM 用户授予执行任务所需的权限。
有关创建和保护 IAM 用户的更多信息,请参阅 IAM 用户指南中的以下主题:
创建 Amazon RDS 数据库实例

Amazon RDS 数据库实例是在 Amazon Web Services 云 中运行的独立数据库环境。实例可以包含一个或多个由用户创建的数据库。除非您另行指定,否则 Amazon RDS 会在您 Amazon Web Services 账户 包含的默认 Amazon VPC 中创建新的数据库实例。有关 Amazon VPC 的更多信息,请参阅 Amazon Virtual Private Cloud 用户指南。
在本教程中,您在您 Amazon Web Services 账户 的默认 VPC 中创建一个新实例,并在该实例中创建一个名为 ExampleDB
的数据库。您可以使用 Amazon Web Services Management Console 或 Amazon CLI 创建 Amazon RDS 实例和数据库。
要让 Lambda 连接到您的数据库,您需要知道其主机地址(端点)和 VPC 配置。
查找数据库主机地址和 VPC 配置
-
打开 Amazon RDS 控制台的 Databases(数据库)页面
。 -
选择您刚刚创建的数据库实例 (
mysqlforlambda
),然后选择连接和安全窗格。 -
记录端点、VPC 子网和 VPC 安全组的值。
注意
在您的数据库实例完成初始化并且控制台中显示的状态从正在创建更改为正在备份之后,主机端点才可用。这个过程可能需要几分钟。
创建函数执行角色

在创建 Lambda 函数之前,您需要创建一个执行角色来为您的函数提供必要的权限。在本教程中,Lambda 需要权限来管理与包含您的数据库实例的 Amazon VPC 的网络连接,以及轮询来自 Amazon SQS 队列的消息。
为了向您的 Lambda 函数提供其所需的权限,本教程使用 IAM 托管策略。这些策略可授予许多常见使用案例的权限,可在您的 Amazon Web Services 账户 中使用。有关使用托管策略的更多信息,请参阅 策略最佳实践。
创建 Lambda 执行角色
-
打开 IAM 控制台的角色
页面,然后选择创建角色。 -
对于受信任的实体类型,选择 Amazon 服务,对于使用案例,选择 Lambda。
-
选择 Next(下一步)。
-
通过执行以下操作添加 IAM 托管策略:
-
使用策略搜索框,搜索
AWSLambdaVPCAccessExecutionRole
。 -
在结果列表中,选中角色旁的复选框,然后选择清除筛选条件。
-
使用策略搜索框,搜索
AWSLambdaSQSQueueExecutionRole
。 -
在结果列表中,选中角色旁的复选框,然后选择下一步。
-
-
对于角色名称,输入
lambda-vpc-sqs-role
,然后选择创建角色。
在本教程的后面部分,您需要提供刚刚创建的执行角色的 Amazon 资源名称(ARN)。
查找执行角色 ARN
-
打开 IAM 控制台的角色
页面,然后选择您的角色 ( lambda-vpc-sqs-role
)。 -
复制摘要部分中显示的角色 ARN。
创建 Lambda 部署包

以下示例 Python 代码使用 PyMySQLCustomer
的新表。该表使用以下架构,其中 CustID
是主键:
Customer(CustID, Name)
该函数还使用 PyMySQL 向该表添加记录。该函数使用您将添加到 Amazon SQS 队列的消息中指定的客户 ID 和名称来添加记录。
请注意,该代码在处理程序函数之外创建了与数据库的连接。在初始化代码中创建连接,使后续调用能够重用该连接并提高性能。在生产应用程序中,您还可以使用预置并发来初始化所请求数量的数据库连接。调用函数后,这些连接即可用。
import sys import logging import pymysql import json # rds settings rds_host =
"mysqlforlambda.cdipnbm2csku.cn-north-1.rds.amazonaws.com.cn"
user_name = "admin" password ="password"
db_name = "ExampleDB" logger = logging.getLogger() logger.setLevel(logging.INFO) # create the database connection outside of the handler to allow connections to be # re-used by subsequent function invocations. try: conn = pymysql.connect(host=rds_host, user=user_name, passwd=password, db=db_name, connect_timeout=5) except pymysql.MySQLError as e: logger.error("ERROR: Unexpected error: Could not connect to MySQL instance.") logger.error(e) sys.exit() logger.info("SUCCESS: Connection to RDS MySQL instance succeeded") def lambda_handler(event, context): """ This function creates a new RDS database table and writes records to it """ message = event['Records'][0]['body'] data = json.loads(message) CustID = data['CustID'] Name = data['Name'] item_count = 0 sql_string = f"insert into Customer (CustID, Name) values({CustID}, '{Name}')" with conn.cursor() as cur: cur.execute("create table if not exists Customer ( CustID int NOT NULL, Name varchar(255) NOT NULL, PRIMARY KEY (CustID))") cur.execute(sql_string) conn.commit() cur.execute("select * from Customer") logger.info("The following items have been added to the database:") for row in cur: item_count += 1 logger.info(row) conn.commit() return "Added %d items to RDS MySQL table" %(item_count)
注意
在此示例代码中,您的数据库名称、用户名和密码被硬编码到您的函数中。在生产应用程序中,不应对这些参数进行硬编码。使用 Amazon Secrets Manager 安全存储数据库访问凭证。
要在函数代码中包含 PyMySQL 依赖关系,请创建一个 .zip 部署包。
创建 .zip 部署包
-
将代码示例保存为名为
lambda_function.py
的文件。使用您自己的 Amazon RDS 主机端点,将示例代码中的密码替换为您在创建数据库实例时选择的密码。 -
在创建
lambda_function.py
文件的同一目录中,创建一个名为package
的新目录并安装 PyMySQL 库。mkdir package
pip install --target package pymysql
-
创建一个包含您的应用程序代码和 PyMySQL 库的 zip 文件。在 Linux 或 MacOS 中,运行以下 CLI 命令。在 Windows 中,使用您首选的压缩工具来创建
lambda_function.zip
文件。cd package
zip -r ../lambda_function.zip .
cd ..
zip lambda_function.zip lambda_function.py
您也可以使用 Python 虚拟环境创建部署包。参阅使用 .zip 文件归档部署 Python Lambda 函数。
创建 Lambda 函数

现在,您可以使用刚刚创建的 .zip 程序包,使用 Amazon CLI 或 Lambda 控制台创建 Lambda 函数。
在控制台中测试 Lambda 函数。

您现在可以使用 Lambda 控制台测试您的函数。您可以创建一个测试事件,该事件模仿您在教程的最后阶段使用 Amazon SQS 调用函数时将收到的数据。您的测试事件包含一个 JSON 对象,该对象指定要添加到您的函数创建的 Customer
表中的客户 ID 和客户名称。
测试 Lambda 函数
-
打开 Lambda 控制台的函数
页面,然后选择一个函数。 -
选择节点选项卡。
-
在代码源窗格中,选择测试并输入事件名称的
myTestEvent
。 -
将以下代码复制到事件 JSON 中,然后选择保存。
{ "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "{\n \"CustID\": 1021,\n \"Name\": \"Martha Rivera\"\n}", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue", "awsRegion": "us-west-2" } ] }
-
选择 Test(测试)。
在执行结果选项卡中,您应该看到与函数日志中显示的以下内容类似的结果:
[INFO] 2023-02-14T19:31:35.149Z bdd06682-00c7-4d6f-9abb-89f4bbb4a27f The following items have been added to the database: [INFO] 2023-02-14T19:31:35.149Z bdd06682-00c7-4d6f-9abb-89f4bbb4a27f (1021, 'Martha Rivera')
创建 Amazon SQS 队列

您已成功测试了您的 Lambda 函数和 Amazon RDS 数据库实例的集成。现在,您创建了 Amazon SQS 队列,用于在本教程的最后阶段调用 Lambda 函数。
创建一个事件源映射以调用您的 Lambda 函数

事件源映射是 Lambda 中的一种资源,它从流或队列中读取项目并调用 Lambda 函数。配置事件源映射时,可以指定批处理大小,以便可以将来自您的流或队列的记录批处理成单个负载。在此示例中,您将批处理大小设置为 1,这样每次向队列发送消息时都会调用 Lambda 函数。您可以使用 Amazon CLI 或 Lambda 控制台配置事件源映射。
现在,您可以通过向 Amazon SQS 队列添加一条消息来测试您的完整设置。
测试和监控您的设置

要测试您的完整设置,请使用控制台向 Amazon SQS 队列添加消息。然后,您可以使用 CloudWatch Logs 确认您的 Lambda 函数正在按预期将记录写入数据库。
测试和监控您的设置
-
打开 Amazon SQS 控制台的队列
页面,然后选择创建队列 ( LambdaRDSQueue
)。 -
选择发送和接收消息,然后将以下 JSON 粘贴到发送消息窗格中的消息正文中。
{
"CustID": 1054,
"Name": "Richard Roe"
}
-
选择 Send message(发送消息)。
将您的消息发送到队列将导致 Lambda 通过您的事件源映射调用您的函数。要确认 Lambda 已按预期调用您的函数,请使用 CloudWatch Logs 验证该函数是否已将客户名称和 ID 写入您的数据库表:
-
打开 CloudWatch 控制台的日志组
页面,为您的函数选择日志组 ( aws/lambda/LambdaFunctionWithRDS
)。 -
在日志流窗格中,选择最新的日志流。
您的表应包含两条客户记录,每次调用您的函数都有一条记录。在日志流中,您应看到类似以下内容的消息:
[INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 The following items have been added to the database: [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 (1021, 'Martha Rivera') [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 (1054, 'Richard Roe')
清除资源
除非您想要保留为本教程创建的资源,否则可立即将其删除。通过删除您不再使用的 Amazon 资源,可防止您的 Amazon 账户产生不必要的费用。
删除 Lambda 函数
-
打开 Lamba 控制台的 Functions(函数)页面
。 -
选择您创建的函数。
-
依次选择操作和删除。
-
在文本输入字段中键入
delete
,然后选择删除。
删除执行角色
-
打开 IAM 控制台的角色页面
。 -
选择您创建的执行角色。
-
选择删除。
-
在文本输入字段中输入角色名称,然后选择 Delete(删除)。
删除 MySQL 数据库实例
-
打开 Amazon RDS 控制台的 Databases(数据库)页面
。 -
选择您创建的数据库。
-
依次选择 Actions(操作)和 Delete(删除)。
-
清除 Create final snapshot(创建最终快照)复选框。
-
在文本框中输入
delete me
。 -
选择 Delete (删除)。
删除 Amazon SQS 队列
-
登录到 Amazon Web Services Management Console 并打开 Amazon SQS 控制台,网址:https://console.aws.amazon.com/vpc/
。 -
选择创建的队列。
-
选择 Delete (删除)。
-
在文本输入字段中输入
delete
。 -
选择 Delete。