云计算-Lambda事件 (Lambda Events)

news2024/12/22 20:59:07

检索事件信息 (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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp一些问题解决

1.按钮边框如何去除&#xff1f; 参考博主&#xff1a;微信小程序按钮去不掉边框_微信小程序button去掉边框-CSDN博客文章浏览阅读1k次。最近在学uni-app&#xff0c;顺便自己写个小程序。左上角放了个button&#xff0c;可边框怎么也去不掉…原来微信小程序的按钮要去掉边框要…

基于 Solana 的 Drift Protocol 快速崛起,重新定义去中心化衍生品市场

随着区块链技术的快速发展&#xff0c;加密市场的格局正在悄然改变。投资者对透明度、效率和去中心化的需求愈发强烈&#xff0c;之前完全由中心化交易主导的加密货币交易&#xff0c;开始向链上转移。 根据 Coingecko 的最新数据&#xff0c;CEX 和 DEX 的现货交易量已经达到了…

凤香的“蜜”密

执笔 | 文 清 编辑 | 古利特 “遇水则漏&#xff0c;遇酒生香”。酒海&#xff0c;一种大型盛酒容器&#xff0c;因盛酒量以“吨”计算&#xff0c;故称“海”&#xff0c;传于唐宋&#xff0c;兴盛于明清&#xff0c;距今有1400多年的历史。文人墨客笔下&#xff0c;也多有…

xjar加密springboot的jar包,并编译为执行程序

场景&#xff1a;当前项目需要进行jar包部署在windows环境和linux环境&#xff0c;并要求使用xjar加密。 1. xjar加密 源码程序自行搜索&#xff0c;这里只介绍加密及运行&#xff0c;运行加密程序&#xff0c;指定jar包&#xff0c;输入密码 2. 加密后的目录 3. go程序编译 …

AI图书推荐:基于ChatGPT API和Python开发应用程序的详细指南

ChatGPT已经以其革命性的能力引起了人们的关注&#xff0c;利用其API可能会成为你的游戏规则改变者。这不仅仅是关于编码&#xff1b;它是关于为您的创作添加一层智能&#xff0c;将它们提升到之前无法想象的水平。《基于ChatGPT API和Python开发应用程序的详细指南》&#xff…

Git——pull request详细教程

当我们需要协助其他仓库完成更改时&#xff0c;往往会用到git中的Pull Request操作&#xff0c;从而方便团队的协作管理和代码持续集成。 下面是详细的教程步骤。 一. Fork目标项目 比如说我现在要fork以下Qwen-VL的项目&#xff0c;如图所示&#xff1a; 随后点击Create即可…

操作系统—简要分析FAT文件系统

文章目录 简要分析FAT文件系统1.FAT的起源与发展历史2.FAT的基本结构与目录管理机制(1).基本结构(2).文件分配表(3).根目录区(4).数据区 3.优点与缺点4.改进与替代方案(1).exFAT(2).ext2/3/4(3).NTFS 小结参考文献 简要分析FAT文件系统 1.FAT的起源与发展历史 为了更好地管理磁…

柬埔寨语翻译通App,一款真正实现高棉语翻译、语音识别和中柬双语无障碍交流的应用程序。

柬埔寨语翻译通App&#xff0c;一款真正实现高棉语翻译、语音识别和中柬双语无障碍交流的应用程序。它不仅提供文字、语音、图片的翻译&#xff0c;还融入了柬埔寨文化元素&#xff0c;让你在每一次翻译中都能感受到柬埔寨的文化魅力。 这款App支持中文、高棉语双语互译&#x…

LeetCode //C - 143. Reorder List

143. Reorder List You are given the head of a singly linked-list. The list can be represented as: L0 → L1 → … → Ln - 1 → Ln Reorder the list to be on the following form: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … You may not modify the values i…

[图解]企业应用架构模式2024新译本讲解03-事务脚本+表数据入口

1 00:00:00,570 --> 00:00:06,290 这里先创建一个service的对象 2 00:00:07,000 --> 00:00:12,470 然后调用对象的方法、操作 3 00:00:12,480 --> 00:00:13,750 就是事务脚本 4 00:00:14,700 --> 00:00:15,900 然后参数是1 5 00:00:16,660 --> 00:00:19,490…

618有什么宠物空气净化器推荐?希喂FreAir Lite宠物空气净化器真实体验

一、宠物空气净化器的必要性 掉毛季又来了&#xff0c;猫咪的毛发满天飞&#xff0c;怎么办&#xff1f;我家里的猫咪一到换毛季就掉满地的毛发&#xff0c;尤其喜欢在家里奔跑打闹&#xff0c;结果整个房间都是毛。为了减少家里空气中的浮毛&#xff0c;你都做过哪些努力呢&a…

Shell编程用户注册及登录

需求&#xff1a; 用Shell编程完成用户的注册及登录 完成 注册用户 用户名首字母大写 密码需8个字符及以上且含“$”,“&”,“-”中的任意一个手机号需以139开头的11位号码邮箱需以数字开头的qq.com 2.检测重复注册 3.注册信息写入/etc/secfinfe 4.用户登录 5.检测是否存…

SQLI-labs-第二十七关和第二十七a关

目录 第二十七关 1、判断注入点 2、判断数据库 3、判断表名 第二十七a关 第二十七关 知识点&#xff1a;空格、select、union等过滤绕过 思路&#xff1a; 通过分析源码&#xff0c;我们可以知道对用户的输入进行过滤&#xff0c;对空格、select、union等进行了过滤&…

钡铼PLC集成BL121PO协议网关优化电子制造产线的生产效率

PLC转OPC UA协议转换网关BL121PO在电子制造产线中的优化应用&#xff0c;可以显著提高生产效率&#xff0c;促进生产线的智能化和信息化发展。本文将从以下几个方面进行阐述&#xff1a; 提高设备间通信效率&#xff1a;PLC转OPC UA协议转换网关BL121PO通过高效的协议转换&…

Docker-02-02 Docker离线下载安装与配置(linux)

一、Docker下载 官网下载地址:Index of linux/static/stable/x86_64/ (docker.com) 推荐下载最新的社区版: 二、将安装包上传至服务器并解压 将安装包上传至服务器的/usr/local目录并解压 cd /usr/local lstar -zxvf docker-18.06.3-ce.tgz三、将docker目录下的文件复制到…

ubuntu安全加固

知识背景&#xff1a; 项目背景&#xff1a; 常用命令&#xff1a; useradd: adduser: getent passwd: getent group: id username: adduser newname sudo: sudo userdel <username> sudo rm -rf /home/<username> userdel groupdel 修改shell为/bin…

防止自动化攻击的最佳实践

防止自动化攻击的最佳实践 在当今的网络安全环境中&#xff0c;保护用户账户免受自动化攻击已成为每个网站和应用程序的重要任务。攻击者可以利用多种不同类型的自动化攻击来尝试破坏用户账户。本文将详细介绍常见的攻击类型及其防御机制&#xff0c;帮助您更好地保护用户账户…

基于PHP+MySQL组合开发的720VR全景小程序源码系统 一键生成三维实景 前后端分离带网站的安装代码包以及搭建教程

系统概述 这款源码系统是专门为实现 720VR 全景展示而设计的。它结合了先进的技术和创新的理念&#xff0c;能够将真实场景以全景的形式呈现给用户&#xff0c;让用户仿佛身临其境。该系统采用 PHP 进行后端开发&#xff0c;MySQL 作为数据库管理系统&#xff0c;确保了系统的…

IC618 虚拟机 EDA Calibre2019 Hspice2018 Spectre19.1

虚拟机包含 CentOS 7.9 Cadence IC618 Calibre 2019 Hspice 2018 Spectre19.1 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1aMtPO2G5ad-x5BtIJjCDig?pwdxcii 提取码&#xff1a;xcii

K8s证书过期处理

问题描述 本地有一个1master2worker的k8s集群&#xff0c;今天启动VMware虚拟机之后发现api-server没有起来&#xff0c;docker一直退出&#xff0c;这个集群是使用kubeadm安装的。 于是kubectl logs查看了日志&#xff0c;发现证书过期了 解决方案&#xff1a; 查看证书 #…