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

NGR*_*NGR 10 java amazon-s3 aws-sdk aws-lambda amazon-elasticsearch

我正在尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)

接下来是什么??

jen*_*ter 9

可以在Lambda中处理S3事件,但必须记住,S3Event对象只传输对象的引用而不是对象本身.要获取实际对象,您必须自己调用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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jest - Elasticsearch Java Rest Client


NGR*_*NGR 5

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

  1. 在AWS上创建S3,Lamba和ES。步骤在这里
  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";}
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用Postman或Sense在ES中创建实际索引和相应的映射。

  4. 完成后,下载并在您的计算机上运行proxy.js。确保你安装ES安全步骤建议在这个岗位

  5. 通过从您的计算机运行http:// localhost:9200 / _plugin / kibana / URL来测试安装程序和Kibana 。

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