云计算-Lambda事件 (Lambda Events)

检索事件信息 (Retrieving Event Information)

在上一个主题中,我们已经看到了如何创建一个Lambda函数、添加handler、添加触发器和配置执行策略。在本主题中,我们将对其进行扩展。到目前为止,我们看到的handler应用非常简单,但我们可以在handler中做很多事情。例如,我们可以提取S3事件的详细信息(桶名称、键)。我们将看到一个示例,在这个示例中,我们将使用Lambda函数执行以下操作。由于我们当前的Lambda函数配置了一个用于所有"对象创建事件"的S3触发器,我们的目标是执行以下操作:

  • 读取桶名称
  • 读取键(对象/文件的名称)
  • 读取对象的内容(我们将在下一节中看到)

我们创建的handler需要读取触发handler的桶的详细信息和相应的键。接下来,handler将读取桶中"键"文件的内容。读取的"键"文件的内容不是直接的字符串格式,我们需要将其转换为字符串。为此,我们需要添加以下依赖项:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>

首先,让我们看看如何检索桶信息。我们需要导入以下类。在上一个主题中使用了"Context"和"S3Event"类。

import com.amazonaws.services.lambda.runtime.Context; 
import com.amazonaws.services.lambda.runtime.events.S3Event;
import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;

我们的handler将如下所示:

public String myHandler(S3Event event, Context context) {            
    String bucket = "";
    String key = "";

    for (S3EventNotificationRecord record : event.getRecords()) {
        key = record.getS3().getObject().getKey();
        bucket = record.getS3().getBucket().getName();
        context.getLogger().log("Bucket information: Bucket: " + bucket + ", Key: " + key);
    }
}

我们的handler将有两个输入参数:"S3Event"类型和"Context"类型。"S3Event"对象将仅保存引用,而不是实际的事件对象。我们必须使用AWS SDK来访问事件对象。我们使用"S3EventNotificationRecord"对象从S3事件中提取所有记录。然后使用"getBucket()"和"getKey()"方法提取有关桶和相应键的信息。使用"getLogger()"方法记录桶和键的详细信息。

日志如下图所示。

活动19 (教程活动)

为Lambda函数添加一个S3触发器,用于"创建对象"事件。 在Cloud9中更新handler代码,使其接收来自S3的事件通知。 handler应从事件通知中检索桶和键信息,并将其添加为日志条目。 使用新的handler JAR文件更新Lambda函数。

参考代码:

package au.edu.scu.app;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.events.S3Event;
import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;

public class App 
{
    public String myHandler(S3Event event, Context context) {            
        String bucket = "";
        String key = "";

        for (S3EventNotificationRecord record : event.getRecords()) {
            key = record.getS3().getObject().getKey();
            bucket = record.getS3().getBucket().getName();
            context.getLogger().log("Bucket information: Bucket: " + bucket + ", Key: " + key);
        }
        
        return null;
    }
}
读取对象内容 (Reading Object Content)

在上一节中,我们已经看到如何检索桶和键信息。一旦我们知道了桶名称和键,我们可以扩展功能来读取对象的内容。为此,我们需要添加以下类。

import com.amazonaws.services.lambda.runtime.Context; 
import com.amazonaws.services.lambda.runtime.events.S3Event;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;

import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.GetObjectRequest;
import org.apache.commons.io.IOUtils;
import java.io.InputStream;

我们的handler现在将包含以下代码:

public String myHandler(S3Event event, Context context) {
    try {
        AmazonS3Client s3 = new AmazonS3Client(new DefaultAWSCredentialsProviderChain());
        
        String bucket = "";
        String key = "";
        
        for (S3EventNotificationRecord record : event.getRecords()) {
            key = record.getS3().getObject().getKey();
            bucket = record.getS3().getBucket().getName();
            context.getLogger().log("Bucket information: Bucket: " + bucket + ", Key: " + key);
        }
        
        S3Object s3Object = s3.getObject(new GetObjectRequest(bucket, key));
        InputStream objectData = s3Object.getObjectContent();
        
        String content = IOUtils.toString(objectData, "UTF-8");
        context.getLogger().log("Content in the object: " + content);
    } catch(Exception exp) {
        System.out.println("error occurred");
    }
    
    return null;
}

我们首先创建一个"AmazonS3Client"对象。现在我们使用"getObject()"方法,用我们刚刚提取的桶和键信息创建一个"S3Object"对象。使用"S3Object"对象,创建一个"InputStream"类对象来检索"键"文件中的内容。然后我们使用"IOUtils"类的实例将输入流转换为字符串。

其余过程与我们之前看到的一样。我们使用这个新的JAR文件更新Lambda函数。我们可以通过将一个简单的txt文件上传到指定的桶中轻松测试它。

活动20 (教程活动)

更新您的handler,使您的Lambda函数能够在收到"对象创建"通知时检索S3对象的内容。

您的handler应将对象的内容保存为日志条目。

使用新的handler JAR更新您的Lambda函数。

通过上传包含字符串"Welcome to PROG2003 Cloud Systems Development"的.txt文件来测试您的Lambda函数。

参考代码:

package au.edu.scu.app;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.events.S3Event;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.GetObjectRequest;
import org.apache.commons.io.IOUtils;

import java.io.InputStream;

public class App 
{
    public String myHandler(S3Event event, Context context) {
        try {
            AmazonS3Client s3 = new AmazonS3Client(new DefaultAWSCredentialsProviderChain());
            
            String bucket = "";
            String key = "";
            
            for (S3EventNotificationRecord record : event.getRecords()) {
                key = record.getS3().getObject().getKey();
                bucket = record.getS3().getBucket().getName();
                context.getLogger().log("Bucket information: Bucket: " + bucket + ", Key: " + key);
            }
            
            S3Object s3Object = s3.getObject(new GetObjectRequest(bucket, key));
            InputStream objectData = s3Object.getObjectContent();
            
            String content = IOUtils.toString(objectData, "UTF-8");
            context.getLogger().log("Content in the object: " + content);
        } catch (Exception exp) {
            context.getLogger().log("Error occurred: " + exp.getMessage());
        }
        
        return null;
    }
}

活动21 (教程活动)

更新您的handler方法,使其现在能够从S3桶中读取JSON对象。假设JSON对象是一个"Unit"对象,内容为{"Id": 305, "UnitName": "Programming Cloud Systems", "UnitCode": "PROG2003"}。

您的handler应解析JSON对象,并读取"Id"、"UnitName"和"UnitCode"字段的值。

创建一个新的名为"Unit"的DynamoDB表,主键为"Id" - 数字类型,"UnitName"和"UnitCode" - 字符串类型。

您的handler应插入一个具有从JSON对象解析的字段值的项目。

使用新的handler JAR更新您的Lambda函数,并通过将包含上述条目的.json文件上传到S3桶来测试Lambda函数。

使用"org.json"包(https://mvnrepository.com/artifact/org.json/json)来实现此功能。有关JSONObject类的描述,请参见:http://stleary.github.io/JSON-java/index.html

参考代码:

package au.edu.scu.app;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.events.S3Event;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.model.PutItemRequest;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import org.apache.commons.io.IOUtils;
import org.json.JSONObject;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

public class App 
{
    public String myHandler(S3Event event, Context context) {
        try {
            AmazonS3Client s3 = new AmazonS3Client(new DefaultAWSCredentialsProviderChain());
            AmazonDynamoDBClient dynamoDB = new AmazonDynamoDBClient(new DefaultAWSCredentialsProviderChain());
            
            String bucket = "";
            String key = "";
            
            for (S3EventNotificationRecord record : event.getRecords()) {
                key = record.getS3().getObject().getKey();
                bucket = record.getS3().getBucket().getName();
                context.getLogger().log("Bucket information: Bucket: " + bucket + ", Key: " + key);
            }
            
            S3Object s3Object = s3.getObject(new GetObjectRequest(bucket, key));
            InputStream objectData = s3Object.getObjectContent();
            
            String content = IOUtils.toString(objectData, "UTF-8");
            context.getLogger().log("Content in the object: " + content);
            
            JSONObject json = new JSONObject(content);
            int id = json.getInt("Id");
            String unitName = json.getString("UnitName");
            String unitCode = json.getString("UnitCode");

            Map<String, AttributeValue> item = new HashMap<>();
            item.put("Id", new AttributeValue().withN(Integer.toString(id)));
            item.put("UnitName", new AttributeValue().withS(unitName));
            item.put("UnitCode", new AttributeValue().withS(unitCode));

            PutItemRequest putItemRequest = new PutItemRequest().withTableName("Unit").withItem(item);
            dynamoDB.putItem(putItemRequest);
            
        } catch (Exception exp) {
            context.getLogger().log("Error occurred: " + exp.getMessage());
        }
        
        return null;
    }
}
相关推荐
凌云行者21 分钟前
使用rust写一个Web服务器——单线程版本
服务器·前端·rust
小小娥子27 分钟前
Redis的基础认识与在ubuntu上的安装教程
java·数据库·redis·缓存
DieSnowK28 分钟前
[Redis][集群][下]详细讲解
数据库·redis·分布式·缓存·集群·高可用·新手向
光通信学徒44 分钟前
ubuntu图形界面右上角网络图标找回解决办法
linux·服务器·ubuntu·信息与通信·模块测试
wusam1 小时前
螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习03(网络及IP规划)
运维·服务器·网络·docker·容器
你会发光哎u1 小时前
Webpack模式-Resolve-本地服务器
服务器·前端·webpack
-XWB-1 小时前
【MySQL】数据目录迁移
数据库·mysql
老华带你飞1 小时前
公寓管理系统|SprinBoot+vue夕阳红公寓管理系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·spring boot·课程设计
小飞猪Jay1 小时前
面试速通宝典——10
linux·服务器·c++·面试
我明天再来学Web渗透1 小时前
【hot100-java】【二叉树的层序遍历】
java·开发语言·数据库·sql·算法·排序算法