教程:使用 Amazon S3 触发器创建缩略图 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

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

显示 Amazon S3 存储桶、Lambda 函数和另一个 Amazon S3 存储桶之间的数据流的示意图

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

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

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

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

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

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

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

先决条件

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

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

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

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

    当您注册 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 CLI 来完成教程,请安装最新版本的 Amazon Command Line Interface

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

创建两个 Amazon S3 存储桶

显示您正在 Amazon S3 存储桶步骤中创建存储桶的教程工作流程图

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

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

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

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

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

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

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

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

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

    aws s3api create-bucket --bucket SOURCEBUCKET --region us-west-2 \ --create-bucket-configuration LocationConstraint=us-west-2

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

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

    aws s3api create-bucket --bucket SOURCEBUCKET-resized --region us-west-2 \ --create-bucket-configuration LocationConstraint=us-west-2

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

显示您正在 Amazon S3 存储桶步骤中上传测试对象的教程工作流程图

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

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

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

  3. 选择上传

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

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

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

    aws s3api put-object --bucket SOURCEBUCKET --key HappyFace.jpg --body ./HappyFace.jpg

创建权限策略

显示您正在 Lambda 函数步骤中创建权限策略的教程工作流程图

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

Amazon Web Services Management Console
创建策略(控制台)
  1. 打开 Amazon 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. 选择创建策略

Amazon CLI
创建策略(Amazon 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

创建执行角色

显示您正在 Lambda 函数步骤中创建执行角色的教程工作流程图

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

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

  2. 选择创建角色

  3. 可信实体类型中选择 Amazon Web Service,在使用案例中选择 Lambda

  4. 选择下一步

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

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

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

    3. 选择下一步

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

  7. 选择创建角色

Amazon CLI
创建执行角色并附加权限策略(Amazon CLI)
  1. 将下列 JSON 保存在名为 trust-policy.json 的文件中。此信任策略允许 Lambda 通过向服务主体 lambda.amazonaws.com 授予调用 Amazon Security Token Service(Amazon 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 中的 Amazon Web Services 账户 号码替换为自己的账号。

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

创建函数部署包

显示您正在 Lambda 函数步骤中创建部署包的教程工作流程图

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

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

    mkdir lambda-s3 cd lambda-s3
  2. 将以下函数代码保存在名为 index.mjs 的文件中。请务必将 'us-west-2' 替换您创建源存储桶和目标存储桶时所在的 Amazon Web Services 区域。

    // 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-west-2'}); // 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); };
  3. 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
  4. 创建一个包含函数代码和依赖项的部署包。在 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)库和 Amazon SDK for Python (Boto3)。虽然 Lambda Python 运行时系统包含 Boto3 SDK 的一个版本,但建议您将所有函数的依赖项添加到部署包中,即使这些依赖项已经包含在了运行时系统中。有关更多信息,请参阅 Python 中的运行时系统依赖项

    mkdir package pip install \ --platform manylinux2014_x86_64 \ --target=package \ --implementation cp \ --python-version 3.9 \ --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 函数

教程工作流程图显示您正在 Lambda 函数步骤中创建函数。

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

Amazon Web Services Management Console
创建函数(控制台)

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

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

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

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

  4. 选择 Author from scratch (从头开始创作)

  5. Basic information(基本信息)中,执行以下操作:

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

    2. 运行时系统中,根据您为函数选择的语言选取 Node.js 18.xPython 3.9

    3. 对于架构,选择 x86_64

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

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

    2. 选择您之前创建的 LambdaS3Role

  7. 选择创建函数

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

  2. 选择 .zip 文件

  3. 选择上传

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

  5. 选择保存

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

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

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

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

配置 Amazon S3 来调用函数

显示您正在触发器步骤中创建 Amazon S3 触发器的教程工作流程图

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

重要

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

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

  2. 选择 Add trigger

  3. 选择 S3

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

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

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

  7. 选择 添加

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

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

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

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

    注意

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

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

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

    aws s3api put-bucket-notification-configuration --bucket SOURCEBUCKET \ --notification-configuration file://notification.json

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

使用虚拟事件测试 Lambda 函数

显示您正在测试步骤中使用虚拟事件进行测试的教程工作流程图

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

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

  2. 选择测试选项卡。

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

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

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

    3. 模板中,选择 S3 Put

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

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

      • 对于 name,将 example-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": "example-bucket", "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::example-bucket" }, "object": { "key": "test%2Fkey", "size": 1024, "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901" } } } ] }
    5. 选择保存

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

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

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

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

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

    1. 对于 awsRegion,将 us-west-2 替换为在其中创建 Amazon S3 存储桶的 Amazon Web Services 区域。

    2. 对于 name,将 SOURCEBUCKET 替换为您自己的 Amazon S3 源存储桶的名称。

    3. 对于 key,将 HappyFace.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" } } } ] }
  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

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

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

    aws s3api list-objects-v2 --bucket SOURCEBUCKET-resized

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

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

使用 Amazon S3 触发器测试函数

显示您正在测试步骤中通过将文件上传到 Amazon S3 进行测试的教程工作流程图

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

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

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

    2. 选择上传

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

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

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

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

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

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

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

    aws s3api list-objects-v2 --bucket SOURCEBUCKET-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" } ] }

清除资源

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

删除 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. 选择删除存储桶