AWS Lambda
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

教程:配置 Lambda 函数以访问 Amazon VPC 中的 Amazon RDS

在本教程中,您将执行以下操作:

  • 在您的默认 Amazon VPC 中启动 Amazon RDS MySQL 数据库引擎实例。在 MySQL 实例中,您将创建一个数据库 (ExampleDB),其中包含一个示例表 (Employee)。有关 Amazon RDS 的更多信息,请参阅 Amazon RDS

  • 创建一个 Lambda 函数来访问 ExampleDB 数据库,创建一个表 (Employee),添加几个记录,然后检索表中的记录。

  • 调用 Lambda 函数并验证查询结果。这样您可以验证您的 Lambda 函数是否可以访问 VPC 中的 RDS MySQL 实例。

先决条件

This tutorial assumes that you have some knowledge of basic Lambda operations and the Lambda console. If you haven't already, follow the instructions in 开始使用 AWS Lambda to create your first Lambda function.

To follow the procedures in this guide, you will need a command line terminal or shell to run commands. Commands are shown in listings preceded by a prompt symbol ($) and the name of the current directory, when appropriate:

~/lambda-project$ this is a command this is output

For long commands, an escape character (\) is used to split a command over multiple lines.

On Linux and macOS, use your preferred shell and package manager. On Windows 10, you can install the Windows Subsystem for Linux to get a Windows-integrated version of Ubuntu and Bash.

创建执行角色

创建执行角色,向您的函数授予访问 AWS 资源的权限。

创建执行角色

  1. 打开 IAM 控制台中的“角色”页面

  2. 选择 Create role (创建角色)

  3. 创建具有以下属性的角色。

    • Trusted entity (可信任的实体) – Lambda.

    • 权限AWSLambdaVPCAccessExecutionRole

    • 角色名称 (角色名称)lambda-vpc-role

AWSLambdaVPCAccessExecutionRole 具有函数管理与 VPC 的网络连接所需的权限。

创建 Amazon RDS 数据库实例

在本教程中,示例 Lambda 函数创建一个表 (Employee),插入一些记录,然后检索这些记录。Lambda 函数创建的表具有以下架构:

Employee(EmpID, Name)

其中 EmpID 是主键。现在,您需要向该表添加一些记录。

首先,您在您的默认 VPC 中启动 ExampleDB 数据库的 RDS MySQL 实例。如果您的默认 VPC 中已经在运行 RDS MySQL 实例,请跳过此步骤。

您可以使用以下方法之一启动 RDS MySQL 实例:

  • 按照 Amazon RDS 用户指南创建 MySQL 数据库实例并连接到 MySQL 数据库实例上的数据库中的说明操作。

  • 使用以下 AWS CLI 命令:

    $ aws rds create-db-instance --db-name ExampleDB --engine MySQL \ --db-instance-identifier MySQLForLambdaTest --backup-retention-period 3 \ --db-instance-class db.t2.micro --allocated-storage 5 --no-publicly-accessible \ --master-username username --master-user-password password

记下数据库名称、用户名称和密码。您还需要数据库实例的主机地址(终端节点),您可以从 RDS 控制台中获取该地址。您可能需要等待,直到实例状态变为可用并且终端节点值显示在控制台中。

创建部署程序包

以下 Python 代码示例针对您在 VPC 中创建的 MySQL RDS 实例中的 Employee 表运行 SELECT 查询。该代码在 ExampleDB 数据库中创建表,添加示例记录,并检索这些记录。

例 app.py

import sys import logging import rds_config import pymysql #rds settings rds_host = "rds-instance-endpoint" name = rds_config.db_username password = rds_config.db_password db_name = rds_config.db_name logger = logging.getLogger() logger.setLevel(logging.INFO) try: conn = pymysql.connect(rds_host, user=name, passwd=password, db=db_name, connect_timeout=5) except: logger.error("ERROR: Unexpected error: Could not connect to MySQL instance.") sys.exit() logger.info("SUCCESS: Connection to RDS MySQL instance succeeded") def handler(event, context): """ This function fetches content from MySQL RDS instance """ item_count = 0 with conn.cursor() as cur: cur.execute("create table Employee3 ( EmpID int NOT NULL, Name varchar(255) NOT NULL, PRIMARY KEY (EmpID))") cur.execute('insert into Employee3 (EmpID, Name) values(1, "Joe")') cur.execute('insert into Employee3 (EmpID, Name) values(2, "Bob")') cur.execute('insert into Employee3 (EmpID, Name) values(3, "Mary")') conn.commit() cur.execute("select * from Employee3") for row in cur: item_count += 1 logger.info(row) #print(row) conn.commit() return "Added %d items from RDS MySQL table" %(item_count)

在处理程序之外执行 pymysql.connect() 允许您的函数重新使用数据库连接,以获得更好的性能。

第二个文件包含函数的连接信息。

例 rds_config.py

#config file containing credentials for RDS MySQL instance db_username = "username" db_password = "password" db_name = "ExampleDB"

附属物

  • pymysql – Lambda 函数代码使用此库来访问您的 MySQL 实例(请参阅 PyMySQL)。

Install dependencies with Pip and create a deployment package. For instructions, see Python 中的 AWS Lambda 部署程序包.

创建 Lambda 函数

使用 create-function 命令创建 Lambda 函数。

$ aws lambda create-function --function-name CreateTableAddRecordsAndRead --runtime python3.7 \ --zip-file fileb://app.zip --handler app.handler \ --role execution-role-arn \ --vpc-config SubnetIds=comma-separated-subnet-ids,SecurityGroupIds=default-vpc-security-group-id

测试 Lambda 函数。

在此步骤中,您将使用 invoke 命令手动调用 Lambda 函数。当 Lambda 函数执行时,它会对 RDS MySQL 实例中的 Employee 表运行 SELECT 查询,然后输出结果,这些结果还会显示在 CloudWatch Logs 中。

  1. 使用 invoke 命令调用 Lambda 函数。

    $ aws lambda invoke --function-name CreateTableAddRecordsAndRead output.txt
  2. 按以下过程验证 Lambda 函数是否已成功执行:

    • 查看 output.txt 文件。

    • 在 AWS Lambda 控制台中查看结果。

    • 在 CloudWatch Logs 中验证结果。

您现已创建 Lambda 函数来访问您的 VPC 中的数据库,可以调用该函数来响应事件。有关配置事件源和示例的信息,请参阅将 AWS Lambda 与其他服务结合使用