提问者:小点点

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


我正在尝试将Lambda函数用于S3 Put事件通知。在S3存储桶中放入/添加任何新JSON文件后,应该调用Lambda函数。我面临的挑战是没有足够的文档来实现Java中的Lambda函数。我找到的大多数文档都是针对节点的。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;
}

接下来呢??


共2个答案

匿名用户

在Lambda中处理S3事件是可以完成的,但是您必须记住,S3事件对象只传输对对象的引用,而不是对象本身。要获得实际对象,您必须自己调用AWS SDK。在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客户端

匿名用户

最后,这里是S3的步骤--

>

  • 在AWS上创建S3、Lamba和ES。这里有台阶
  • 在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";}
    

    使用Postman或Sense创建实际索引

    完成后,下载并在计算机上运行proxy.js。请确保您设置了这篇文章中建议的ES安全步骤

    通过在计算机上运行http://localhost:9200/_plugin/kibana/URL来测试设置和Kibana。

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