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 实例,有各种示例。
有些人似乎喜欢以下项目:
最后,这里是 S3 --> Lambda --> ES 集成使用 Java 的步骤。
- 在 AWS 上创建 S3、Lamba 和 ES。步骤为 here.
在您的 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 在 ES 中创建实际索引和对应映射。
完成后,下载并 运行 proxy.js on your machine. Make sure you setup ES Security steps suggested in this post
在您的机器上 运行ning http://localhost:9200/_plugin/kibana/ URL 测试设置和 Kibana。
一切就绪。继续并在 Kibana 中设置您的仪表板。通过在您的 S3 存储桶中添加新对象来测试它
我正在尝试将 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 实例,有各种示例。
有些人似乎喜欢以下项目:
最后,这里是 S3 --> Lambda --> ES 集成使用 Java 的步骤。
- 在 AWS 上创建 S3、Lamba 和 ES。步骤为 here.
在您的 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 在 ES 中创建实际索引和对应映射。
完成后,下载并 运行 proxy.js on your machine. Make sure you setup ES Security steps suggested in this post
在您的机器上 运行ning http://localhost:9200/_plugin/kibana/ URL 测试设置和 Kibana。
一切就绪。继续并在 Kibana 中设置您的仪表板。通过在您的 S3 存储桶中添加新对象来测试它