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;
}

接下来是什么??

4

2 回答 2

12

可以在 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 客户端

于 2016-12-20T11:00:20.220 回答
6

最后,这里是使用 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";}
    
  3. 使用 Postman 或 Sense 在 ES 中创建实际索引和相应的映射。

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

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

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

于 2016-12-21T11:38:38.567 回答