Java 中使用 Lambda 函数的 AWS S3 事件通知

AWS S3 Event notification using Lambda function in Java

我正在尝试将 Lambda 函数用于 S3 Put 事件通知。一旦我 put/add 我的 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;
}

接下来呢??

可以在 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

最后,这里是 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 on your machine. Make sure you setup ES Security steps suggested in this post

  5. 在您的机器上 运行ning http://localhost:9200/_plugin/kibana/ URL 测试设置和 Kibana。

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