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

教程:使用 Amazon S3 触发器调用 Lambda 函数

在本教程中,您将使用控制台创建 Lambda 函数并为 Amazon Simple Storage Service (Amazon S3) 配置触发器。每次向 Amazon S3 存储桶添加对象时,触发器都会调用您的函数。

我们建议您先完成此基于控制台的教程,然后再尝试创建缩略图的教程

先决条件

要使用 Lambda、Amazon 和其他 Amazon 服务,您需要一个 Amazon 账户。如果您没有账户,请访问 www.amazonaws.cn,然后选择 Create an Amazon Account (创建 Amazon 账户)。有关说明,请参阅如何创建和激活新的 Amazon 帐户?

本教程假设您对基本 Lambda 操作和 Lambda 控制台有一定了解。如果您尚不了解,请按照开始使用 Lambda中的说明创建您的第一个 Lambda 函数。

创建存储桶并上传示例对象

创建 Amazon S3 存储桶并将测试文件上传到新存储桶。从控制台测试函数时,您的 Lambda 函数将检索有关此文件的信息。

使用控制台创建 Amazon S3 存储桶

  1. 打开 Amazon S3 控制台

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

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

    1. 对于 Bucket name(存储桶名称),请输入唯一名称。

    2. 对于 Amazon Region(Amazon区域),选择一个区域。请注意,您必须在相同区域中创建 Lambda 函数。

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

创建存储桶后,Amazon S3 打开 Buckets(存储桶)页面,其中显示您的账户在当前区域中的所有存储桶的列表。

使用 Amazon S3 控制台上传测试对象

  1. 在 Amazon S3 控制台的 Buckets(存储桶)页面上,选择您创建的存储桶的名称。

  2. Objects(对象)选项卡上,选择 Upload(上传)。

  3. 将测试文件从本地计算机拖到 Upload(上传)页面。

  4. 选择 Upload

创建 Lambda 函数

使用函数蓝图创建 Lambda 函数。蓝图提供了一个示例函数,演示如何将 Lambda 与其他 Amazon 服务结合使用。此外,蓝图还包括特定运行时的示例代码和函数配置预设。在本教程中,您可以选择 Node.js 或 Python 运行时的蓝图。

在控制台中从蓝图创建 Lambda 函数

  1. 打开 Lambda 控制台的“函数”页面

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

  3. Create function (创建函数) 页面中,选择 Use a blueprint (使用蓝图)

  4. Blueprints(蓝图)下,在搜索框中输入 s3

  5. 在搜索结果中,执行以下操作之一:

    • 对于 Node.js 函数,请选择 s3-get-object

    • 对于 Python 函数,请选择 s3-get-object-python

  6. 选择 Configure (配置)

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

    1. 对于 Function name(函数名称),请输入 my-s3-function

    2. 对于 Execution role(执行角色),选择 Create a new role from Amazon policy templates(从 Amazon 策略模板创建新角色)。

    3. 对于 Role name(角色名称),输入 my-s3-function-role

  8. S3 trigger(S3 触发器)下,选择您之前创建的 S3 存储桶。

    当您使用 Lambda 控制台配置 S3 触发器时,控制台会修改函数的 基于资源的策略以允许 Amazon S3 调用该函数。

  9. 选择创建函数

检查函数代码

Lambda 函数从接收的事件参数中检索源 S3 存储桶名称和上传对象的键名称。该函数使用 Amazon S3 getObject API 检索对象的内容类型。

Lambda 控制台中查看函数时,您可以在 Code(代码)选项卡的 Code source(代码源)下查看函数代码。代码如下所示:

Node.js

例 index.js

console.log('Loading function'); const aws = require('aws-sdk'); const s3 = new aws.S3({ apiVersion: '2006-03-01' }); exports.handler = async (event, context) => { //console.log('Received event:', JSON.stringify(event, null, 2)); // Get the object from the event and show its content type const bucket = event.Records[0].s3.bucket.name; const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' ')); const params = { Bucket: bucket, Key: key, }; try { const { ContentType } = await s3.getObject(params).promise(); console.log('CONTENT TYPE:', ContentType); return ContentType; } catch (err) { console.log(err); const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`; console.log(message); throw new Error(message); } };
Python

例 lambda-function.py

import json import urllib.parse import boto3 print('Loading function') s3 = boto3.client('s3') def lambda_handler(event, context): #print("Received event: " + json.dumps(event, indent=2)) # Get the object from the event and show its content type bucket = event['Records'][0]['s3']['bucket']['name'] key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8') try: response = s3.get_object(Bucket=bucket, Key=key) print("CONTENT TYPE: " + response['ContentType']) return response['ContentType'] except Exception as e: print(e) print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) raise e

在控制台中测试

使用示例 Amazon S3 事件数据手动调用 Lambda 函数。

使用控制台测试 Lambda 函数

  1. Code(代码)选项卡的 Code source(代码源)下,选择 Test(测试)旁边的箭头,然后从下拉列表中选择 Configure test events(配置测试事件)。

  2. Configure test event(配置测试事件)窗口中,执行以下操作:

    1. 选择 Create new test event (新建测试事件)

    2. 对于 Event template(事件模板),选择 Amazon S3 Put (s3-put)。

    3. 对于 Event name(事件名称),输入测试事件的名称。例如:mys3testevent

    4. 在测试事件 JSON 中,将 S3 存储桶名称 (example-bucket) 和对象键 (test/key) 替换为您的存储桶名称和测试文件名。您的测试事件应类似于以下内容:

      { "Records": [ { "eventVersion": "2.0", "eventSource": "aws:s3", "awsRegion": "us-west-2", "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": "my-s3-bucket", "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws-cn:s3:::example-bucket" }, "object": { "key": "HappyFace.jpg", "size": 1024, "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901" } } } ] }
    5. 选择创建

  3. 要使用测试事件调用函数,请在 Code source(代码源)下选择 Test(测试)。

    Execution results(执行结果)选项卡显示响应、函数日志和请求 ID,类似于以下内容:

    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: 'my-s3-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

使用 S3 触发器测试

将文件上传到 Amazon S3 源存储桶时调用函数。

使用 S3 触发器测试 Lambda 函数

  1. 在 Amazon S3 控制台的 Buckets(存储桶)页面上,选择您之前创建的源存储桶的名称。

  2. Upload(上传)页面上,将一些 .jpg 或 .png 图片文件上传到存储桶。

  3. 打开 Lambda 控制台的“函数”页面

  4. 选择您的函数的名称 (my-s3-function)。

  5. 选择 Monitor(监视器)选项卡,然后验证该函数对您上传的每个文件都运行一次。

  6. (可选)要在 CloudWatch 控制台中查看日志,请选择 View logs in CloudWatch(在 CloudWatch 中查看日志)。选择日志流以查看其中一个函数调用的日志输出。

清除资源

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

删除 Lambda 函数

  1. 打开 Lambda 控制台的“函数”页面

  2. 选择您创建的函数。

  3. 依次选择 ActionsDelete

  4. 选择删除

删除 IAM 策略

  1. 在 Amazon Identity and Access Management (IAM) 控制台中打开 Policies(策略)页

  2. 选择 Lambda 为您创建的策略。策略名称以 AWSLambdaS3ExecutionRole- 开头。

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

  4. 选择 Delete

删除执行角色

  1. 打开 IAM 控制台的“角色”页面

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

  3. 选择删除角色

  4. 选择 Yes, delete (是,删除)

删除 S3 存储桶

  1. 打开 Amazon S3 控制台

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

  3. 选择 Delete

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

  5. 选择 Confirm

后续步骤

试用更高级的教程。在本教程中,S3 触发器调用函数来为上传到 S3 存储桶的每个图像文件创建缩略图。本教程需要适度的 Amazon 和 Lambda 领域知识水平。您可以使用 Amazon Command Line Interface (Amazon CLI) 创建资源,然后为函数及其依赖项创建 .zip 文件存档部署包。