当前位置: 首页 > 知识库问答 >
问题:

如何读取直接触发lambda执行的上传文件?

岳正浩
2023-03-14

我当前的AWS设置是一个lambda函数,每当我将一个对象放入S3存储桶时,它就会被触发。我在Java中实现了lambda的处理函数。我想做的只是访问上传的文件,并触发lambda函数的执行。E、 如果我上传样本。对于bucket,我想在我的handler函数中访问这个文件的内容。

我知道我可以这样做:

public Void handleRequest(S3Event input, Context context) {
  for (S3EventNotificationRecord record : input.getRecords()) {
    String key = record.getS3().getObject().getKey();
    String bucket = record.getS3().getBucket().getName();
    AmazonS3 s3Client = new AmazonS3Client(credentials);
    try {
      S3Object s3Object = s3Client.getObject(new GetObjectRequest(bucket, key));
      InputStream input = s3Object.getObjectContent();
      BufferedReader reader = new BufferedReader(new InputStreamReader(input));
      while (true) {
        String line = reader.readLine();
        if (line == null) break;
        // Do something with line...
      }
// ...

问题是我不允许使用访问密钥。因此,我无法创建s3Client来下载文件。换句话说,我必须从处理程序方法采用的参数中获取对象,即S3Event input。我该怎么做?

共有1个答案

齐栋
2023-03-14

如果Lambda函数配置了适当的IAM角色(允许相关s3对象的s3:GetObject),则不需要在代码中显式提供凭据。

下面是示例Java代码,用于获取对象以响应对象上传的Lambda事件:

public class S3GetTextBody implements RequestHandler<S3Event, String> {
    public String handleRequest(S3Event s3event, Context context) {
        try {
            S3EventNotificationRecord record = s3event.getRecords().get(0);
            // Retrieve the bucket & key for the uploaded S3 object that
            // caused this Lambda function to be triggered
            String bkt = record.getS3().getBucket().getName();
            String key = record.getS3().getObject().getKey().replace('+', ' ');
            key = URLDecoder.decode(key, "UTF-8");
            // Read the source file as text
            AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
            String body = s3Client.getObjectAsString(bkt, key);
            System.out.println("Body: " + body);
            return "ok";
        } catch (Exception e) {
            System.err.println("Exception: " + e);
            return "error";
        }
    }
}

进口:

import java.net.URLDecoder;    
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.S3Event;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;
 类似资料:
  • 问题内容: 我正在尝试从在线文本文件中读取一些单词。 我试图做这样的事情 但它没有用,我正在 作为输出,我只想知道所有的话。 我知道他们是在那天教给我的,但是我现在不记得确切怎么做,非常感谢您的帮助。 问题答案: 使用代替来访问不在本地计算机上的任何访问。 实际上,URL甚至在一般情况下甚至对于本地访问(使用URL),jar文件以及可以以某种方式检索的所有内容都非常有用。 上面的方法以您的平台默认

  • 问题内容: 我有一个配置了执行的插件(antrun),该插件具有一个id,并且未绑定到任何阶段。我可以直接从命令行执行此执行吗? 用以下命令运行它: 或者至少 问题答案: 133 此功能已实现为MNG-5768,并且在Maven 3.3.1中可用。 更改将: 扩展直接插件调用语法,以允许可选的@ execution-id参数,例如org.apache.maven.plugins:maven-rem

  • 问题内容: 我的情况是我有一个包含一些文件(txt,png,…)的zip文件,我想直接按它们的名称读取它,我已经测试了以下代码,但没有结果(NullPointerExcepion): resources 是一个包, zipfile 是一个zip文件。 问题答案: 如果您可以确定您的zip文件永远不会打包在另一个jar中,则可以使用以下方法: 要么: 否则,您的选择是: 使用ZipInputStre

  • 我试图弄清楚是否有可能在<代码> 更具体地说,我有几个多模块项目继承了我们公司范围内的母公司pom。在<代码> 在对一个儿童项目进行了数小时的实验后,我想: 避免在所有模块中执行不必要的拷贝回写,当我在父POM中定义执行拷贝回写时会发生这种情况,并且有在所有模块中创建目标文件夹层次结构的缺点 避免在父POM中未定义执行的情况下,在需要的所有模块中的多个克隆副本中定义执行 一个示例子项目包含以下模块

  • 问题内容: 我希望用户上传一个.csv文件,然后让浏览器能够解析该文件中的数据。我正在使用ReactJS。这将如何运作?谢谢。 问题答案: 弄清楚了。的组合反应文件阅读器和HTML5的的FileReader(见本页)。 将react-file-reader位放在render内部: 然后在上面。

  • 我需要上传一个文件并读取内容,使用spring mvc很容易,但使用spring webflux,我不知道如何处理FilePart和DataBuffer流量 我期待着这样的回报: