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

本教程演示如何:
-
创建 Amazon S3 存储桶。
-
创建一个 Lambda 函数,该函数会在 Amazon S3 存储桶中返回对象的类型。
-
配置一个 Lambda 触发器,该触发器将在对象上传到存储桶时调用函数。
-
先后使用虚拟事件和触发器测试函数。
完成这些步骤后,您将了解如何配置 Lambda 函数,使其在向 Amazon S3 存储桶添加或删除对象时运行。您仅可以使用 AWS Management Console 完成此教程。
创建 Amazon S3 存储桶

创建 Amazon S3 存储桶
-
打开 Amazon S3 控制台
并选择通用存储桶页面。 -
选择最接近您地理位置的 AWS 区域。您可以使用屏幕顶部的下拉列表更改区域。在本教程的后面部分,您必须在同个区域中创建 Lambda 函数。
-
选择 Create bucket(创建存储桶)。
-
在 General configuration(常规配置)下,执行以下操作:
-
对于存储桶类型,确保选中通用型。
-
对于存储桶名称,输入符合 Amazon S3 存储桶命名规则的全局唯一名称。存储桶名称只能由小写字母、数字、句点(.)和连字符(-)组成。
-
-
将所有其他选项设置为默认值并选择创建存储桶。
将测试对象上传到存储桶

要上传测试对象
-
打开 Amazon S3 控制台的存储桶
页面,选择您在上一步中创建的存储桶。 -
选择上传。
-
选择添加文件,然后选择要上传的对象。您可以选择任何文件(例如
HappyFace.jpg
)。 -
选择打开,然后选择上传。
在本教程的后面部分,您要使用此对象测试 Lambda 函数。
创建权限策略

创建权限策略,允许 Lambda 从 Amazon S3 存储桶获取对象并写入 Amazon CloudWatch Logs。
创建策略
-
打开 IAM 控制台的 Policies(策略)页面
。 -
请选择创建策略。
-
选择 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
。 -
选择 创建策略。
创建执行角色

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

使用 Python 3.12 运行时系统在控制台中创建 Lambda 函数。
创建 Lambda 函数
-
打开 Lamba 控制台的 Functions
(函数)页面。 -
确保您在创建 Amazon S3 存储桶所在的同一 AWS 区域 内操作。您可以使用屏幕顶部的下拉列表更改区域。
-
选择 Create function (创建函数)。
-
选择从头开始编写。
-
在基本信息中,执行以下操作:
-
对于函数名称,输入
s3-trigger-tutorial
。 -
对于运行时系统,选择 Python 3.12。
-
对于架构,选择 x86_64。
-
-
在更改默认执行角色选项卡中,执行以下操作:
-
展开选项卡,然后选择使用现有角色。
-
选择您之前创建的
lambda-s3-trigger-role
。
-
-
选择 Create function (创建函数)。
部署函数代码

本教程使用 Python 3.12 运行时系统,但我们还提供了适用于其他运行时系统的示例代码文件。您可以选择以下框中的选项卡,查看适用于您感兴趣的运行时系统的代码。
Lambda 函数检索已上传对象的键名称和来自该对象从 Amazon S3 收到的 event
参数的存储桶名称。然后,该函数使用 适用于 Python (Boto3) 的 AWS SDK 中的 get_object
要部署函数代码
-
在下框中选择 Python 选项卡并复制代码。
- 适用于 .NET 的 SDK
-
注意
查看 GitHub,了解更多信息。在无服务器示例
存储库中查找完整示例,并了解如何进行设置和运行。 使用 .NET 将 S3 事件与 Lambda 结合使用。
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 using System.Threading.Tasks; using Amazon.Lambda.Core; using Amazon.S3; using System; using Amazon.Lambda.S3Events; using System.Web; // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace S3Integration { public class Function { private static AmazonS3Client _s3Client; public Function() : this(null) { } internal Function(AmazonS3Client s3Client) { _s3Client = s3Client ?? new AmazonS3Client(); } public async Task<string> Handler(S3Event evt, ILambdaContext context) { try { if (evt.Records.Count <= 0) { context.Logger.LogLine("Empty S3 Event received"); return string.Empty; } var bucket = evt.Records[0].S3.Bucket.Name; var key = HttpUtility.UrlDecode(evt.Records[0].S3.Object.Key); context.Logger.LogLine($"Request is for {bucket} and {key}"); var objectResult = await _s3Client.GetObjectAsync(bucket, key); context.Logger.LogLine($"Returning {objectResult.Key}"); return objectResult.Key; } catch (Exception e) { context.Logger.LogLine($"Error processing request - {e.Message}"); return string.Empty; } } } }
-
在 Lambda 控制台的代码源窗格中,将代码粘贴到代码编辑器中,替换 Lambda 创建的代码。
-
在部署部分,选择部署以更新函数的代码:
创建 Amazon S3 触发器

创建 Amazon S3 触发器
-
在函数概述窗格中,选择添加触发器。
-
选择 S3。
-
在存储桶下,选择您在本教程前面步骤中创建的存储桶。
-
在事件类型下,确保已选择所有对象创建事件。
-
在递归调用下,选中复选框以确认知晓不建议使用相同的 Amazon S3 存储桶用于输入和输出。
-
选择 添加。
注意
当您使用 Lambda 控制台为 Lambda 函数创建 Amazon S3 触发器时,Amazon S3 会在您指定的存储桶上配置事件通知。在配置此事件通知之前,Amazon S3 会执行一系列检查以确认事件目标是否存在并具有所需的 IAM 策略。Amazon S3 还会对为该存储桶配置的任何其他事件通知执行这些测试。
由于这项检查,如果存储桶之前为已不再存在的资源或没有所需权限策略的资源配置了事件目标,则 Amazon S3 将无法创建新的事件通知。您将看到以下错误消息,表明无法创建触发器:
An error occurred when creating the trigger: Unable to validate the following destination configurations.
如果您之前使用同一存储桶为另一个 Lambda 函数配置了触发器,并且此后又删除了该函数或修改了其权限策略,则会看到此错误。
使用虚拟事件测试 Lambda 函数

要使用虚拟事件测试 Lambda 函数
-
在函数的 Lambda 控制台页面中,选择测试选项卡。
-
对于事件名称,输入
MyTestEvent
。 -
在事件 JSON 中,粘贴以下测试事件。请务必替换以下值:
-
使用
us-east-1
替换要在其中创建 Amazon S3 存储桶的区域。 -
将
amzn-s3-demo-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": "amzn-s3-demo-bucket
", "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::amzn-s3-demo-bucket
" }, "object": { "key": "test%2Fkey
", "size": 1024, "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901" } } } ] } -
-
选择保存。
-
选择测试。
-
如果函数成功运行,您将在执行结果选项卡中看到如下输出。
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: 'amzn-s3-demo-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 控制台的存储桶
页面,选择之前创建的存储桶。 -
选择上传。
-
选择添加文件,然后使用文件选择器选择要上传的对象。此对象可以是您选择的任何文件。
-
选择打开,然后选择上传。
使用 CloudWatch Logs 验证函数调用情况
-
打开 CloudWatch 控制台
。 -
确保您在创建 Lambda 函数所在相同的 AWS 区域 操作。您可以使用屏幕顶部的下拉列表更改区域。
-
选择日志,然后选择日志组。
-
选择函数 (
/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
清除资源
除非您想要保留为本教程创建的资源,否则可立即将其删除。通过删除您不再使用的 AWS 资源,可防止您的 AWS 账户 产生不必要的费用。
删除 Lambda 函数
-
打开 Lamba 控制台的 Functions(函数)页面
。 -
选择您创建的函数。
-
依次选择操作和删除。
-
在文本输入字段中键入
confirm
,然后选择删除。
删除执行角色
-
打开 IAM 控制台的角色页面
。 -
选择您创建的执行角色。
-
选择删除。
-
在文本输入字段中输入角色名称,然后选择 Delete(删除)。
删除 S3 存储桶
-
打开 Amazon S3 控制台
。 -
选择您创建的存储桶。
-
选择删除。
-
在文本输入字段中输入存储桶的名称。
-
选择删除存储桶。
后续步骤
在 教程:使用 Amazon S3 触发器创建缩略图 中,Amazon S3 触发器会调用一个函数,该函数会为上传到存储桶的每个图像文件创建缩略图。本教程需要适度的AWS和 Lambda 领域知识水平。其展示了如何使用 AWS Command Line Interface(AWS CLI)来创建资源,以及如何为函数及其依赖项创建 .zip 文件存档部署包。