web-dev-qa-db-ja.com

JavaのLambda関数を使用したAWS S3イベント通知

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

次は何??

10
NGR

最後に、S3-> Lambda-> Javaを使用したES統合の手順を示します。

  1. AWSでS3、Lamba、ESを作成します。手順は ここ です。
  2. 以下の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 をダウンロードして実行します。この post で提案されているESセキュリティの手順を設定してください。

  5. マシンからhttp:// localhost:9200/_plugin/kibana /URLを実行して、セットアップとKibanaをテストします。

  6. すべてが設定されました。先に進み、Kibanaでダッシュボードを設定します。 S3バケットに新しいオブジェクトを追加してテストします

5
NGR

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インスタンスの呼び出しを続行する方法については、さまざまなサンプルがあります。

一部の人々は次のプロジェクトに行くようです:

Jest-Elasticsearch Java Rest Client

9
jens walter