S3 Putイベント通知にLambda関数を使用しようとしています。 Lambda関数は、S3バケットに新しいJSONファイルを配置/追加したら呼び出す必要があります。私が抱えている課題は、JavaでそのようなLambda関数を実装するための十分なドキュメントがないことです。私が見つけたドキュメントのほとんどはNode.js用です
Lambda関数を呼び出してから、そのLambda関数内で、追加されたjsonを使用して、そのJSONをAWS ESサービスに送信する必要があります。
しかし、これに使用するすべてのクラスは何ですか?誰かこれについて何か考えがありますか? S3 abd ESはすべてセットアップされ、実行されています。ラムダの自動生成コードは `
@Override
public Object handleRequest(S3Event input, Context context) {
context.getLogger().log("Input: " + input);
// TODO: implement your handler
return null;
}
次は何??
最後に、S3-> Lambda-> Javaを使用したES統合の手順を示します。
以下の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 をダウンロードして実行します。この post で提案されているESセキュリティの手順を設定してください。
マシンからhttp:// localhost:9200/_plugin/kibana /URLを実行して、セットアップとKibanaをテストします。
すべてが設定されました。先に進み、Kibanaでダッシュボードを設定します。 S3バケットに新しいオブジェクトを追加してテストします
LambdaでS3イベントを処理することはできますが、S3Eventオブジェクトはオブジェクトへの参照のみを転送し、オブジェクト自体は転送しないことに注意してください。実際のオブジェクトにアクセスするには、AWS SDKを自分で呼び出す必要があります。ラムダ関数内で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インスタンスの呼び出しを続行する方法については、さまざまなサンプルがあります。
一部の人々は次のプロジェクトに行くようです: