云计算-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;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/658099.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32_HAL_使用FPEC实现闪存的读写

STM32的FLASH结构 主存储器&#xff08;Main Memory&#xff09;&#xff1a;这是STM32中最大的存储区域&#xff0c;用于存储用户的程序代码、常量数据以及程序运行时不变的数据。STM32的主存储器通常被组织为多个扇区&#xff08;sector&#xff09;&#xff0c;每个扇区的大…

项目十三:搜狗——python爬虫实战案例

根据文章项目十二&#xff1a;简单的python基础爬虫训练-CSDN博客的简单应用&#xff0c;这一次来升级我们的技术&#xff0c;那么继续往下看&#xff0c;希望对技术有好运。 还是老样子&#xff0c;按流程走&#xff0c;一条龙服务&#xff0c;嘿嘿。 第一步&#xff1a;导入…

git 学习随笔

git 学习随笔 基本概念 git 对待数据类似快照流的形式而不是类似 cvs 那样的纪录文件随时间逐步积累的差异 git 中所有数据在存储钱都会计算校验和&#xff08;hash) 三种状态&#xff1a;已提交(committed)&#xff0c;已修改(modified)&#xff0c;已暂存(staged)。 add…

20240528解决飞凌的OK3588-C的核心板可以刷机不能连接ADB的问题

20240528解决飞凌的OK3588-C的核心板可以刷机不能连接ADB的问题 2024/5/28 16:34 OS&#xff1a;Linux R4/Buildroot 硬件接了3条线出来&#xff0c;一直可以刷机&#xff0c;但是链接ADB异常。 【总是链接不上】 Z:\OK3588_Linux_fs\kernel\arch\arm64\boot\dts\rockchip\OK3…

防火墙如何端口映射?

防火墙端口映射&#xff08;Firewall Port Mapping&#xff09;是一种网络技术&#xff0c;通过对防火墙配置进行调整&#xff0c;允许外部网络用户访问内部网络中的指定端口。该技术使得外部用户可以通过公共网络访问内部网络中的特定服务或应用程序&#xff0c;从而实现远程访…

HackTheBox-Machines--Beep

Beep测试过程 1 信息收集 nmap端口扫描 gryphonwsdl ~ % nmap -sC -sV 10.129.137.179 Starting Nmap 7.94 ( https://nmap.org ) at 2024-05-28 14:39 CST Nmap scan report for 10.129.229.183 Host is up (0.28s latency). Not shown: 988 closed tcp ports (conn-refused…

【微服务】部署mysql集群,主从复制,读写分离

两台服务器做如下操作 1.安装mysqldocker pull mysql:5.72.启动以及数据挂载 mkdir /root/mysql/data /root/mysql/log /root/mysql/conf touch my.conf //mysql的配置文件docker run --name mysql \ -e MYSQL_ROOT_PASSWORD123456 \ -v /root/mysql/data:/var/lib/mysql \ -v…

FaceChain-FACT:开源10秒写真生成,复用海量LoRa风格,基模友好型写真应用

github开源地址&#xff1a;https://github.com/modelscope/facechain/tree/main/facechain_adapter 魔搭创空间应用体验&#xff1a;魔搭社区 一、效果演示 FaceChain FACT的代码和模型目前已经在github和modelscope创空间上同步开源。FaceChain FACT具有简单的交互式界面设…

Rohm公司参展欧洲PCI盛会

​德国历史悠久的文化名城纽伦堡&#xff0c;即将迎来一场科技盛宴——欧洲PCI展览会。在这个为期三天的盛会中&#xff08;6月11日至13日&#xff09;&#xff0c;Rohm公司将以璀璨之姿&#xff0c;特别聚焦宽带隙&#xff08;WBG&#xff09;设备的璀璨光芒。 此次&#xff0…

linux安装srs

获取srs cd /opt git clone -b 4.0release https://gitee.com/ossrs/srs.git cd srs/trunk 启动srs ./objs/srs -c conf/srs.conf ./etc/init.d/srs status 访问http://192.168.220.146:8080/出现下方图片说明安装成功 点击进入SRS控制台看到下方图片

AI视频教程下载:使用ChatGPT进行商务写作

你将学到什么&#xff1f; 学习如何将ChatGPT集成到你的写作过程中&#xff0c;并有效地将其用作商务写作的个人写作助手。 学习如何使用ChatGPT生成想法&#xff0c;提高你的书面沟通的结构、清晰度和连贯性。 你将学习使用ChatGPT的最佳实践&#xff0c;包括如何自定义其设…

【Flutter】显式动画

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Flutter学习 &#x1f320; 首发时间&#xff1a;2024年5月29日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 目…

k8s群集调度之 pod亲和 node亲和 标签指定

目录 一 调度约束 1.1K8S的 List-Watch 机制 ⭐⭐⭐⭐⭐ 1.1.1Pod 启动典型创建过程 二、调度过程 2.1Predicate&#xff08;预选策略&#xff09; 常见的算法 2.2priorities&#xff08;优选策略&#xff09;常见的算法 三、k8s将pod调度到指定node的方法 3.1指…

FPGA中的乒乓操作

为什么不直接选用一个缓存更大的FIFO而选用乒乓操作为什么乒乓操作可以实现低速处理高速数据乒乓操作适用哪些场景 一、乒乓操作结构 首先先介绍一下乒乓操作的原理&#xff0c;其结构如下&#xff1a; 输入选择单元负责将数据送到数据缓冲模块&#xff0c;然后输出选择单元负…

网络工程师---第四十三天

1、网络地址转换请简述DNS服务器迭代查询与递归的区别&#xff1f; 2、请从技术方面简述RAIDO、RAID1、RAID3、 RAID5的特点&#xff1f; 3、请从层次结构、部署设备和功能配置方面描述层次化的网络结构&#xff1f; 4、请简述IPSECVPN和AH和ESP的区别&#xff1f; 5、请简述ID…

用友U8 Cloud linkntb.jsp SQL注入漏洞复现(CNVD-C-2023-708748)

0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP,主要聚焦成长型、创新型企业,提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友U8 Cloud linkntb.jsp 接口处存在SQL注入漏洞,未授权的攻击者可通过此漏洞获取数据库权限,从而盗取用户数据,造成用户信息泄露。 0x…

vue组件的基本使用方法

组件 【1】组件是什么&#xff1f; 组件就是&#xff1a;扩展 HTML 元素&#xff0c;封装可重用的代码&#xff0c;目的是复用例如&#xff1a;有一个轮播图&#xff0c;可以在很多页面中使用&#xff0c;一个轮播有js&#xff0c;css&#xff0c;html组件把js&#xff0c;cs…

[java基础揉碎]文件IO流

目录 文件 什么是文件 文件流​编辑 常用的文件操作 创建文件方式一 创建文件方式二 创建文件方式三 tip:为什么new file 了还有执行createNewFile?new File的时候其实是在内存中创建了文件对象, 还没有在磁盘中, 当执行createNewFile的时候才是往磁盘中写入​编辑 …

Golang 创建第一个web项目(Gin + Gorm)

1. 写这篇博客的由来&#xff1a; 当你想使用最快的框架创建项目的时候是不是有点束手无策&#xff1f; 当你想配置数据库写 SQL 甚至不知道如何写&#xff0c;文件夹都不知道建在哪里&#xff1f; &#x1f604;因为Golang 目前并没有 JAVA 那种硬性规范&#xff0c;但是…

基于JCEF实现网页资源性能分析

文章目录 1、需求2、实现代码3、运行效果 1、需求 在使用chrome浏览器访问页面时&#xff0c;浏览器自带的开发者工具可以查看页面每个资源的资源大小和加载时间。 这个功能可以让我们直接知道接口或资源的耗时情况和大小情况&#xff0c;如果存在性能问题&#xff0c;可以进…