【问题标题】:AWS S3 Event notification using Lambda function in Java在 Java 中使用 Lambda 函数的 AWS S3 事件通知
【发布时间】:2017-05-05 06:32:12
【问题描述】:

我正在尝试将 Lambda 函数用于 S3 Put 事件通知。一旦我在我的 S3 存储桶中放置/添加任何新的 JSON 文件,就应该调用我的 Lambda 函数。 我面临的挑战是没有足够的文档来用 Java 实现这样的 Lambda 函数。我发现的大部分文档都是针对 Node.js 的

我想要,我的 Lambda 函数应该被调用,然后在该 Lambda 函数中,我想使用添加的 json,然后将该 JSON 发送到 AWS ES 服务。

但是我应该使用哪些类呢?有人对此有任何想法吗? S3 abd ES 已全部设置并运行。自动生成的 lambda 代码是 `

@Override
public Object handleRequest(S3Event input, Context context) {
    context.getLogger().log("Input: " + input);

    // TODO: implement your handler
    return null;
}

接下来呢??

【问题讨论】:

  • 好吧,开火吧!激活它并上传文件。您需要的第一个“类”只是您的眼球——看看记录的输入。其余的应该在那之后变得明显。输入应该是S3 event notification,告诉您刚刚上传的对象。

标签: java amazon-s3 aws-lambda aws-sdk amazon-elasticsearch


【解决方案1】:

最后,这里是 S3 --> Lambda --> ES 使用 Java 集成的步骤。

  1. 在 AWS 上创建您的 S3、Lamba 和 ES。步骤是here
  2. 在您的 lambda 函数中使用以下 Java 代码来获取 S3 中新添加的对象并将其发送到 ES 服务。

    public Object handleRequest(S3Event input, Context context) {
    AmazonS3Client s3Client = new AmazonS3Client(new DefaultAWSCredentialsProviderChain());        
    
    for (S3EventNotificationRecord record : input.getRecords()) {
        String s3Key = record.getS3().getObject().getKey();
        String s3Bucket = record.getS3().getBucket().getName();
        context.getLogger().log("found id: " + s3Bucket+" "+s3Key);
        // retrieve s3 object
        S3Object object = s3Client.getObject(new GetObjectRequest(s3Bucket, s3Key));
        InputStream objectData = object.getObjectContent();
    
        //Start putting your objects in AWS ES Service
        String esInput = "Build your JSON string here using S3 objectData";
    
        HttpClient httpClient = new DefaultHttpClient();
    
        HttpPut putRequest = new HttpPut(AWS_ES_ENDPOINT + "/{Index_name}/{product_name}/{unique_id}" );
    
        StringEntity input = new StringEntity(esInput);
        input.setContentType("application/json");
        putRequest.setEntity(input);
    
        httpClient.execute(putRequest);
        httpClient.getConnectionManager().shutdown();
    
    }        
    return "success";}
    
  3. 使用 Postman 或 Sense 在 ES 中创建实际索引和对应映射。

  4. 完成后,下载并在您的计算机上运行 proxy.js。确保您设置了post

  5. 中建议的 ES 安全步骤
  6. 通过在您的计算机上运行 http://localhost:9200/_plugin/kibana/ URL 来测试设置和 Kibana。

  7. 一切就绪。继续在 Kibana 中设置仪表板。通过在 S3 存储桶中添加新对象来测试它

【讨论】:

    【解决方案2】:

    可以在 Lambda 中处理 S3 事件,但您必须记住,S3Event 对象仅传输对对象的引用,而不是对象本身。要获取实际对象,您必须自己调用 AWS 开发工具包。 在 lambda 函数中请求 S3 对象如下所示:

    public Object handleRequest(S3Event input, Context context) {
        AmazonS3Client s3Client = new AmazonS3Client(new DefaultAWSCredentialsProviderChain());        
    
        for (S3EventNotificationRecord record : input.getRecords()) {
            String s3Key = record.getS3().getObject().getKey();
            String s3Bucket = record.getS3().getBucket().getName();
            context.getLogger().log("found id: " + s3Bucket+" "+s3Key);
            // retrieve s3 object
            S3Object object = s3Client.getObject(new GetObjectRequest(s3Bucket, s3Key));
            InputStream objectData = object.getObjectContent();
            //insert object into elasticsearch
        }        
        return null;
    }
    

    现在将这个对象插入 ElasticSearch 是相当困难的部分。遗憾的是,AWS SDK 没有为此提供任何功能。默认方法是对 AWS ES 端点进行 REST 调用。关于如何继续调用 ElasticSearch 实例有各种示例。

    有些人似乎选择了以下项目:

    Jest - Elasticsearch Java Rest Client

    【讨论】:

    • 谢谢詹斯。我还完成了较简单的部分并与困难的部分作斗争。尝试仅使用 Jest 向 ES 添加消息。但不知何故,这部分似乎不见了。 Search、get 等所有内容都已显示。但不是添加文档。下面的行是给我错误DocumentMapper documentMapper = new DocumentMapper.Builder("groupId", null, rootObjectMapperBuilder).build(null);
    • 说实话,我从来没有使用过 DocumentMapper,因为这一步只需要执行一次,我通常通过 Kibana GUI 生成我的映射。除此之外,我只使用 API 将文档附加到索引。
    • 感谢您的帮助 Jens。我将 Apache HTTP 用于 REST API,并使用 Postman 创建索引和映射。它正在工作。
    猜你喜欢
    • 2020-03-25
    • 2017-06-06
    • 2017-12-29
    • 1970-01-01
    • 2021-11-21
    • 2022-01-02
    • 2019-07-17
    • 2019-01-03
    • 2021-06-10
    相关资源
    最近更新 更多