教程:使用 Amazon S3 触发器创建缩略图
在本教程中,您将创建 Lambda 函数,然后为 Amazon Simple Storage Service (Amazon S3) 配置触发器。Amazon S3 会为上载到 S3 存储桶的每个镜像文件调用 CreateThumbnail
函数。该函数从 S3 源存储桶读取图像对象并在目标 S3 存储桶中创建要保存的缩略图。
本教程需要适度的 Amazon、Lambda、Docker 操作和 Amazon Serverless Application Model(Amazon SAM)知识水平。我们建议您先尝试 教程:使用 Amazon S3 触发器调用 Lambda 函数。
在本教程中,您将使用 Amazon Command Line Interface (Amazon CLI) 创建以下 Amazon 资源:
Lambda 资源
-
Lambda 函数。您可以选择 Node.js 或 Python 作为函数代码。
-
函数的 .zip 文件存档部署包。
-
授予 Amazon S3 调用函数的权限的访问策略。
Amazon Identity and Access Management (IAM) 资源
-
拥有关联权限策略的执行角色,用于授予函数所需的权限。
Amazon S3 资源
-
具有调用函数的通知配置的源 S3 存储桶。
-
函数在其中保存已调整大小的图像的目标 S3 存储桶。
主题
先决条件
-
为您要使用的语言安装语言支持工具和软件包管理器(Node.js 或 Python)。有关推荐的工具,请参阅 编写和部署函数。
第 1 步 创建 S3 存储桶并上传示例对象
按照以下步骤创建 S3 存储桶并上传对象。
-
打开 Amazon S3 控制台
。 -
创建两个 S3 存储桶。目标存储桶必须命名为
,其中source
-resizedsource
是源存储桶的名称。例如,名为sourcebucket
的源存储桶和名为sourcebucket-resized
的目标存储桶。注意 确保在计划用于 Lambda 函数的相同 Amazon Web Services 区域 中创建存储桶。
-
在源存储桶中,上传 .jpg 或 .png 对象,例如
HappyFace.jpg
。在测试 Lambda 函数之前,必须创建此示例对象。在步骤 6 中手动测试函数时,将示例事件数据传递给指定源存储桶名称和图像文件名称的函数。
第 2 步 创建 IAM policy
创建定义 Lambda 函数权限的 IAM policy。该函数必须具有以下权限:
从源 S3 存储桶获取对象。
将已调整大小的对象放入目标 S3 存储桶。
将日志写入 Amazon CloudWatch Logs
创建 IAM policy
-
在 IAM 控制台中打开 Policies(策略)页面
。 -
选择 Create policy(创建策略)。
-
选择 JSON 选项卡,然后粘贴以下策略。请务必将
sourcebucket
替换为之前创建的源存储桶的名称。{ "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:::
sourcebucket
/*" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::sourcebucket
-resized/*" } ] } -
请选择下一步:标签。
-
选择 Next: Review(下一步:审核)。
-
在 Review policy(查看策略)下,为 Name(名称)输入
AWSLambdaS3Policy
。 -
选择 Create policy(创建策略)。
第 3 步 创建执行角色
创建执行角色,向您的 Lambda 函数授予访问Amazon资源的权限。
创建执行角色
-
在 IAM 控制台中,打开“Roles (角色)”页面
。 -
选择 Create role(创建角色)。
-
创建具有以下属性的角色:
-
Trusted entity(可信任的实体)– Lambda。
-
Permission policy(权限策略)– AWSLambdaS3Policy
-
Role name(角色名称)–
lambda-s3-role
-
第 4 步 创建部署程序包
部署程序包是包含 Lambda 函数代码及其依赖项的 .zip 文件归档。
步骤 5:创建 Lambda 函数
函数配置包含 10 秒的超时值。根据上传的对象的大小,可能需要使用下面的 Amazon CLI 命令增大超时值:
aws lambda update-function-configuration --function-name CreateThumbnail --timeout
30
步骤 6:测试 Lambda 函数
使用示例 Amazon S3 事件数据手动调用 Lambda 函数。
测试 Lambda 函数
-
在之前创建的项目目录中,在名为
inputFile.txt
的文件中保存如下 Amazon S3 示例事件数据。请务必替换以下值:-
us-west-2
– 在其中创建 Amazon S3 存储桶和 Lambda 函数的 Amazon Web Services 区域。 -
sourcebucket
– 在步骤 1 中创建的 Amazon S3 源存储桶。 -
HappyFace.jpg
– 您上传到源存储桶的 .jpg 或 .png 图像的对象密钥。
{ "Records":[ { "eventVersion":"2.0", "eventSource":"aws:s3", "awsRegion":"
us-west-2
", "eventTime":"1970-01-01T00:00:00.000Z", "eventName":"ObjectCreated:Put", "userIdentity":{ "principalId":"AIDAJDPLRKLG7UEXAMPLE" }, "requestParameters":{ "sourceIPAddress":"127.0.0.1" }, "responseElements":{ "x-amz-request-id":"C3D13FE58DE4C810", "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" }, "s3":{ "s3SchemaVersion":"1.0", "configurationId":"testConfigRule", "bucket":{ "name":"sourcebucket
", "ownerIdentity":{ "principalId":"A3NL1KOZZKExample" }, "arn":"arn:aws:s3:::sourcebucket
" }, "object":{ "key":"HappyFace.jpg
", "size":1024, "eTag":"d41d8cd98f00b204e9800998ecf8427e", "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko" } } } ] } -
-
使用以下 invoke 命令调用函数。请注意,该命令会请求异步执行 (
--invocation-type Event
)。或者,您可以通过将RequestResponse
指定为invocation-type
参数值来同步调用函数。aws lambda invoke --function-name
CreateThumbnail
\ --cli-binary-format raw-in-base64-out \ --invocation-type Event \ --payload file://inputFile.txt outputfile.txt如果使用 cli-binary-format 版本 2,则 Amazon CLI 选项是必需的。要将其设为默认设置,请运行
aws configure set cli-binary-format raw-in-base64-out
。有关更多信息,请参阅Amazon CLI 支持的全局命令行选项。-
如果您收到错误 “解析参数 '--payload' 时出错:无法加载参数文件://inputFile.txt”,请确保您位于保存
inputFile.txt
的目录中。
-
验证目标 S3 存储桶中已创建缩略图。
第 7 步 配置 Amazon S3 以发布事件
完成配置,以使 Amazon S3 能够向 Lambda 发布对象创建事件并调用 Lambda 函数。在此步骤中,您将执行以下操作:
-
向函数访问策略添加权限以允许 Amazon S3 调用该函数。
-
向源 S3 存储桶添加通知配置。在通知配置中,您需要提供以下内容:
-
需要 Amazon S3 发布事件的事件类型。在本教程中,指定
s3:ObjectCreated:*
事件类型,以便 Amazon S3 在创建对象时发布事件。 -
要调用的函数。
-
向函数策略添加权限
-
运行下面的 add-permission 命令以向 Amazon S3 服务主体(
s3.amazonaws.com
)授予执行lambda:InvokeFunction
操作的权限。请注意,向 Amazon S3 授予权限,使其只能在满足以下条件时调用该函数:-
在特定的 S3 存储桶上检测到对象创建事件。
-
该 S3 存储桶由您的 Amazon 账户拥有。如果删除一个存储桶,则另一个 Amazon 账户可能会创建具有相同 Amazon 资源名称(ARN)的存储桶。
aws lambda add-permission --function-name
CreateThumbnail
--principal s3.amazonaws.com \ --statement-id s3invoke --action "lambda:InvokeFunction" \ --source-arn arn:aws:s3:::sourcebucket
\ --source-accountaccount-id
-
-
通过运行 get-policy 命令验证函数的访问策略。
aws lambda get-policy --function-name
CreateThumbnail
要使 Amazon S3 将对象创建的事件发布到 Lambda,请在源 S3 存储桶上添加通知配置。
此程序将 S3 存储桶配置为每次在该存储桶中创建对象时调用您的函数。请确保仅在源存储桶上配置此选项。不要让您的函数在源存储桶中创建对象,否则您的函数可能会导致在循环中被连续调用。
配置通知
-
打开 Amazon S3 控制台
。 -
选择源 S3 存储桶的名称。
-
选择 Properties(属性)选项卡。
-
在 Event notifications(事件通知)下,选择 Create event notification(创建事件通知)以配置采用以下设置的通知:
-
事件名称 –
lambda-trigger
-
Event types(事件类型)–
All object create events
-
目的地 –
Lambda function
-
Lambda 函数 –
CreateThumbnail
。
-
有关事件配置的更多信息,请参阅 Amazon Simple Storage Service 用户指南中的使用 Amazon S3 控制台启用和配置事件通知。
第 8 步 使用 Amazon S3 触发器测试
按如下所示测试设置:
-
使用 Amazon S3 控制台
将 .jpg 或 .png 对象上载到源 S3 存储桶。 -
使用
CreateThumbnail
Lambda 函数验证每个图像对象都已在目标 S3 存储桶中创建了缩略图。 -
在 CloudWatch 控制台
中查看日志。
第 9 步 清除资源
除非您想要保留为本教程创建的资源,否则可立即将其删除。通过删除您不再使用的 Amazon 资源,可防止您的 Amazon 账户产生不必要的费用。
删除 Lambda 函数
-
打开 Lamba 控制台的 Functions(函数)页面
。 -
选择您创建的函数。
-
依次选择 Actions(操作)和 Delete(删除)。
-
在文本输入字段中键入
delete
,然后选择 Delete(删除)。
删除您创建的策略
-
打开 IAM 控制台的 Policies(策略)页面
。 -
选择您创建的策略 (AWSLambdaS3Policy)。
-
选择 Policy actions(策略操作)、Delete(删除)。
-
选择 Delete(删除)。
删除执行角色
-
打开 IAM 控制台的 Roles
(角色)页面。 -
选择您创建的执行角色。
-
选择 Delete (删除)。
-
在文本输入字段中输入角色名称,然后选择 Delete(删除)。
删除 S3 存储桶
-
打开 Amazon S3 控制台
。 -
选择您创建的存储桶。
-
选择 Delete (删除)。
-
在文本输入字段中输入存储桶的名称。
-
选择删除存储桶。