云盘算-Lambda事件 (Lambda Events)

打印 上一主题 下一主题

主题 552|帖子 552|积分 1656

检索事件信息 (Retrieving Event Information)

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


  • 读取桶名称
  • 读取键(对象/文件的名称)
  • 读取对象的内容(我们将在下一节中看到)
        我们创建的handler必要读取触发handler的桶的详细信息和相应的键。接下来,handler将读取桶中“键”文件的内容。读取的“键”文件的内容不是直接的字符串格式,我们必要将其转换为字符串。为此,我们必要添加以下依赖项:
  1. <dependency>
  2.     <groupId>commons-io</groupId>
  3.     <artifactId>commons-io</artifactId>
  4.     <version>2.5</version>
  5. </dependency>
复制代码
        首先,让我们看看如何检索桶信息。我们必要导入以下类。在上一个主题中利用了“Context”和“S3Event”类。
  1. import com.amazonaws.services.lambda.runtime.Context;
  2. import com.amazonaws.services.lambda.runtime.events.S3Event;
  3. import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;
  4. import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
复制代码
        我们的handler将如下所示:
  1. public String myHandler(S3Event event, Context context) {            
  2.     String bucket = "";
  3.     String key = "";
  4.     for (S3EventNotificationRecord record : event.getRecords()) {
  5.         key = record.getS3().getObject().getKey();
  6.         bucket = record.getS3().getBucket().getName();
  7.         context.getLogger().log("Bucket information: Bucket: " + bucket + ", Key: " + key);
  8.     }
  9. }
复制代码
        我们的handler将有两个输入参数:“S3Event”类型和“Context”类型。“S3Event”对象将仅生存引用,而不是实际的事件对象。我们必须利用AWS SDK来访问事件对象。我们利用“S3EventNotificationRecord”对象从S3事件中提取所有记载。然后利用“getBucket()”和“getKey()”方法提取有关桶和相应键的信息。利用“getLogger()”方法记载桶和键的详细信息。
        日记如下图所示。

活动19 (教程活动)

        为Lambda函数添加一个S3触发器,用于“创建对象”事件。 在Cloud9中更新handler代码,使其接收来自S3的事件关照。 handler应从事件关照中检索桶和键信息,并将其添加为日记条目。 利用新的handler JAR文件更新Lambda函数。
        参考代码:
  1. package au.edu.scu.app;
  2. import com.amazonaws.services.lambda.runtime.Context;
  3. import com.amazonaws.services.lambda.runtime.events.S3Event;
  4. import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;
  5. public class App
  6. {
  7.     public String myHandler(S3Event event, Context context) {            
  8.         String bucket = "";
  9.         String key = "";
  10.         for (S3EventNotificationRecord record : event.getRecords()) {
  11.             key = record.getS3().getObject().getKey();
  12.             bucket = record.getS3().getBucket().getName();
  13.             context.getLogger().log("Bucket information: Bucket: " + bucket + ", Key: " + key);
  14.         }
  15.         
  16.         return null;
  17.     }
  18. }
复制代码
读取对象内容 (Reading Object Content)

        在上一节中,我们已经看到如何检索桶和键信息。一旦我们知道了桶名称和键,我们可以扩展功能来读取对象的内容。为此,我们必要添加以下类。
  1. import com.amazonaws.services.lambda.runtime.Context;
  2. import com.amazonaws.services.lambda.runtime.events.S3Event;
  3. import com.amazonaws.services.s3.AmazonS3Client;
  4. import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;
  5. import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
  6. import com.amazonaws.services.s3.model.S3Object;
  7. import com.amazonaws.services.s3.model.GetObjectRequest;
  8. import org.apache.commons.io.IOUtils;
  9. import java.io.InputStream;
复制代码
        我们的handler现在将包罗以下代码:
  1. public String myHandler(S3Event event, Context context) {
  2.     try {
  3.         AmazonS3Client s3 = new AmazonS3Client(new DefaultAWSCredentialsProviderChain());
  4.         
  5.         String bucket = "";
  6.         String key = "";
  7.         
  8.         for (S3EventNotificationRecord record : event.getRecords()) {
  9.             key = record.getS3().getObject().getKey();
  10.             bucket = record.getS3().getBucket().getName();
  11.             context.getLogger().log("Bucket information: Bucket: " + bucket + ", Key: " + key);
  12.         }
  13.         
  14.         S3Object s3Object = s3.getObject(new GetObjectRequest(bucket, key));
  15.         InputStream objectData = s3Object.getObjectContent();
  16.         
  17.         String content = IOUtils.toString(objectData, "UTF-8");
  18.         context.getLogger().log("Content in the object: " + content);
  19.     } catch(Exception exp) {
  20.         System.out.println("error occurred");
  21.     }
  22.    
  23.     return null;
  24. }
复制代码
        我们首先创建一个“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函数。
        参考代码:
  1. package au.edu.scu.app;
  2. import com.amazonaws.services.lambda.runtime.Context;
  3. import com.amazonaws.services.lambda.runtime.events.S3Event;
  4. import com.amazonaws.services.s3.AmazonS3Client;
  5. import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;
  6. import com.amazonaws.services.s3.model.S3Object;
  7. import com.amazonaws.services.s3.model.GetObjectRequest;
  8. import org.apache.commons.io.IOUtils;
  9. import java.io.InputStream;
  10. public class App
  11. {
  12.     public String myHandler(S3Event event, Context context) {
  13.         try {
  14.             AmazonS3Client s3 = new AmazonS3Client(new DefaultAWSCredentialsProviderChain());
  15.             
  16.             String bucket = "";
  17.             String key = "";
  18.             
  19.             for (S3EventNotificationRecord record : event.getRecords()) {
  20.                 key = record.getS3().getObject().getKey();
  21.                 bucket = record.getS3().getBucket().getName();
  22.                 context.getLogger().log("Bucket information: Bucket: " + bucket + ", Key: " + key);
  23.             }
  24.             
  25.             S3Object s3Object = s3.getObject(new GetObjectRequest(bucket, key));
  26.             InputStream objectData = s3Object.getObjectContent();
  27.             
  28.             String content = IOUtils.toString(objectData, "UTF-8");
  29.             context.getLogger().log("Content in the object: " + content);
  30.         } catch (Exception exp) {
  31.             context.getLogger().log("Error occurred: " + exp.getMessage());
  32.         }
  33.         
  34.         return null;
  35.     }
  36. }
复制代码
        活动21 (教程活动)
        更新您的handler方法,使其现在能够从S3桶中读取JSON对象。假设JSON对象是一个"Unit"对象,内容为{"Id": 305, "UnitName": "rogramming Cloud Systems", "UnitCode": "ROG2003"}。
        您的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。
        参考代码:
  1. package au.edu.scu.app;
  2. import com.amazonaws.services.lambda.runtime.Context;
  3. import com.amazonaws.services.lambda.runtime.events.S3Event;
  4. import com.amazonaws.services.s3.AmazonS3Client;
  5. import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;
  6. import com.amazonaws.services.s3.model.S3Object;
  7. import com.amazonaws.services.s3.model.GetObjectRequest;
  8. import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
  9. import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
  10. import com.amazonaws.services.dynamodbv2.model.PutItemRequest;
  11. import com.amazonaws.services.dynamodbv2.model.AttributeValue;
  12. import org.apache.commons.io.IOUtils;
  13. import org.json.JSONObject;
  14. import java.io.InputStream;
  15. import java.util.HashMap;
  16. import java.util.Map;
  17. public class App
  18. {
  19.     public String myHandler(S3Event event, Context context) {
  20.         try {
  21.             AmazonS3Client s3 = new AmazonS3Client(new DefaultAWSCredentialsProviderChain());
  22.             AmazonDynamoDBClient dynamoDB = new AmazonDynamoDBClient(new DefaultAWSCredentialsProviderChain());
  23.             
  24.             String bucket = "";
  25.             String key = "";
  26.             
  27.             for (S3EventNotificationRecord record : event.getRecords()) {
  28.                 key = record.getS3().getObject().getKey();
  29.                 bucket = record.getS3().getBucket().getName();
  30.                 context.getLogger().log("Bucket information: Bucket: " + bucket + ", Key: " + key);
  31.             }
  32.             
  33.             S3Object s3Object = s3.getObject(new GetObjectRequest(bucket, key));
  34.             InputStream objectData = s3Object.getObjectContent();
  35.             
  36.             String content = IOUtils.toString(objectData, "UTF-8");
  37.             context.getLogger().log("Content in the object: " + content);
  38.             
  39.             JSONObject json = new JSONObject(content);
  40.             int id = json.getInt("Id");
  41.             String unitName = json.getString("UnitName");
  42.             String unitCode = json.getString("UnitCode");
  43.             Map<String, AttributeValue> item = new HashMap<>();
  44.             item.put("Id", new AttributeValue().withN(Integer.toString(id)));
  45.             item.put("UnitName", new AttributeValue().withS(unitName));
  46.             item.put("UnitCode", new AttributeValue().withS(unitCode));
  47.             PutItemRequest putItemRequest = new PutItemRequest().withTableName("Unit").withItem(item);
  48.             dynamoDB.putItem(putItemRequest);
  49.             
  50.         } catch (Exception exp) {
  51.             context.getLogger().log("Error occurred: " + exp.getMessage());
  52.         }
  53.         
  54.         return null;
  55.     }
  56. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表