教程:使用 Amazon S3 触发器调用 Lambda 函数
在本教程中,您将使用控制台创建 Lambda 函数,然后为 Amazon Simple Storage Service(Amazon S3)存储桶配置触发器。每次向 Amazon S3 存储桶添加对象时,函数都会运行并将该对象类型输出到 Amazon CloudWatch Logs 中。

您可以使用带有 Amazon S3 触发器的 Lambda 函数来执行多种类型的文件处理任务。例如,每当图像文件上传到 Amazon S3 存储桶时,您都可以使用 Lambda 函数创建缩略图,或者将上传的文档转换为不同的格式。完成本教程后,您可以尝试使用 Amazon S3 触发器创建缩略图教程来执行图像处理任务。
要完成本教程,请执行以下步骤:
-
创建 Amazon S3 存储桶。
-
创建一个 Lambda 函数,该函数会在 Amazon S3 存储桶中返回对象的类型。
-
配置一个 Lambda 触发器,该触发器将在对象上传到存储桶时调用函数。
-
先后使用虚拟事件和触发器测试函数。
完成这些步骤后,您将了解如何配置 Lambda 函数,使其在向 Amazon S3 存储桶添加或删除对象时运行。您仅可以使用 Amazon Web Services Management Console 完成此教程。
先决条件
如果您还没有 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 S3 存储桶

首先使用 Amazon Web Services Management Console 创建 Amazon S3 存储桶。
创建 Amazon S3 存储桶
-
打开 Amazon S3 控制台
并选择存储桶页面。 -
选择 Create bucket(创建存储桶)。
-
在 General configuration(常规配置)下,执行以下操作:
-
对于存储桶名称,输入符合 Amazon S3 存储桶命名规则的全局唯一名称。存储桶名称只能由小写字母、数字、句点(.)和连字符(-)组成。
-
对于 Amazon Region(亚马逊云科技区域),选择一个区域。在本教程的后面部分,您必须在同个区域中创建 Lambda 函数。
-
-
将所有其他选项设置为默认值并选择创建存储桶。
将测试对象上传到存储桶

在本教程的后面部分,您将在 Lambda 控制台中测试 Lambda 函数。要确认函数代码能正常运行,Amazon S3 存储桶需要包含测试对象。此对象可以是您选择的任何文件(例如,HappyFace.jpg
)。
要上传测试对象
-
打开 Amazon S3 控制台的存储桶
页面,选择您在上一步中创建的存储桶。 -
请选择 Upload(上传)。
-
选择添加文件,然后使用文件选择器选择要上传的对象。
-
选择打开,然后选择上传。
在本教程后面部分测试函数代码时,您会向其传递包含上传的对象的文件名的数据,因此不妨现在就记下来。
创建权限策略

为 Lambda 函数创建执行角色之前,您首先要创建权限策略以授予函数访问所需 Amazon 资源的权限。在本教程中,该策略允许 Lambda 从 Amazon S3 存储桶获取对象并写入 Amazon CloudWatch Logs。
创建策略
-
打开 IAM 控制台的 Policies(策略)页面
。 -
请选择Create Policy(创建策略)。
-
选择 JSON 选项卡,然后将以下自定义策略粘贴到 JSON 编辑器中。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:PutLogEvents", "logs:CreateLogGroup", "logs:CreateLogStream" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::*/*" } ] }
-
请选择下一步:标签。
-
请选择下一步:审核。
-
在 Review policy (查看策略) 下,为策略 Name (名称) 输入
s3-trigger-tutorial
。 -
选择 Create policy(创建策略)。
创建执行角色

执行角色是一个 Amazon Identity and Access Management(IAM)角色,用于向 Lambda 函数授予访问 Amazon 服务和资源的权限。要使函数从 Amazon S3 存储桶获取对象,您需要附加上一步中创建的权限策略。
创建执行角色并附加自定义权限策略
-
打开 IAM 控制台的角色页面
。 -
选择 Create role(创建角色)。
-
对于可信实体,选择 Amazon 服务,对于使用案例,选择 Lambda。
-
选择 Next(下一步)。
-
在策略搜索框中,输入
s3-trigger-tutorial
。 -
在搜索结果中,选择您创建的策略(
s3-trigger-tutorial
),然后选择 Next(下一步)。 -
在 Role details(角色详细信息)下,为 Role name(角色名称)输入
lambda-s3-trigger-role
,然后选择 Create role(创建角色)。
创建 Lambda 函数

在本例中,您将使用 Node.js 16.x 运行时系统在控制台中创建 Lambda 函数。您在控制台中创建的函数包含一些基本的“Hello World”代码。在下一个步骤中,您会将其替换为函数代码,以便从 Amazon S3 存储桶获取对象。
创建 Lambda 函数
-
打开 Lamba 控制台的 Functions
(函数)页面。 -
确保您在创建 Amazon S3 存储桶所在的同一 Amazon Web Services 区域 内操作。您可以使用屏幕顶部的下拉列表更改区域。
-
选择 Create function(创建函数)。
-
选择从头开始编写。
-
在 Basic information(基本信息)中,执行以下操作:
-
对于函数名称,输入
s3-trigger-tutorial
。 -
对于运行时,选择 Node.js 16.x。
-
对于 Architecture(架构),选择 x86_64。
-
-
在更改默认执行角色选项卡中,执行以下操作:
-
展开选项卡,然后选择使用现有角色。
-
选择您之前创建的
lambda-s3-trigger-role
。
-
-
选择 Create function(创建函数)。
部署函数代码

Lambda 函数将检索已上传对象的密钥名称和来自该对象从 Amazon S3 收到的 event
参数的存储桶名称。然后,该函数使用 Amazon SDK for JavaScript 中的 HeadObject
API 调用来获取已上传对象的类型。
本教程使用 Node.js 16.x 运行时系统,但我们还提供了适用于其他运行时系统的示例代码文件。您可以选择以下框中的选项卡,查看适用于您感兴趣的运行时系统的代码。您要部署的 JavaScript 代码是标记为 JavaScript 的选项卡中显示的第一个示例。
要部署函数代码
-
打开 Lamba 控制台的 Functions
(函数)页面。 -
选择您在上一步中创建的函数 (
s3-trigger-tutorial
)。 -
选择节点选项卡。
-
将提供的 JavaScript 代码复制并粘贴到代码源窗格中的 index.js 选项卡中。
-
选择 Deploy(部署)。
创建 Amazon S3 触发器

现在,您已部署函数代码,可以创建将调用函数的 Amazon S3 触发器了。
创建 Amazon S3 触发器
-
在函数控制台页面的函数概述窗格中,选择添加触发器。
-
选择 S3。
-
在存储桶下,选择您在本教程前面步骤中创建的存储桶。
-
在事件类型下,选择所有对象创建事件。您也可以配置触发器,以便在删除对象时调用 Lambda,但我们不会在本教程中使用该选项。
-
在递归调用下,选中复选框以确认知晓不建议使用相同的 Amazon S3 存储桶用于输入和输出。您可以阅读 Serverless Land 中的 Recursive patterns that cause run-away Lambda functions
,进一步了解 Lambda 中的递归调用模式。 -
选择 Add(添加)。
使用虚拟事件测试 Lambda 函数

现在您已经创建并配置了 Lambda 函数,可以对其进行测试了。您首先通过向其发送 Amazon S3 虚拟事件来测试函数,以确认函数可以正常运行。
要使用虚拟事件测试 Lambda 函数
-
在函数的 Lambda 控制台页面中,选择代码选项卡。
-
在代码源窗格中,选择测试。
-
在配置测试事件框中,执行以下操作:
-
对于事件名称,输入
MyTestEvent
。 -
对于模板,选择 S3 Put。
-
在 Event JSON(事件 JSON)中,替换以下值:
-
使用
us-east-1
替换要在其中创建 Amazon S3 存储桶的区域。 -
将
example-bucket
的两个实例都替换为 Amazon S3 存储桶的名称。 -
将
test%2FKey
替换为您之前上传到存储桶的测试对象的名称(例如,HappyFace.jpg
)。
{ "Records": [ { "eventVersion": "2.0", "eventSource": "aws:s3", "awsRegion": "
us-east-1
", "eventTime": "1970-01-01T00:00:00.000Z", "eventName": "ObjectCreated:Put", "userIdentity": { "principalId": "EXAMPLE" }, "requestParameters": { "sourceIPAddress": "127.0.0.1" }, "responseElements": { "x-amz-request-id": "EXAMPLE123456789", "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH" }, "s3": { "s3SchemaVersion": "1.0", "configurationId": "testConfigRule", "bucket": { "name": "example-bucket
", "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::example-bucket
" }, "object": { "key": "test%2Fkey
", "size": 1024, "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901" } } } ] } -
-
选择 Save(保存)。
-
-
在代码源窗格中,选择测试。
-
如果函数成功运行,您将在执行结果选项卡中看到如下输出。
Response "image/jpeg" Function Logs START RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 Version: $LATEST 2021-02-18T21:40:59.280Z 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 INFO INPUT BUCKET AND KEY: { Bucket: 'my-s3-bucket', Key: 'HappyFace.jpg' } 2021-02-18T21:41:00.215Z 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 INFO CONTENT TYPE: image/jpeg END RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 REPORT RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 Duration: 976.25 ms Billed Duration: 977 ms Memory Size: 128 MB Max Memory Used: 90 MB Init Duration: 430.47 ms Request ID 12b3cae7-5f4e-415e-93e6-416b8f8b66e6
使用 Amazon S3 触发器测试 Lambda 函数

要使用配置的触发器测试函数,您需要使用控制台将对象上传到 Amazon S3 存储桶。要验证 Lambda 函数已正确调用,您可以使用 CloudWatch Logs 查看函数的输出。
要将对象上传到 Amazon S3 存储桶
-
打开 Amazon S3 控制台的存储桶
页面,选择您之前创建的存储桶。 -
请选择 Upload(上传)。
-
选择添加文件,然后使用文件选择器选择要上传的对象。此对象可以是您选择的任何文件。
-
选择打开,然后选择上传。
要使用 CloudWatch Logs 验证正确执行
-
打开 CloudWatch 控制台
。 -
确保您在创建 Lambda 函数所在相同的 Amazon Web Services 区域 操作。您可以使用屏幕顶部的下拉列表更改区域。
-
选择日志,然后选择日志组。
-
选择函数 (
/aws/lambda/s3-trigger-tutorial
) 的日志组。 -
在日志流下,选择最新的日志流。
-
如果函数已正确调用以响应 Amazon S3 触发器,您将看到如下输出。您看到的
CONTENT TYPE
取决于上传到存储桶的文件类型。2022-05-09T23:17:28.702Z 0cae7f5a-b0af-4c73-8563-a3430333cc10 INFO CONTENT TYPE:
image/jpeg
清除资源
除非您想要保留为本教程创建的资源,否则可立即将其删除。通过删除您不再使用的 Amazon 资源,可防止您的 Amazon 账户产生不必要的费用。
删除 Lambda 函数
-
打开 Lamba 控制台的 Functions(函数)页面
。 -
选择您创建的函数。
-
依次选择操作和删除。
-
在文本输入字段中键入
delete
,然后选择删除。
删除执行角色
-
打开 IAM 控制台的角色页面
。 -
选择您创建的执行角色。
-
选择删除。
-
在文本输入字段中输入角色名称,然后选择 Delete(删除)。
删除 S3 存储桶
-
打开 Amazon S3 控制台
。 -
选择您创建的存储桶。
-
选择 Delete (删除)。
-
在文本输入字段中输入存储桶的名称。
-
选择删除存储桶。
后续步骤
试用更高级的教程。在本教程中,Amazon S3 触发器调用函数来为上传到 S3 存储桶的每个图像文件创建缩略图。本教程需要适度的Amazon和 Lambda 领域知识水平。您可以使用 Amazon Command Line Interface (Amazon CLI) 创建资源,然后为函数及其依赖项创建 .zip 文件存档部署包。