

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Chargement de données de streaming à partir d'Amazon S3
<a name="integrations-s3-lambda"></a>

Vous pouvez utiliser Lambda pour envoyer des données vers votre domaine de OpenSearch service depuis Amazon S3. Les nouvelles données qui arrivent dans un compartiment S3 déclenchent l'envoi d'une notification d'événement à Lambda, qui exécute alors votre code personnalisé pour effectuer l'indexation.

Cette méthode de diffusion de données est extrêmement flexible. Vous pouvez [indexer les métadonnées d'objet](https://aws.amazon.com/blogs/database/indexing-metadata-in-amazon-elasticsearch-service-using-aws-lambda-and-python/), ou si l'objet est en texte brut, analyser et indexer certains éléments du corps de l'objet. Cette section inclut des exemples de code Python simple qui utilisent des expressions régulières pour analyser un fichier journal et indexer les correspondances.

## Conditions préalables
<a name="integrations-s3-lambda-prereq"></a>

Avant de poursuivre, vous devez disposer des ressources suivantes.


****  

| Prérequis | Description | 
| --- | --- | 
| Compartiment Amazon S3 | Pour en savoir plus, consultez [Création de votre premier compartiment S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html) dans le Guide de l'utilisateur Amazon Simple Storage Service. Le bucket doit résider dans la même région que votre domaine OpenSearch de service. | 
| OpenSearch Domaine de service | Destination des données après leur traitement par votre fonction Lambda. Pour de plus amples informations, veuillez consulter [Création de domaines OpenSearch de service](createupdatedomains.md#createdomains). | 

## Créer le package de déploiement Lambda
<a name="integrations-s3-lambda-deployment-package"></a>

Les packages de déploiement sont des fichiers ZIP ou JAR qui contiennent votre code et ses dépendances. Cette section inclut des exemples de code Python. Pour les autres langages de programmation, consultez [Packages de déploiement Lambda](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-package.html) dans le *Guide du développeur AWS Lambda *.

1. Créez un répertoire. Dans cet exemple, nous utilisons le nom `s3-to-opensearch`.

1. Dans le répertoire, créez un fichier nommé `sample.py` :

   ```
   import boto3
   import re
   import requests
   from requests_aws4auth import AWS4Auth
   
   region = '' # e.g. us-west-1
   service = 'es'
   credentials = boto3.Session().get_credentials()
   awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
   
   host = '' # the OpenSearch Service domain, e.g. https://search-mydomain.us-west-1.es.amazonaws.com
   index = 'lambda-s3-index'
   datatype = '_doc'
   url = host + '/' + index + '/' + datatype
   
   headers = { "Content-Type": "application/json" }
   
   s3 = boto3.client('s3')
   
   # Regular expressions used to parse some simple log lines
   ip_pattern = re.compile('(\d+\.\d+\.\d+\.\d+)')
   time_pattern = re.compile('\[(\d+\/\w\w\w\/\d\d\d\d:\d\d:\d\d:\d\d\s-\d\d\d\d)\]')
   message_pattern = re.compile('\"(.+)\"')
   
   # Lambda execution starts here
   def handler(event, context):
       for record in event['Records']:
   
           # Get the bucket name and key for the new file
           bucket = record['s3']['bucket']['name']
           key = record['s3']['object']['key']
   
           # Get, read, and split the file into lines
           obj = s3.get_object(Bucket=bucket, Key=key)
           body = obj['Body'].read()
           lines = body.splitlines()
   
           # Match the regular expressions to each line and index the JSON
           for line in lines:
               line = line.decode("utf-8")
               ip = ip_pattern.search(line).group(1)
               timestamp = time_pattern.search(line).group(1)
               message = message_pattern.search(line).group(1)
   
               document = { "ip": ip, "timestamp": timestamp, "message": message }
               r = requests.post(url, auth=awsauth, json=document, headers=headers)
   ```

   Modifiez les variables des champs `region` et `host`.

1. Si vous ne l'avez pas encore fait, [installez pip](https://pip.pypa.io/en/stable/installation/), puis installez les dépendances dans un nouveau répertoire `package` :

   ```
   cd s3-to-opensearch
   
   pip install --target ./package requests
   pip install --target ./package requests_aws4auth
   ```

   [Boto3](https://aws.amazon.com/sdk-for-python/) est installé dans tous les environnements d'exécution Lambda et vous n'avez pas besoin de l'inclure dans votre package de déploiement.

1. Empaquetez le code d'application et les dépendances :

   ```
   cd package
   zip -r ../lambda.zip .
   
   cd ..
   zip -g lambda.zip sample.py
   ```

## Créer la fonction Lambda
<a name="integrations-s3-lambda-create"></a>

Après avoir créé le package de déploiement, vous pouvez créer la fonction Lambda. Lorsque vous créez une fonction, choisissez un nom, une exécution (par exemple, Python 3.8) et un rôle IAM. Le rôle IAM définit les autorisations pour votre fonction. Pour obtenir des instructions détaillées, consultez [Création d'une fonction Lambda à l'aide de la console](https://docs.aws.amazon.com/lambda/latest/dg/get-started-create-function.html) dans le *Guide du développeur AWS Lambda *.

Cet exemple suppose que vous utilisez la console. Choisissez Python 3.9 et un rôle doté des autorisations de lecture S3 et des autorisations d'écriture du OpenSearch service, comme illustré dans la capture d'écran suivante :

![\[Exemple de configuration d'une fonction Lambda\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/lambda-function.png)


Une fois que vous avez créé la fonction, vous devez ajouter un déclencheur. Pour cet exemple, nous voulons que le code s'exécute chaque fois qu'un fichier journal arrive dans un compartiment S3 :

1. Choisissez **Add trigger (Ajouter un déclencheur)** et sélectionnez **S3**.

1. Choisissez votre compartiment.

1. Pour **Event type (Type d'événement)**, choisissez **PUT**.

1. Pour **Préfixe**, tapez `logs/`.

1. Pour **Suffixe**, tapez `.log`.

1. Acceptez l'avertissement d'invocation récursive et choisissez **Add (Ajouter)**.

Enfin, vous pouvez charger votre package de déploiement :

1. Choisissez **Upload from (Charger à partir de)** et **.zip file (Fichier .zip)**, puis suivez les invites pour charger votre package de déploiement.

1. Au terme du chargement, modifiez les **Paramètres d'exécution** et remplacez le **Gestionnaire** par `sample.handler`. Ce paramètre indique à Lambda le fichier (`sample.py`) et la méthode (`handler`) à exécuter après un déclencheur.

À ce stade, vous disposez d'un ensemble complet de ressources : un compartiment pour les fichiers journaux, une fonction qui s'exécute chaque fois qu'un fichier journal est ajouté au compartiment, du code qui effectue l'analyse et l'indexation, et un domaine de OpenSearch service pour la recherche et la visualisation.

## Test de la fonction Lambda
<a name="integrations-s3-lambda-configure"></a>

Après avoir créé la fonction, vous pouvez la tester en chargeant un fichier dans le compartiment Amazon S3. Créez un fichier nommé `sample.log` en utilisant les exemples de lignes de journal suivants :

```
12.345.678.90 - [10/Oct/2000:13:55:36 -0700] "PUT /some-file.jpg"
12.345.678.91 - [10/Oct/2000:14:56:14 -0700] "GET /some-file.jpg"
```

Chargez le fichier dans le dossier `logs` de votre compartiment S3. Pour obtenir des instructions, consultez [Charger un objet dans votre compartiment](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PuttingAnObjectInABucket.html) dans le *Guide de l'utilisateur Amazon Simple Storage Service*.

Utilisez ensuite la console OpenSearch de service ou OpenSearch les tableaux de bord pour vérifier que l'`lambda-s3-index`index contient deux documents. Vous pouvez également effectuer une requête de recherche standard :

```
GET https://domain-name/lambda-s3-index/_search?pretty
{
  "hits" : {
    "total" : 2,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "lambda-s3-index",
        "_type" : "_doc",
        "_id" : "vTYXaWIBJWV_TTkEuSDg",
        "_score" : 1.0,
        "_source" : {
          "ip" : "12.345.678.91",
          "message" : "GET /some-file.jpg",
          "timestamp" : "10/Oct/2000:14:56:14 -0700"
        }
      },
      {
        "_index" : "lambda-s3-index",
        "_type" : "_doc",
        "_id" : "vjYmaWIBJWV_TTkEuCAB",
        "_score" : 1.0,
        "_source" : {
          "ip" : "12.345.678.90",
          "message" : "PUT /some-file.jpg",
          "timestamp" : "10/Oct/2000:13:55:36 -0700"
        }
      }
    ]
  }
}
```