

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.

# Analyse d'images à l'aide d'une AWS Lambda fonction
<a name="ex-lambda"></a>

AWS Lambda est un service de calcul qui vous permet d'exécuter du code sans provisionner ni gérer de serveurs. Par exemple, vous pouvez analyser les images soumises depuis une application mobile sans avoir à créer un serveur pour héberger le code de l’application. Les instructions suivantes montrent comment créer une fonction Lambda dans Python qui appelle [DetectCustomLabels](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DetectCustomLabels). La fonction analyse une image fournie et renvoie une liste des étiquettes trouvées dans l’image. Les instructions incluent un exemple de code Python montrant comment appeler la fonction Lambda avec une image dans un compartiment Amazon S3 ou une image fournie depuis un ordinateur local. 

**Topics**
+ [

## Étape 1 : Création d'une AWS Lambda fonction (console)
](#example-lambda-create-function)
+ [

## Étape 2 : (Facultatif) Créer une couche (console)
](#example-lambda-create-layer)
+ [

## Étape 3 : Ajouter le code Python (console)
](#example-lambda-add-code)
+ [

## Étape 4 : Essayer votre fonction Lambda
](#example-lambda-test)

## Étape 1 : Création d'une AWS Lambda fonction (console)
<a name="example-lambda-create-function"></a>

Au cours de cette étape, vous créez une AWS fonction vide et un rôle d'exécution IAM qui permet à votre fonction d'appeler l'`DetectCustomLabels`opération. Il donne également accès au compartiment Amazon S3 qui stocke des images à des fins d’analyse. Vous spécifiez également des variables d’environnement pour les éléments suivants :
+ Le modèle Étiquettes personnalisées Amazon Rekognition que vous souhaitez que votre fonction Lambda utilise.
+ La limite de confiance que vous souhaitez que le modèle utilise.

Vous ajoutez ensuite le code source et éventuellement une couche à la fonction Lambda.

**Pour créer une AWS Lambda fonction (console)**

1. Connectez-vous à la AWS Lambda console AWS Management Console et ouvrez-la à l'adresse [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Choisissez **Créer une fonction**. Pour plus d’informations, consultez [Créer une fonction Lambda à l’aide de la console](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html).

1. Choisissez les options suivantes.
   + Choisissez **Créer à partir de zéro**. 
   + Entrez une valeur pour **Nom de la fonction**.
   + Pour **Environnement d’exécution**, choisissez **Python 3.10**.

1. Choisissez **Créer une fonction** pour créer la fonction AWS Lambda .

1. Sur la page de la fonction, choisissez l’onglet **Configuration**.

1. Dans le volet **Variables d’environnement**, choisissez **Modifier**.

1. Ajoutez les variables d’environnement suivantes. Pour chaque variable, choisissez **Ajouter des variables d’environnement**, puis entrez la clé et la valeur de la variable.     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/rekognition/latest/customlabels-dg/ex-lambda.html)

1. Choisissez **Enregistrer** pour enregistrer les variables d’environnement.

1. Dans le volet **Autorisations**, sous **Nom du rôle**, choisissez le rôle d’exécution pour ouvrir le rôle dans la console IAM.

1. Dans l’onglet **Autorisations**, choisissez **Ajouter des autorisations**, puis **Créer une politique en ligne**.

1. Choisissez **JSON** et remplacez la politique existante avec la suivante.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Action": "rekognition:DetectCustomLabels",
               "Resource": "*",
               "Effect": "Allow",
               "Sid": "DetectCustomLabels"
           }
       ]
   }
   ```

------

1. Choisissez **Suivant**.

1. Dans **Détails de la politique**, entrez le nom de la politique, tel que *DetectCustomLabels-access*.

1. Choisissez **Create Policy** (Créer une politique).

1. Si vous stockez des images à des fins d’analyse dans un compartiment Amazon S3, répétez les étapes 10 à 14. 

   1. Pour l’étape 11, utilisez la politique suivante. *bucket/folder path*Remplacez-le par le chemin du compartiment et du dossier Amazon S3 vers les images que vous souhaitez analyser. 

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "S3Access",
                  "Effect": "Allow",
                  "Action": "s3:GetObject",
                  "Resource": "arn:aws:s3:::bucket/folder path/*"
              }
          ]
      }
      ```

------

   1. Pour l’étape 13, choisissez un autre nom de politique, tel que *S3Bucket-access*.

## Étape 2 : (Facultatif) Créer une couche (console)
<a name="example-lambda-create-layer"></a>

Pour exécuter cet exemple, vous n’avez pas besoin de suivre cette étape. L'`DetectCustomLabels`opération est incluse dans l'environnement Lambda Python par défaut dans le cadre du AWS SDK pour Python (Boto3). Si d'autres parties de votre fonction Lambda nécessitent des mises à jour de AWS service récentes qui ne figurent pas dans l'environnement Lambda Python par défaut, procédez comme suit pour ajouter la dernière version du SDK Boto3 en tant que couche à votre fonction. 

Vous devez d’abord créer une archive de fichier .zip contenant le kit SDK Boto3. Ensuite, vous créez une couche et ajoutez l’archive du fichier .zip à la couche. Pour plus d’informations, consultez [Utilisation de couches avec votre fonction Lambda](https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html#invocation-layers-using).

**Pour créer et ajouter une couche (console)**

1. Ouvrez une invite de commande et entrez les commandes suivantes.

   ```
   pip install boto3 --target python/.
   zip boto3-layer.zip -r python/
   ```

1. Notez le nom du fichier zip (boto3-layer.zip). Vous en aurez besoin à l’étape 6 de cette procédure.

1. Ouvrez la AWS Lambda console à l'adresse [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Choisissez **Layers** dans le volet de navigation. 

1. Choisissez **Créer un calque**.

1. Saisissez un **Name** (Nom) et une **Description** pour la règle.

1. Choisissez **Charger un fichier .zip**, puis **Charger**.

1. Dans la boîte de dialogue, sélectionnez l’archive de fichiers .zip (boto3-layer.zip) que vous avez créée à l’étape 1 de cette procédure.

1. Pour des environnements d’exécution compatibles, choisissez **Python 3.9**.

1. Choisissez **Créer** pour créer la couche.

1. Choisissez l’icône du menu du volet de navigation.

1. Dans le volet de navigation, choisissez **Fonctions**.

1. Dans la liste des ressources, choisissez la fonction que vous avez créée dans [Étape 1 : Création d'une AWS Lambda fonction (console)](#example-lambda-create-function). 

1. Cliquez sur l’onglet **Code**.

1. Dans la zone **Couches**, choisissez **Ajouter une couche**.

1. Choisissez **Couches personnalisées**.

1. Dans **Couches personnalisées**, choisissez le nom de couche que vous avez saisi à l’étape 6. 

1. Dans **Version**, choisissez la version de la couche, qui doit être 1.

1. Choisissez **Ajouter**.

## Étape 3 : Ajouter le code Python (console)
<a name="example-lambda-add-code"></a>

Au cours de cette étape, vous ajoutez le code Python à votre fonction Lambda à l’aide de l’éditeur de code de la console Lambda. Le code analyse une image fournie avec `DetectCustomLabels` et renvoie une liste des étiquettes trouvées dans l’image. L’image fournie peut être située dans un compartiment Amazon S3 ou fournie sous forme d’octets d’image codés en byte64.

**Pour ajouter le code Python (console)**

1. Si vous n’êtes pas dans la console Lambda, procédez comme suit :

   1. Ouvrez la AWS Lambda console à l'adresse [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

   1. Ouvrez la fonction Lambda que vous avez créée dans [Étape 1 : Création d'une AWS Lambda fonction (console)](#example-lambda-create-function).

1. Cliquez sur l’onglet **Code**.

1. Dans **Source du code**, remplacez le code dans **lambda\$1function.py** par le code suivant : 

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   
   """
   Purpose
   An AWS lambda function that analyzes images with an the Amazon Rekognition
   Custom Labels model.
   """
   import json
   import base64
   from os import environ
   import logging
   import boto3
   
   from botocore.exceptions import ClientError
   
   # Set up logging.
   logger = logging.getLogger(__name__)
   
   # Get the model ARN and confidence.
   model_arn = environ['MODEL_ARN']
   min_confidence = int(environ.get('CONFIDENCE', 50))
   
   # Get the boto3 client.
   rek_client = boto3.client('rekognition')
   
   
   def lambda_handler(event, context):
       """
       Lambda handler function
       param: event: The event object for the Lambda function.
       param: context: The context object for the lambda function.
       return: The labels found in the image passed in the event
       object.
       """
   
       try:
   
           # Determine image source.
           if 'image' in event:
               # Decode the image
               image_bytes = event['image'].encode('utf-8')
               img_b64decoded = base64.b64decode(image_bytes)
               image = {'Bytes': img_b64decoded}
   
   
           elif 'S3Object' in event:
               image = {'S3Object':
                        {'Bucket':  event['S3Object']['Bucket'],
                         'Name': event['S3Object']['Name']}
                        }
   
           else:
               raise ValueError(
                   'Invalid source. Only image base 64 encoded image bytes or S3Object are supported.')
   
   
           # Analyze the image.
           response = rek_client.detect_custom_labels(Image=image,
               MinConfidence=min_confidence,
               ProjectVersionArn=model_arn)
   
           # Get the custom labels
           labels = response['CustomLabels']
   
           lambda_response = {
               "statusCode": 200,
               "body": json.dumps(labels)
           }
   
       except ClientError as err:
           error_message = f"Couldn't analyze image. " + \
               err.response['Error']['Message']
   
           lambda_response = {
               'statusCode': 400,
               'body': {
                   "Error": err.response['Error']['Code'],
                   "ErrorMessage": error_message
               }
           }
           logger.error("Error function %s: %s",
               context.invoked_function_arn, error_message)
   
       except ValueError as val_error:
           lambda_response = {
               'statusCode': 400,
               'body': {
                   "Error": "ValueError",
                   "ErrorMessage": format(val_error)
               }
           }
           logger.error("Error function %s: %s",
               context.invoked_function_arn, format(val_error))
   
       return lambda_response
   ```

1. Choisissez **Déployer** pour déployer votre fonction Lambda.

## Étape 4 : Essayer votre fonction Lambda
<a name="example-lambda-test"></a>

Au cours de cette étape, vous exécutez du code Python sur votre ordinateur pour transmettre une image locale ou une image d’un compartiment Amazon S3 à votre fonction Lambda. Les images transmises par un ordinateur local doivent avoir une taille inférieure à 6 291 456 octets. Si vos images sont plus grandes, chargez-les dans un compartiment Amazon S3 et appelez le script avec le chemin Amazon S3 vers l’image. Pour plus d’informations sur le chargement des fichiers image dans un compartiment Amazon S3, consultez [Chargement d’objets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html).

Assurez-vous d'exécuter le code dans la même AWS région que celle dans laquelle vous avez créé la fonction Lambda. [Vous pouvez consulter la AWS région de votre fonction Lambda dans la barre de navigation de la page de détails de la fonction de la console Lambda.](https://console.aws.amazon.com/lambda/)

Si la AWS Lambda fonction renvoie une erreur de temporisation, prolongez le délai d'expiration de la fonction Lambda. Pour plus d'informations, voir [Configuration du délai d'expiration de la fonction](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html#configuration-timeout-console) (console).

Pour plus d'informations sur l'appel d'une fonction Lambda à partir de votre code, [consultez AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/invoking-lambda-functions.html) Invoking Functions. 

**Pour essayer votre fonction Lambda**

1. Veillez à disposer de l’autorisations `lambda:InvokeFunction`. Vous pouvez utiliser la politique suivante. 

   Vous pouvez obtenir l’ARN de votre fonction Lambda à partir de l’aperçu des fonctions dans la [console Lambda.](https://console.aws.amazon.com/lambda/)

   Pour activer l’accès, ajoutez des autorisations à vos utilisateurs, groupes ou rôles :
   + Utilisateurs et groupes dans AWS IAM Identity Center :

     Créez un jeu d’autorisations. Suivez les instructions de la rubrique [Création d’un jeu d’autorisations](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html) du *Guide de l’utilisateur AWS IAM Identity Center *.
   + Utilisateurs gérés dans IAM par un fournisseur d’identité :

     Créez un rôle pour la fédération d’identité. Suivez les instructions de la rubrique [Création d’un rôle pour un fournisseur d’identité tiers (fédération)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html) dans le *Guide de l’utilisateur IAM*.
   + Utilisateurs IAM :
     + Créez un rôle que votre utilisateur peut assumer. Suivez les instructions de la rubrique [Création d’un rôle pour un utilisateur IAM](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html) dans le *Guide de l’utilisateur IAM*.
     + (Non recommandé) Attachez une politique directement à un utilisateur ou ajoutez un utilisateur à un groupe d’utilisateurs. Suivez les instructions de la rubrique [Ajout d’autorisations à un utilisateur (console)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console) du *Guide de l’utilisateur IAM*.

1. Installez et configurez le AWS SDK pour Python. Pour de plus amples informations, veuillez consulter [Étape 4 : configurer le AWS CLI et AWS SDKs](su-awscli-sdk.md).

1. [Démarrez le modèle](rm-start.md) que vous avez spécifié à l’étape 7 de l’[Étape 1 : Création d'une AWS Lambda fonction (console)](#example-lambda-create-function).

1. Enregistrez le code suivant dans un fichier nommé `client.py`. 

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   
   """
   Purpose
   Test code for running the Amazon Rekognition Custom Labels Lambda
   function example code.
   """
   
   import argparse
   import logging
   import base64
   import json
   import boto3
   
   from botocore.exceptions import ClientError
   
   
   logger = logging.getLogger(__name__)
   
   
   def analyze_image(function_name, image):
       """Analyzes an image with an AWS Lambda function.
       :param image: The image that you want to analyze.
       :return The status and classification result for
       the image analysis.
       """
   
       lambda_client = boto3.client('lambda')
   
       lambda_payload = {}
   
       if image.startswith('s3://'):
           logger.info("Analyzing image from S3 bucket: %s", image)
           bucket, key = image.replace("s3://", "").split("/", 1)
           s3_object = {
               'Bucket': bucket,
               'Name': key
           }
           lambda_payload = {"S3Object": s3_object}
   
       # Call the lambda function with the image.
       else:
           with open(image, 'rb') as image_file:
               logger.info("Analyzing local image image: %s ", image)
               image_bytes = image_file.read()
               data = base64.b64encode(image_bytes).decode("utf8")
   
               lambda_payload = {"image": data}
   
       response = lambda_client.invoke(FunctionName=function_name,
                                       Payload=json.dumps(lambda_payload))
   
       return json.loads(response['Payload'].read().decode())
   
   
   def add_arguments(parser):
       """
       Adds command line arguments to the parser.
       :param parser: The command line parser.
       """
   
       parser.add_argument(
           "function", help="The name of the AWS Lambda function that you want " \
           "to use to analyze the image.")
       parser.add_argument(
           "image", help="The local image that you want to analyze.")
   
   
   def main():
       """
       Entrypoint for script.
       """
       try:
           logging.basicConfig(level=logging.INFO,
                               format="%(levelname)s: %(message)s")
   
           # Get command line arguments.
           parser = argparse.ArgumentParser(usage=argparse.SUPPRESS)
           add_arguments(parser)
           args = parser.parse_args()
   
           # Get analysis results.
           result = analyze_image(args.function, args.image)
           status = result['statusCode']
   
           if status == 200:
               labels = result['body']
               labels = json.loads(labels)
               print(f"There are {len(labels)} labels in the image.")
               for custom_label in labels:
                   confidence = int(round(custom_label['Confidence'], 0))
                   print(
                       f"Label: {custom_label['Name']}: Confidence: {confidence}%")
           else:
               print(f"Error: {result['statusCode']}")
               print(f"Message: {result['body']}")
   
       except ClientError as error:
           logging.error(error)
           print(error)
   
   
   if __name__ == "__main__":
       main()
   ```

1. Exécutez le code. Pour l’argument de ligne de commande, indiquez le nom de la fonction Lambda et l’image que vous souhaitez analyser. Vous pouvez fournir un chemin vers une image locale ou le chemin S3 vers une image stockée dans un compartiment Amazon S3. Par exemple :

   ```
   python client.py function_name s3://bucket/path/image.jpg
   ```

   Si l’image se trouve dans un compartiment Amazon S3, assurez-vous qu’il s’agit du même compartiment que celui que vous avez spécifié à l’étape 15 de l’[Étape 1 : Création d'une AWS Lambda fonction (console)](#example-lambda-create-function).

   En cas de réussite, le résultat est une liste d’étiquettes présentes dans l’image. Si aucune étiquette n’est renvoyée, pensez à réduire la valeur de confiance que vous avez définie à l’étape 7 de l’[Étape 1 : Création d'une AWS Lambda fonction (console)](#example-lambda-create-function).

1. Si vous avez terminé avec la fonction Lambda et que le modèle n’est pas utilisé par d’autres applications, [arrêtez le modèle](rm-stop.md). N’oubliez pas de [démarrer le modèle](rm-start.md) la prochaine fois que vous utiliserez la fonction Lambda. 