web-dev-qa-db-fra.com

Notification d'événement AWS S3 à l'aide de la fonction Lambda dans Java

J'essaie d'utiliser la fonction Lambda pour la notification d'événement S3 Put. Ma fonction Lambda doit être appelée une fois que j'ai mis/ajouté un nouveau fichier JSON dans mon compartiment S3. Le défi que j'ai est qu'il n'y a pas assez de documents pour implémenter une telle fonction Lambda en Java. La plupart des documents que j'ai trouvés concernent Node.js

Je veux, ma fonction Lambda doit être appelée, puis à l'intérieur de cette fonction Lambda, je veux consommer ce json ajouté, puis envoyer ce JSON à AWS ES Service.

Mais quelles classes dois-je utiliser pour cela? Quelqu'un a une idée à ce sujet? S3 abd ES sont tous configurés et exécutés. Le code généré automatiquement pour lambda est `

@Override
public Object handleRequest(S3Event input, Context context) {
    context.getLogger().log("Input: " + input);

    // TODO: implement your handler
    return null;
}

Et ensuite?

10
NGR

Enfin, voici les étapes de l'intégration S3 -> Lambda -> ES à l'aide de Java.

  1. Faites créer vos S3, Lamba et ES sur AWS. Les étapes sont ici .
  2. Utilisez ci-dessous Java dans votre fonction lambda pour récupérer un objet nouvellement ajouté dans S3 et l'envoyer au service 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. Utilisez Postman ou Sense pour créer un index réel et un mappage correspondant dans ES.

  4. Une fois cela fait, téléchargez et exécutez proxy.js sur votre machine. Assurez-vous de configurer les étapes de sécurité ES suggérées dans ce post

  5. Testez la configuration et Kibana en exécutant http: // localhost: 9200/_plugin/kibana / URL de votre machine.

  6. Tout est réglé. Allez-y et définissez votre tableau de bord dans Kibana. Testez-le en ajoutant de nouveaux objets dans votre compartiment S3

5
NGR

La gestion des événements S3 dans Lambda peut être effectuée, mais vous devez garder à l'esprit que l'objet S3Event transporte uniquement la référence à l'objet et non l'objet lui-même. Pour accéder à l'objet réel, vous devez invoquer vous-même le kit SDK AWS. Demander un objet S3 dans une fonction lambda ressemblerait à ceci:

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

Maintenant, la partie plutôt difficile d'insérer cet objet dans ElasticSearch. Malheureusement, le SDK AWS ne propose aucune fonction pour cela. L'approche par défaut serait de faire un appel REST contre le point de terminaison AWS ES. Il existe divers exemples sur la façon de procéder avec l'appel d'une instance ElasticSearch.

Certaines personnes semblent aller avec le projet suivant:

Jest - Elasticsearch Java Rest Client

9
jens walter