教程:使用 Amazon S3 触发器创建缩略图
在本教程中,您将创建 Lambda 函数,然后为 Amazon Simple Storage Service (Amazon S3) 配置触发器。Amazon S3 会为上载到 S3 存储桶的每个镜像文件调用 CreateThumbnail
函数。该函数从 S3 源存储桶读取图像对象并在目标 S3 存储桶中创建要保存的缩略图。
本教程需要适度的 Amazon 和 Lambda 领域知识水平、Docker 操作和 Amazon SAM。我们建议您先尝试 教程:使用 Amazon S3 触发器调用 Lambda 函数。
在本教程中,您将使用 Amazon Command Line Interface (Amazon CLI) 创建以下 Amazon 资源:
Lambda 资源
-
Lambda 函数。您可以选择 Node.js、Python 或 Java 作为函数代码。
-
函数的 .zip 文件存档部署包。
-
授予 Amazon S3 调用函数的权限的访问策略。
Amazon Identity and Access Management (IAM) 资源
-
拥有关联权限策略的执行角色,用于授予函数所需的权限。
Amazon S3 资源
-
具有调用函数的通知配置的源 S3 存储桶。
-
函数在其中保存已调整大小的图像的目标 S3 存储桶。
主题
先决条件
-
Amazon拥有账户
要使用 Lambda 和其他Amazon服务,您需要一个Amazon账户。如果您没有账户,请访问 aws.amazon.com
,然后选择 Create an Amazon Account(创建亚马逊云科技账户)。有关说明,请参阅如何创建和激活新的 Amazon 帐户? -
Command line
要完成以下步骤,您需要命令行终端或 Shell,以便运行命令。在单独的数据块中列出了命令和预期输出:
aws --version
您应看到以下输出:
aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64
对于长命令,使用转义字符 (
\
) 将命令拆分为多行。在 Linux 和 macOS 中,可使用您首选的外壳程序和程序包管理器。在 Windows 10 中,您可以安装 Windows Subsystem for Linux
,获取 Ubuntu 和 Bash 与 Windows 集成的版本。 -
Amazon CLI
在本教程中,您将使用 Amazon CLI 命令创建和调用 Lambda 函数。安装 Amazon CLI 并使用您的 Amazon 凭据对其进行配置。
-
语言工具
为您要使用的语言安装语言支持工具和软件包管理器:Node.js、Python 或 Java。有关推荐的工具,请参阅 代码编写工具。
第 1 步 创建 S3 存储桶并上传示例对象
按照以下步骤创建 S3 存储桶并上传对象。
-
打开 Amazon S3 控制台
。 -
创建两个 S3 存储桶。目标存储桶必须命名为
,其中source
-resizedsource
是源存储桶的名称。例如,名为mybucket
的源存储桶和名为mybucket-resized
的目标存储桶。 -
在源存储桶中,上传一个 .jpg 对象,例如
HappyFace.jpg
。在测试 Lambda 函数之前,必须创建此示例对象。使用 Lambda invoke 命令手动测试函数时,将示例事件数据传递给指定源存储桶名称并将
HappyFace.jpg
指定为新创建对象的函数。
第 2 步 创建 IAM 策略
创建定义 Lambda 函数权限的 IAM 策略。该函数必须具有以下权限:
从源 S3 存储桶获取对象。
将已调整大小的对象放入目标 S3 存储桶。
将日志写入 Amazon CloudWatch Logs
创建 IAM 策略
-
在 IAM 控制台中打开 Policies(策略)页面
。 -
选择 Create policy(创建策略)。
-
选择 JSON 选项卡,然后粘贴以下策略。请务必将
mybucket
替换为您之前创建的源存储桶的名称。{ "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:::
mybucket
/*" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::mybucket
-resized/*" } ] } -
选择 Next: Tags(下一步:标签)。
-
选择 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 步 创建函数代码
在下面的代码示例中,Amazon S3 事件包含源 S3 存储桶名称和对象密钥键。如果对象是 .jpg 或 .png 图像文件,它会从源存储桶读取图像,生成缩略图,然后将缩略图保存到目标 S3 存储桶。
请注意以下几点:
-
该代码假定目标存储桶存在,且其名称是源存储桶名称和
-resized
的联接。 -
对于创建的每个缩略图文件,Lambda 函数代码将对象键名称派生为
resized-
和源对象键名称的联接。例如,如果源对象键名称为sample.jpg
,则代码会创建具有键resized-sample.jpg
的缩略图对象。
第 5 步 创建部署程序包
部署程序包是包含 Lambda 函数代码及其依赖项的 .zip 文件归档。
第 6 步 创建 Lambda 函数
创建函数
-
使用 create-function 命令创建 Lambda 函数。
对于角色参数,请将 123456789012
替换为您的 Amazon 账户 ID。之前的示例命令指定 10 秒超时值作为函数配置。根据上传的对象的大小,可能需要使用下面的 Amazon CLI 命令增大超时值:
aws lambda update-function-configuration --function-name CreateThumbnail --timeout
30
第 7 步 测试 Lambda 函数
使用示例 Amazon S3 事件数据手动调用 Lambda 函数。
测试 Lambda 函数
-
将下面的 Amazon S3 示例事件数据保存到名为
inputFile.txt
的文件中。请务必将sourcebucket
和HappyFace.jpg
分别替换为源 S3 存储桶名称和 .jpg 对象键。{ "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 \ --invocation-type Event \ --payload file://inputFile.txt outputfile.txt
如果您使用 Amazon CLI 版本 2,则 cli-binary-format 选项必填。您还可以在 Amazon CLI Config 文件中配置此选项。
-
验证目标 S3 存储桶中已创建缩略图。
第 8 步 配置 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 Resource Name (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 控制台启用和配置事件通知。
第 9 步 使用 S3 触发器测试
按如下所示测试设置:
-
使用 Amazon S3 控制台
将 .jpg 或 .png 对象上载到源 S3 存储桶。 -
使用
CreateThumbnail
Lambda 函数验证每个图像对象都已在目标 S3 存储桶中创建了缩略图。 -
在 CloudWatch 控制台
中查看日志。
第 10 步 清除资源
除非您想要保留为本教程创建的资源,否则可立即将其删除。通过删除您不再使用的 Amazon 资源,可防止您的 Amazon 账户产生不必要的费用。
删除 Lambda 函数
-
打开 Lamba 控制台的 Functions(函数)页面
。 -
选择您创建的函数。
-
选择 Actions (操作),然后选择 Delete (删除)。
-
选择 Delete。
删除您创建的策略
-
打开 IAM 控制台的 Policies(策略)页面
。 -
选择您创建的策略 (AWSLambdaS3Policy)。
-
选择 Policy actions(策略操作)、Delete(删除)。
-
选择 Delete。
删除执行角色
-
打开 IAM 控制台的 Roles(角色)页面
。 -
选择您创建的执行角色。
-
选择删除角色。
-
选择 Yes, delete(是,删除)。
删除 S3 存储桶
-
打开 Amazon S3 控制台
。 -
选择您创建的存储桶。
-
选择 Delete。
-
在文本框中输入存储桶的名称。
-
选择 Confirm(确认)。