教程:使用 Amazon S3 触发器创建缩略图 - AWS Lambda

教程:使用 Amazon S3 触发器创建缩略图

在本教程中,您将创建并配置 Lambda 函数,用于调整添加到 Amazon Simple Storage Service(Amazon S3)存储桶的图像大小。当您向存储桶添加图像文件时,Amazon S3 会调用您的 Lambda 函数。然后,该函数会创建图像的缩略图版本,并将其输出到不同的 Amazon S3 存储桶。

S3 存储桶、Lambda 函数和另一 S3 存储桶之间的数据流

要完成本教程,请执行以下步骤:

  1. 创建源和目标 Amazon S3 存储桶并上传示例图片。

  2. 创建一个 Lambda 函数,用于调整图像大小并将缩略图输出到 Amazon S3 存储桶。

  3. 配置一个 Lambda 触发器,该触发器将在对象上传到源存储桶时调用函数。

  4. 若要测试您的函数,先使用虚拟事件,然后将图像上传到源存储桶。

完成这些步骤后,您将了解如何使用 Lambda 对添加到 Amazon S3 存储桶的对象执行文件处理任务。您可以使用 AWS Command Line Interface 或 AWS CLI (AWS Management Console) 完成此教程。

如果您相同通过更简单的示例来了解如何为 Lambda 配置 Amazon S3 触发器,则可以参阅教程:使用 Amazon S3 触发器调用 Lambda 函数

先决条件

如果您还没有 AWS 账户,请完成以下步骤来创建一个。

注册 AWS 账户
  1. 打开 https://portal.aws.amazon.com/billing/signup

  2. 按照屏幕上的说明进行操作。

    在注册时,将接到一通电话,要求使用电话键盘输入一个验证码。

    当您注册 AWS 账户时,系统将会创建一个 AWS 账户根用户。根用户有权访问该账户中的所有 AWS 服务 和资源。作为安全最佳实践,请为用户分配管理访问权限,并且只使用根用户来执行需要根用户访问权限的任务

注册过程完成后,AWS 会向您发送一封确认电子邮件。在任何时候,您都可以通过转至 https://aws.amazon.com/ 并选择我的账户来查看当前的账户活动并管理您的账户。

注册 AWS 账户 后,请保护好您的 AWS 账户根用户,启用 AWS IAM Identity Center,并创建一个管理用户,以避免使用根用户执行日常任务。

保护您的 AWS 账户根用户
  1. 选择根用户并输入您的 AWS 账户电子邮件地址,以账户拥有者身份登录 AWS Management Console。在下一页上,输入您的密码。

    要获取使用根用户登录方面的帮助,请参阅《AWS 登录 用户指南》中的以根用户身份登录

  2. 为您的根用户启用多重身份验证 (MFA)。

    有关说明,请参阅《IAM 用户指南》中的为 AWS 账户 根用户启用虚拟 MFA 设备(控制台)

创建具有管理访问权限的用户
  1. 启用 IAM Identity Center。

    有关说明,请参阅《AWS IAM Identity Center 用户指南》中的启用 AWS IAM Identity Center

  2. 在 IAM Identity Center 中,为用户授予管理访问权限。

    有关如何使用 IAM Identity Center 目录 作为身份源的教程,请参阅《AWS IAM Identity Center 用户指南》中的使用默认的 IAM Identity Center 目录 配置用户访问权限

以具有管理访问权限的用户身份登录
  • 要使用您的 IAM Identity Center 用户身份登录,请使用您在创建 IAM Identity Center 用户时发送到您的电子邮件地址的登录网址。

    要获取使用 IAM Identity Center 用户登录方面的帮助,请参阅《AWS 登录 用户指南》中的登录 AWS 访问门户

将访问权限分配给其他用户
  1. 在 IAM Identity Center 中,创建一个权限集,该权限集遵循应用最低权限的最佳做法。

    有关说明,请参阅《AWS IAM Identity Center 用户指南》中的创建权限集

  2. 将用户分配到一个组,然后为该组分配单点登录访问权限。

    有关说明,请参阅《AWS IAM Identity Center 用户指南》中的添加组

如果您想使用 AWS CLI 来完成教程,请安装最新版本的 AWS Command Line Interface

对于 Lambda 函数代码,您可以使用 Python 或 Node.js。为您要使用的语言安装语言支持工具和软件包管理器。

创建两个 Amazon S3 存储桶

第一步:创建 S3 存储桶

先创建两个 Amazon S3 存储桶。第一个存储桶是您要向其上传图像的源存储桶。第二个存储桶是 Lambda 用来保存调用函数时调整大小后的缩略图。

AWS Management Console
创建 Amazon S3 存储桶(控制台)
  1. 打开 Amazon S3 控制台的存储桶页面。

  2. 选择 Create bucket(创建存储桶)。

  3. General configuration(常规配置)下,执行以下操作:

    1. 对于存储桶名称,输入符合 Amazon S3 存储桶命名规则的全局唯一名称。存储桶名称只能由小写字母、数字、句点(.)和连字符(-)组成。

    2. 对于 AWS 区域,请选择最接近您地理位置的 AWS 区域。在本教程的后面部分,您必须在同个 AWS 区域 中创建 Lambda 函数,因此请记下您选择的区域。

  4. 将所有其他选项设置为默认值并选择创建存储桶

  5. 重复步骤 1 到 4 以创建自己的目标存储桶。在存储桶名称中输入 amzn-s3-demo-source-bucket-resized,其中 amzn-s3-demo-source-bucket 是您刚刚创建的源存储桶的名称。

AWS CLI
创建 Amazon S3 存储桶(AWS CLI)
  1. 运行以下 CLI 命令来创建自己的源存储桶。您为存储桶选择的名称必须具有全局唯一性,并遵守 Amazon S3 存储桶命名规则。名称只能由小写字母、数字、句点(.)和连字符(-)组成。对于 regionLocationConstraint,请选择最接近您地理位置的 AWS 区域

    aws s3api create-bucket --bucket amzn-s3-demo-source-bucket --region us-east-1 \ --create-bucket-configuration LocationConstraint=us-east-1

    在本教程的后面部分,您必须在与源存储桶相同的 AWS 区域 中创建 Lambda 函数,因此请记下您选择的区域。

  2. 运行以下命令来创建自己的目标存储桶。对于存储桶名称,必须使用 amzn-s3-demo-source-bucket-resized,其中 amzn-s3-demo-source-bucket 是您在步骤 1 中创建的源存储桶名称。对于 regionLocationConstraint,请选择与用于创建源存储桶时相同的 AWS 区域。

    aws s3api create-bucket --bucket amzn-s3-demo-source-bucket-resized --region us-east-1 \ --create-bucket-configuration LocationConstraint=us-east-1

将测试图片上传到源存储桶

下一步:上传测试对象

在本教程的后面部分,您将使用 AWS CLI 或 Lambda 控制台调用 Lambda 函数以对其进行测试。要确认函数是否正常运行,您的源存储桶需要包含测试图片。此图像可以是您选择的任何 JPG 或 PNG 文件。

AWS Management Console
将测试图片上传到源存储桶(控制台)
  1. 打开 Amazon S3 控制台的存储桶页面。

  2. 选择您在上一步中创建的源存储桶。

  3. 选择上传

  4. 选择添加文件,然后使用文件选择器选择要上传的对象。

  5. 选择打开,然后选择上传

AWS CLI
将测试图片上传到源存储桶(AWS CLI)
  • 在包含要上传的图像的目录中,运行以下 CLI 命令。将 --bucket 参数替换为源存储桶的名称。对于--key--body 参数,请使用测试图像的文件名。

    aws s3api put-object --bucket amzn-s3-demo-source-bucket --key HappyFace.jpg --body ./HappyFace.jpg

创建权限策略

下一步:创建权限策略

创建 Lambda 函数的第一步是创建权限策略。此策略为函数提供访问其他 AWS 资源所需的权限。在本教程中,此策略授予了 Lambda 对 Amazon S3 存储桶的读取和写入权限,并允许其写入 Amazon CloudWatch Logs。

AWS Management Console
创建策略(控制台)
  1. 打开 AWS Identity and Access Management IAM 控制台的 Policies(策略)页面

  2. 选择创建策略

  3. 选择 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:::*/*" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::*/*" } ] }
  4. 选择下一步

  5. 策略详细信息下,为策略名称输入 LambdaS3Policy

  6. 选择创建策略

AWS CLI
创建策略(AWS CLI)
  1. 将下列 JSON 保存在名为 policy.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:::*/*" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::*/*" } ] }
  2. 在保存 JSON 策略文档的目录中,运行以下 CLI 命令。

    aws iam create-policy --policy-name LambdaS3Policy --policy-document file://policy.json

创建执行角色

下一步:创建执行角色

执行角色是一个 IAM 角色,用于向 Lambda 函数授予访问 AWS 服务 和资源的权限。要授予函数读取和写入 Amazon S3 存储桶的权限,您需要附加上一步中创建的权限策略。

AWS Management Console
创建执行角色并附加权限策略(控制台)
  1. 打开(IAM)控制台的角色页面。

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

  3. 可信实体类型中选择 AWS 服务,在使用案例中选择 Lambda

  4. 选择下一步

  5. 执行以下操作添加您在上一步中创建的权限策略:

    1. 在策略搜索框中,输入 LambdaS3Policy

    2. 在搜索结果中,选中 LambdaS3Policy 的复选框。

    3. 选择下一步

  6. 角色详细信息下的角色名称中输入 LambdaS3Role

  7. 选择 Create role(创建角色)。

AWS CLI
创建执行角色并附加权限策略(AWS CLI)
  1. 将下列 JSON 保存在名为 trust-policy.json 的文件中。此信任策略允许 Lambda 通过向服务主体 lambda.amazonaws.com 授予调用 AWS Security Token Service(AWS STS)AssumeRole 操作的权限来使用该角色的权限。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. 在保存 JSON 信任策略文档的目录中,运行以下 CLI 命令来创建执行角色。

    aws iam create-role --role-name LambdaS3Role --assume-role-policy-document file://trust-policy.json
  3. 要附加您在上一步中创建的权限策略,请运行以下 CLI 命令。将策略 ARN 中的 AWS 账户 号码替换为自己的账号。

    aws iam attach-role-policy --role-name LambdaS3Role --policy-arn arn:aws:iam::123456789012:policy/LambdaS3Policy

创建函数部署包

下一步:创建部署包

要创建函数,您需要创建包含函数代码和所有依赖项的部署包。对于此 CreateThumbnail 函数,您的函数代码使用单独的库来调整图像大小。按照所选语言的说明创建包含所需库的部署包。

Node.js
创建部署包(Node.js)
  1. 为您的函数代码和依赖项创建一个名为 lambda-s3 的目录并导航到此目录。

    mkdir lambda-s3 cd lambda-s3
  2. 使用 npm 创建新的 Node.js 项目。要在交互式体验中接受提供的默认选项,请按 Enter

    npm init
  3. 将以下函数代码保存在名为 index.mjs 的文件中。请务必将 us-east-1 替换您创建源存储桶和目标存储桶时所在的 AWS 区域。

    // dependencies import { S3Client, GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3'; import { Readable } from 'stream'; import sharp from 'sharp'; import util from 'util'; // create S3 client const s3 = new S3Client({region: 'us-east-1'}); // define the handler function export const handler = async (event, context) => { // Read options from the event parameter and get the source bucket console.log("Reading options from event:\n", util.inspect(event, {depth: 5})); const srcBucket = event.Records[0].s3.bucket.name; // Object key may have spaces or unicode non-ASCII characters const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " ")); const dstBucket = srcBucket + "-resized"; const dstKey = "resized-" + srcKey; // Infer the image type from the file suffix const typeMatch = srcKey.match(/\.([^.]*)$/); if (!typeMatch) { console.log("Could not determine the image type."); return; } // Check that the image type is supported const imageType = typeMatch[1].toLowerCase(); if (imageType != "jpg" && imageType != "png") { console.log(`Unsupported image type: ${imageType}`); return; } // Get the image from the source bucket. GetObjectCommand returns a stream. try { const params = { Bucket: srcBucket, Key: srcKey }; var response = await s3.send(new GetObjectCommand(params)); var stream = response.Body; // Convert stream to buffer to pass to sharp resize function. if (stream instanceof Readable) { var content_buffer = Buffer.concat(await stream.toArray()); } else { throw new Error('Unknown object stream type'); } } catch (error) { console.log(error); return; } // set thumbnail width. Resize will set the height automatically to maintain aspect ratio. const width = 200; // Use the sharp module to resize the image and save in a buffer. try { var output_buffer = await sharp(content_buffer).resize(width).toBuffer(); } catch (error) { console.log(error); return; } // Upload the thumbnail image to the destination bucket try { const destparams = { Bucket: dstBucket, Key: dstKey, Body: output_buffer, ContentType: "image" }; const putResult = await s3.send(new PutObjectCommand(destparams)); } catch (error) { console.log(error); return; } console.log('Successfully resized ' + srcBucket + '/' + srcKey + ' and uploaded to ' + dstBucket + '/' + dstKey); };
  4. lambda-s3 目录中,使用 npm 安装 sharp 库。请注意,最新版本的 sharp(0.33)与 Lambda 不兼容。安装版本 0.32.6 以完成本教程。

    npm install sharp@0.32.6

    npm install 命令会为模块创建 node_modules 目录。完成此步骤后,目录结构应如下所示:

    lambda-s3 |- index.mjs |- node_modules | |- base64js | |- bl | |- buffer ... |- package-lock.json |- package.json
  5. 创建一个包含函数代码和依赖项的部署包。在 MacOS 或 Linux 中,运行以下命令。

    zip -r function.zip .

    在 Windows 中,使用您首选的 ZIP 实用工具来创建 .zip 文件。确保您的 index.mjspackage.json、和 package-lock.json 文件以及您的 node_modules 目录都在.zip 文件的根目录中。

Python
创建部署包(Python)
  1. 将代码示例保存为名为 lambda_function.py 的文件。

    import boto3 import os import sys import uuid from urllib.parse import unquote_plus from PIL import Image import PIL.Image s3_client = boto3.client('s3') def resize_image(image_path, resized_path): with Image.open(image_path) as image: image.thumbnail(tuple(x / 2 for x in image.size)) image.save(resized_path) def lambda_handler(event, context): for record in event['Records']: bucket = record['s3']['bucket']['name'] key = unquote_plus(record['s3']['object']['key']) tmpkey = key.replace('/', '') download_path = '/tmp/{}{}'.format(uuid.uuid4(), tmpkey) upload_path = '/tmp/resized-{}'.format(tmpkey) s3_client.download_file(bucket, key, download_path) resize_image(download_path, upload_path) s3_client.upload_file(upload_path, '{}-resized'.format(bucket), 'resized-{}'.format(key))
  2. 在创建 lambda_function.py 文件的同一目录中,创建一个名为 package 的新目录并安装 Pillow(PIL)库和 AWS SDK for Python (Boto3)。虽然 Lambda Python 运行时系统包含 Boto3 SDK 的一个版本,但建议您将所有函数的依赖项添加到部署包中,即使这些依赖项已经包含在了运行时系统中。有关更多信息,请参阅 Python 中的运行时系统依赖项

    mkdir package pip install \ --platform manylinux2014_x86_64 \ --target=package \ --implementation cp \ --python-version 3.12 \ --only-binary=:all: --upgrade \ pillow boto3

    Pillow 库包含 C/C++ 代码。通过使用 --platform manylinux_2014_x86_64--only-binary=:all: 选项,pip 将下载并安装包含与 Amazon Linux 2 操作系统兼容的预编译二进制文件的 Pillow 版本。这可以确保无论本地构建计算机的操作系统和架构如何,部署包都能在 Lambda 执行环境中正常发挥作用。

  3. 创建包含应用程序代码和 Pillow 以及 Boto3 库的 zip 文件。在 Linux 或 MacOS 中,从命令行界面运行以下命令。

    cd package zip -r ../lambda_function.zip . cd .. zip lambda_function.zip lambda_function.py

    在 Windows 中,使用您首选的压缩工具来创建 lambda_function.zip 文件。确保您的 lambda_function.py 文件和包含依赖项的文件夹都位于.zip 文件的根目录下。

您也可以使用 Python 虚拟环境创建部署包。请参阅 将 .zip 文件归档用于 Python Lambda 函数

创建 Lambda 函数

下一步:创建函数

您也可以使用 AWS CLI 或 Lambda 控制台创建 Lambda 函数。按照所选语言的说明创建函数。

AWS Management Console
创建函数(控制台)

要使用控制台创建 Lambda 函数,首先要创建包含一些“Hello world”代码的基本函数。然后,通过上传在上一步中创建的 .zip 或 JAR 文件,将此代码替换为自己的函数代码。

  1. 打开 Lamba 控制台的函数页面

  2. 确保您在创建 Amazon S3 存储桶所在的同一 AWS 区域 内操作。您可以使用屏幕顶部的下拉列表更改区域。

    显示了 Lambda 控制台中的区域下拉菜单的图像
  3. 选择 Create function (创建函数)

  4. 选择从头开始创作

  5. 基本信息中,执行以下操作:

    1. 对于 Function name(函数名称),请输入 CreateThumbnail

    2. 对于运行时,根据您为函数选择的语言,选择 Node.js 20.xPython 3.12

    3. 对于架构,选择 x86_64

  6. 更改默认执行角色选项卡中,执行以下操作:

    1. 展开选项卡,然后选择使用现有角色

    2. 选择您之前创建的 LambdaS3Role

  7. 选择 Create function (创建函数)

上传函数代码(控制台)
  1. 代码源窗格中,选择上传自

  2. 选择 .zip 文件

  3. 选择上传

  4. 在文件选择器中,选择 .zip 文件,然后选择打开

  5. 选择保存

AWS CLI
创建函数(AWS CLI)
  • 运行您所选语言的 CLI 命令。对于 role 参数,确保将 123456789012 替换为自己的 AWS 账户 ID。对于 region 参数,将 us-east-1 替换为在其中创建 Amazon S3 存储桶的区域。

    • 对于 Node.js,从包含 function.zip 文件的目录中运行以下命令。

      aws lambda create-function --function-name CreateThumbnail \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs20.x \ --timeout 10 --memory-size 1024 \ --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-east-1
    • 对于 Python,从包含 lambda_function.zip 文件的目录中运行以下命令。

      aws lambda create-function --function-name CreateThumbnail \ --zip-file fileb://lambda_function.zip --handler lambda_function.lambda_handler \ --runtime python3.12 --timeout 10 --memory-size 1024 \ --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-east-1

配置 Amazon S3 来调用函数

下一步:创建 Amazon S3 触发器

要在将图像上传到源存储桶时运行 Lambda 函数,您需要为函数配置触发器。您可以使用控制台或 AWS CLI 配置 Amazon S3 触发器。

重要

此程序将 Amazon S3 存储桶配置为每次在此存储桶中创建对象时调用您的函数。请确保仅在源存储桶上配置。如果您的 Lambda 函数在调用此函数的同一个存储桶中创建对象,则可以在循环中持续调用您的函数。这可能会导致您的 AWS 账户 产生额外费用。

AWS Management Console
配置 Amazon S3 触发器(控制台)
  1. 打开 Lambda 控制台的函数页面,然后选择函数 (CreateThumbnail)。

  2. 选择添加触发器

  3. 选择 S3

  4. 存储桶下,选择自己的源存储桶。

  5. 事件类型下,选择所有对象创建事件

  6. 递归调用下,选中复选框以确认知晓不建议使用相同的 Amazon S3 存储桶用于输入和输出。您可以阅读 Serverless Land 中的 Recursive patterns that cause run-away Lambda functions,进一步了解 Lambda 中的递归调用模式。

  7. 选择添加

    在您使用 Lambda 控制台创建触发器时,Lambda 会自动创建基于资源的策略,授予您选择的服务调用函数的权限。

AWS CLI
配置 Amazon S3 触发器(AWS CLI)
  1. 要让 Amazon S3 源存储桶在添加图像文件时调用函数,您首先需要使用基于资源的策略为函数配置权限。基于资源的策略声明授予其他 AWS 服务 调用您函数的权限。要授予 Amazon S3 调用函数的权限,请运行以下 CLI 命令。请务必将 source-account 参数替换为您的 AWS 账户 ID 并使用自己的源存储桶名称。

    aws lambda add-permission --function-name CreateThumbnail \ --principal s3.amazonaws.com --statement-id s3invoke --action "lambda:InvokeFunction" \ --source-arn arn:aws:s3:::amzn-s3-demo-source-bucket \ --source-account 123456789012

    您使用此命令定义的策略允许 Amazon S3 仅在源存储桶上执行操作时调用函数。

    注意

    虽然 Amazon S3 存储桶名称具有全局唯一性,但在使用基于资源的策略时,最佳做法是指定存储桶必须属于您的账户。这是因为,如果删除一个存储桶,则另一个 AWS 账户 账户可能会创建具有相同 Amazon 资源名称(ARN)的存储桶。

  2. 将下列 JSON 保存在名为 notification.json 的文件中。在应用到您的源存储桶时,此 JSON 会将存储桶配置为在每次添加新对象时向 Lambda 函数发送通知。将 Lambda 函数 ARN 中的 AWS 账户 号码和 AWS 区域 替换为您自己的账号和区域。

    { "LambdaFunctionConfigurations": [ { "Id": "CreateThumbnailEventConfiguration", "LambdaFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:CreateThumbnail", "Events": [ "s3:ObjectCreated:Put" ] } ] }
  3. 运行以下 CLI 命令,将您创建的 JSON 文件中的通知设置应用到源存储桶。将 amzn-s3-demo-source-bucket 替换为源存储桶的名称。

    aws s3api put-bucket-notification-configuration --bucket amzn-s3-demo-source-bucket \ --notification-configuration file://notification.json

    要了解有关 put-bucket-notification-configuration 命令和 notification-configuration 选项的更多信息,请参阅 AWS CLI 命令参考中的 put-bucket-notification-configuration

使用虚拟事件测试 Lambda 函数

下一步:创建虚拟事件

在通过向 Amazon S3 源存储桶添加图像文件来测试整个设置之前,您可以通过使用虚拟事件调用 Lambda 函数来测试此函数是否正常运行。Lambda 中的事件是 JSON 格式的文档,其中包含要处理的函数数据。Amazon S3 调用您的函数时,发送到函数的事件包含存储桶名称、存储桶 ARN 和对象键等信息。

AWS Management Console
使用虚拟事件测试 Lambda 函数(控制台)
  1. 打开 Lambda 控制台的函数页面,然后选择函数 (CreateThumbnail)。

  2. 选择测试选项卡。

  3. 要创建测试事件,在测试事件窗格中,执行以下操作:

    1. 测试事件操作下,选择创建新事件

    2. 对于事件名称,输入 myTestEvent

    3. 模板中,选择 S3 Put

    4. 将以下参数的值替换为您自己的值。

      • 对于 awsRegion,将 us-east-1 替换为在其中创建 Amazon S3 存储桶的 AWS 区域。

      • 对于 name,将 amzn-s3-demo-bucket 替换为您自己的 Amazon S3 源存储桶的名称。

      • 对于 key,将 test%2Fkey 替换为您在步骤 将测试图片上传到源存储桶 中上传到源存储桶的测试对象的文件名。

      { "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" } } } ] }
    5. 选择保存

  4. 测试事件窗格中,选择测试

  5. 要检查您的函数是否已创建图像的调整大小版本并将其存储在目标 Amazon S3 存储桶中,请执行以下操作:

    1. 打开 Amazon S3 控制台的存储桶页面

    2. 选择目标存储桶并确认调整大小的文件已在对象窗格中列出。

AWS CLI
使用虚拟事件测试 Lambda 函数(AWS CLI)
  1. 将下列 JSON 保存在名为 dummyS3Event.json 的文件中。将以下参数的值替换为您自己的值:

    • 对于 awsRegion,将 us-east-1 替换为在其中创建 Amazon S3 存储桶的 AWS 区域。

    • 对于 name,将 amzn-s3-demo-bucket 替换为您自己的 Amazon S3 源存储桶的名称。

    • 对于 key,将 test%2Fkey 替换为您在步骤 将测试图片上传到源存储桶 中上传到源存储桶的测试对象的文件名。

    { "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" } } } ] }
  2. 在保存 dummyS3Event.json 文件的目录中,运行以下 CLI 命令来调用函数。此命令通过指定 RequestResponse 作为调用类型参数的值来同步调用 Lambda 函数。要了解有关同步和异步调用的更多信息,请参阅调用 Lambda 函数

    aws lambda invoke --function-name CreateThumbnail \ --invocation-type RequestResponse --cli-binary-format raw-in-base64-out \ --payload file://dummyS3Event.json outputfile.txt

    如果您使用的是 AWS CLI 版本 2,则 cli-binary-format 选项必填。要将其设为默认设置,请运行 aws configure set cli-binary-format raw-in-base64-out。有关更多信息,请参阅AWS CLI 支持的全局命令行选项

  3. 验证您的函数是否已创建图像的缩略图版本并已保存到目标 Amazon S3 存储桶中。运行以下 CLI 命令,将 amzn-s3-demo-source-bucket-resized 替换为自己的目标存储桶的名称。

    aws s3api list-objects-v2 --bucket amzn-s3-demo-source-bucket-resized

    您应该可以看到类似于如下所示的输出内容。Key 参数显示调整大小后的图像文件的文件名。

    { "Contents": [ { "Key": "resized-HappyFace.jpg", "LastModified": "2023-06-06T21:40:07+00:00", "ETag": "\"d8ca652ffe83ba6b721ffc20d9d7174a\"", "Size": 2633, "StorageClass": "STANDARD" } ] }

使用 Amazon S3 触发器测试函数

下一步:测试函数

此时,您已确认 Lambda 函数运行正常,您可以通过向 Amazon S3 源存储桶添加图像文件来测试完整设置。将图像添加到源存储桶时,应自动调用 Lambda 函数。函数会创建文件已调整大小的版本并将其存储在目标存储桶中。

AWS Management Console
使用 Amazon S3 触发器测试 Lambda 函数(控制台)
  1. 要将图像上传到 Amazon S3 存储桶,请执行以下操作:

    1. 打开 Amazon S3 控制台的存储桶页面,然后选择您的源存储桶。

    2. 选择上传

    3. 选择添加文件,然后使用文件选择器选择要上传的图像文件。您的图像对象可以是任何.jpg 或.png 文件。

    4. 选择打开,然后选择上传

  2. 执行以下操作,验证 Lambda 是否已将调整大小后的图像文件保存在目标存储桶中:

    1. 导航回 Amazon S3 控制台的存储桶页面,然后选择您的目标存储桶。

    2. 对象窗格中,您现在应该能看到两个已调整大小的图像文件,其中一个来自 Lambda 函数的每次测试。要下载已调整大小的图像,请选择所需文件,然后选择下载

AWS CLI
使用 Amazon S3 触发器测试 Lambda 函数(AWS CLI)
  1. 在包含要上传的图像的目录中,运行以下 CLI 命令。将 --bucket 参数替换为源存储桶的名称。对于--key--body 参数,请使用测试图像的文件名。您的测试图像可以是任何.jpg 或.png 文件。

    aws s3api put-object --bucket amzn-s3-demo-source-bucket --key SmileyFace.jpg --body ./SmileyFace.jpg
  2. 验证您的函数是否已创建图像的缩略图版本并已保存到目标 Amazon S3 存储桶中。运行以下 CLI 命令,将 amzn-s3-demo-source-bucket-resized 替换为自己的目标存储桶的名称。

    aws s3api list-objects-v2 --bucket amzn-s3-demo-source-bucket-resized

    如果函数成功运行,您将看到类似于以下内容的输出。您的目标存储桶现在应该包含两个已调整大小的文件。

    { "Contents": [ { "Key": "resized-HappyFace.jpg", "LastModified": "2023-06-07T00:15:50+00:00", "ETag": "\"7781a43e765a8301713f533d70968a1e\"", "Size": 2763, "StorageClass": "STANDARD" }, { "Key": "resized-SmileyFace.jpg", "LastModified": "2023-06-07T00:13:18+00:00", "ETag": "\"ca536e5a1b9e32b22cd549e18792cdbc\"", "Size": 1245, "StorageClass": "STANDARD" } ] }

清除资源

除非您想要保留为本教程创建的资源,否则可立即将其删除。通过删除您不再使用的 AWS 资源,可防止您的 AWS 账户 产生不必要的费用。

删除 Lambda 函数
  1. 打开 Lamba 控制台的 Functions(函数)页面

  2. 选择您创建的函数。

  3. 依次选择操作删除

  4. 在文本输入字段中键入 delete,然后选择 Delete(删除)。

删除您创建的策略
  1. 打开 IAM 控制台的 Policies(策略)页面

  2. 选择您创建的策略 (AWSLambdaS3Policy)。

  3. 选择 Policy actions(策略操作)、Delete(删除)。

  4. 选择 Delete(删除)。

删除执行角色
  1. 打开 IAM 控制台的角色页面

  2. 选择您创建的执行角色。

  3. 选择删除

  4. 在文本输入字段中输入角色名称,然后选择 Delete(删除)。

删除 S3 存储桶
  1. 打开 Amazon S3 控制台

  2. 选择您创建的存储桶。

  3. 选择删除

  4. 在文本输入字段中输入存储桶的名称。

  5. 选择删除存储桶