2016-12-20 31 views
6

S3 Putイベント通知にLambda関数を使用しようとしています。 S3バケットに新しいJSONファイルを追加/追加すると、私のラムダ関数を呼び出す必要があります。 私が持っている課題は、このようなラムダ関数をJavaで実装するための十分な文書がないことです。私が見つけたdocのほとんどはNode.js用ですAWS S3 Javaで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; 
} 

次は何ですか?

+1

さて、火をつけてください!それを有効にしてファイルをアップロードします。あなたが必要とする最初の "クラス"はあなたの眼球だけです - ログインした入力を見てください。それ以降、残りは明白になるはずです。入力は[S3イベント通知](http://docs.aws.amazon.com/AmazonS3/latest/dev/notification-content-structure.html)で、アップロードされたばかりのオブジェクトについての情報が必要です。 –

答えて

0

最後に、ここではS3のための手順は次のとおりです - Javaを使用して> ES統合 - >ラムダが。

  1. AWSでS3、Lamba、ESを作成しましたか?手順はhereです。
  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. ESの実際のインデックス&対応するマッピングを作成するために、郵便配達やセンスのいずれかを使用します。

  4. 完了したら、マシンにproxy.jsをダウンロードして実行してください。あなたのマシンからhttp://localhost:9200/_plugin/kibana/ URLを実行することによって、このpost

  5. テストのセットアップとKibanaで提案されていることを確認しますセットアップESセキュリティ手順を行います。

  6. すべて設定されています。キバナであなたのダッシュボードを設定してください。 S3バケットに新しいオブジェクトを追加してテストしてください。

4

ラムダで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

+0

ありがとうございます。私も簡単な部分を完成させ、難しいものと闘いました。 ESにメッセージを追加するためだけにJestを使用しようとしています。しかし、何とかその部分が欠けているようです。検索、取得などのすべてが表示されています。しかし、Addドキュメントはありません。私がDocumentMapperを使用したことはありません。このステップは実行する必要があるだけなので、私はDocumentMapperを使用しませんでした。DocumentMapper documentMapper = new DocumentMapper.Builder( "groupId"、null、rootObjectMapperBuilder).build(null); ' – NGR

+1

一度、私は通常、木場のGUIを通してマッピングを生成しました。それを除けば、APIを使用してインデックスにドキュメントを追加するだけでした。 –

+0

助けてくれてありがとうJens。私はApache HTTPをREST APIに使用し、Postmanを使用してインデックスとマッピングを作成しました。それは働いている。 – NGR

関連する問題