Utilisation de couches pour les fonctions Lambda en Python - AWS Lambda

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.

Utilisation de couches pour les fonctions Lambda en Python

Une couche Lambda est une archive de fichier .zip qui contient du code ou des données supplémentaires. Les couches contiennent généralement des dépendances de bibliothèque, une exécution personnalisée, ou des fichiers de configuration. La création d'une couche implique trois étapes générales :

  1. Package le contenu de votre couche. Cela implique de créer une archive de fichiers .zip contenant les dépendances que vous souhaitez utiliser dans vos fonctions.

  2. Créez la couche dans Lambda.

  3. Ajoutez la couche à vos fonctions.

Cette rubrique contient des étapes et des conseils sur la manière d'empaqueter et de créer correctement une couche Lambda Python avec des dépendances de bibliothèque externes.

Prérequis

Pour suivre les étapes décrites dans cette section, vous devez disposer des éléments suivants :

Tout au long de cette rubrique, nous faisons référence à l'layer-pythonexemple d'application sur le référentiel awsdocs GitHub . Cette application contient des scripts qui téléchargent les dépendances et génèrent les couches. L'application contient également les fonctions correspondantes qui utilisent les dépendances des couches. Après avoir créé une couche, vous pouvez déployer et invoquer la fonction correspondante pour vérifier que tout fonctionne correctement. Comme vous utilisez le moteur d'exécution Python 3.11 pour les fonctions, les couches doivent également être compatibles avec Python 3.11.

L'layer-pythonexemple d'application contient deux exemples :

  • Le premier exemple consiste à empaqueter la requestsbibliothèque dans une couche Lambda. Le layer/ répertoire contient les scripts permettant de générer la couche. Le function/ répertoire contient un exemple de fonction permettant de vérifier le fonctionnement de la couche. La majeure partie de ce didacticiel explique comment créer et empaqueter cette couche.

  • Le deuxième exemple consiste à empaqueter la numpybibliothèque dans une couche Lambda. Le layer-numpy/ répertoire contient les scripts permettant de générer la couche. Le function-numpy/ répertoire contient un exemple de fonction permettant de vérifier le fonctionnement de la couche. Pour un exemple de création et d'empaquetage de cette couche, consultezUtilisation des distributions manylinux de roues.

Compatibilité de la couche Python avec Amazon Linux

La première étape de la création d'une couche consiste à regrouper l'ensemble du contenu de la couche dans une archive de fichiers .zip. Parce que les fonctions Lambda s'exécutent sur Amazon Linux, le contenu de votre couche doit pouvoir être compilé et construit dans un environnement Linux.

En Python, la plupart des paquets sont disponibles sous forme de roues (.whlfichiers) en plus de la distribution source. Chaque roue est un type de distribution intégrée qui prend en charge une combinaison spécifique de versions de Python, de systèmes d'exploitation et de jeux d'instructions machine.

Les roues sont utiles pour garantir la compatibilité de votre couche avec Amazon Linux. Lorsque vous téléchargez vos dépendances, téléchargez la roue universelle si possible. (Par défaut, pip installe la roue universelle si elle est disponible.) La roue universelle contient any une balise de plate-forme, indiquant qu'elle est compatible avec toutes les plateformes, y compris Amazon Linux.

Dans l'exemple suivant, vous allez empaqueter la requests bibliothèque dans une couche Lambda. La requests bibliothèque est un exemple de package disponible sous forme de roue universelle.

Tous les packages Python ne sont pas distribués sous forme de roues universelles. Par exemple, numpypossède plusieurs distributions de roues, chacune supportant un ensemble différent de plateformes. Pour de tels packages, téléchargez la manylinux distribution afin de garantir la compatibilité avec Amazon Linux. Pour obtenir des instructions détaillées sur l'empaquetage de telles couches, reportez-vous à la sectionUtilisation des distributions manylinux de roues.

Dans de rares cas, un package Python peut ne pas être disponible sous forme de roue. Si seule la distribution source (sdist) existe, nous vous recommandons d'installer et d'empaqueter vos dépendances dans un environnement Docker basé sur l'image du conteneur de base Amazon Linux 2023. Nous recommandons également cette approche si vous souhaitez inclure vos propres bibliothèques personnalisées écrites dans d'autres langages tels que C/C++. Cette approche imite l'environnement d'exécution Lambda dans Docker et garantit que les dépendances de vos packages autres que Python sont compatibles avec Amazon Linux.

Chemins de couche pour les environnements d'exécution Python

Lorsque vous ajoutez une couche à une fonction, Lambda charge le contenu de la couche dans le répertoire /opt de cet environnement d’exécution. Pour chaque exécution Lambda, la variable PATH inclut déjà des chemins de dossiers spécifiques dans le répertoire /opt. Pour garantir que la PATH variable capte le contenu de votre couche, le fichier .zip de votre couche doit avoir ses dépendances dans les chemins de dossier suivants :

  • python

  • python/lib/python3.x/site-packages

Par exemple, le fichier de couche .zip obtenu que vous créez dans ce didacticiel possède la structure de répertoire suivante :

layer_content.zip └ python └ lib └ python3.11 └ site-packages └ requests └ <other_dependencies> (i.e. dependencies of the requests package) └ ...

La requestsbibliothèque est correctement située dans le python/lib/python3.11/site-packages répertoire. Cela garantit que Lambda peut localiser la bibliothèque lors des appels de fonctions.

Empaqueter le contenu de la couche

Dans cet exemple, vous allez empaqueter la requests bibliothèque Python dans un fichier .zip de couche. Procédez comme suit pour installer et empaqueter le contenu de la couche.

Pour installer et empaqueter le contenu de votre couche
  1. Clonez le aws-lambda-developer-guide GitHub dépôt, qui contient l'exemple de code dont vous avez besoin dans le sample-apps/layer-python répertoire.

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. Accédez au layer répertoire de l'layer-pythonexemple d'application. Ce répertoire contient les scripts que vous utilisez pour créer et empaqueter correctement la couche.

    cd aws-lambda-developer-guide/sample-apps/layer-python/layer
  3. Examinez le requirements.txtfichier. Ce fichier définit les dépendances que vous souhaitez inclure dans la couche, à savoir la requests bibliothèque. Vous pouvez mettre à jour ce fichier pour inclure les dépendances que vous souhaitez inclure dans votre propre couche.

    Exemple requirements.txt
    requests==2.31.0
  4. Vérifiez que vous êtes autorisé à exécuter les deux scripts.

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. Exécutez le 1-install.shscript à l'aide de la commande suivante :

    ./1-install.sh

    Ce script permet venv de créer un environnement virtuel Python nommécreate_layer. Il installe ensuite toutes les dépendances requises dans le create_layer/lib/python3.11/site-packages répertoire.

    Exemple 1-install.sh
    python3.11 -m venv create_layer source create_layer/bin/activate pip install -r requirements.txt
  6. Exécutez le 2-package.shscript à l'aide de la commande suivante :

    ./2-package.sh

    Ce script copie le contenu du create_layer/lib répertoire dans un nouveau répertoire nommépython. Il compresse ensuite le contenu du python répertoire dans un fichier nommélayer_content.zip. Il s'agit du fichier .zip de votre couche. Vous pouvez décompresser le fichier et vérifier qu'il contient la bonne structure de fichier, comme indiqué dans la Chemins de couche pour les environnements d'exécution Python section.

    Exemple 2-package.sh
    mkdir python cp -r create_layer/lib python/ zip -r layer_content.zip python

Création de la couche

Dans cette section, vous allez prendre le layer_content.zip fichier que vous avez généré dans la section précédente et le télécharger en tant que couche Lambda. Vous pouvez télécharger une couche à l'aide du AWS Management Console ou du Lambda API via le AWS Command Line Interface ()AWS CLI. Lorsque vous téléchargez le fichier .zip de votre couche, dans la PublishLayerVersion AWS CLI commande suivante, spécifiez python3.11 comme environnement d'exécution compatible et arm64 comme architecture compatible.

aws lambda publish-layer-version --layer-name python-requests-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes python3.11 \ --compatible-architectures "arm64"

Dans la réponse, notez leLayerVersionArn, qui ressemble àarn:aws:lambda:us-east-1:123456789012:layer:python-requests-layer:1. Vous aurez besoin de cet Amazon Resource Name (ARN) à l'étape suivante de ce didacticiel, lorsque vous ajouterez la couche à votre fonction.

Ajouter la couche à votre fonction

Dans cette section, vous déployez un exemple de fonction Lambda qui utilise la requests bibliothèque dans son code de fonction, puis vous attachez la couche. Pour déployer la fonction, vous avez besoin d'unDéfinition des autorisations d'une fonction Lambda avec un rôle d'exécution. Si vous n'avez pas de rôle d'exécution existant, suivez les étapes décrites dans la section pliable.

Pour créer un rôle d’exécution
  1. Ouvrez la page des rôles dans la IAM console.

  2. Choisissez Create role (Créer un rôle).

  3. Créez un rôle avec les propriétés suivantes :

    • Entité de confianceLambda.

    • AutorisationsAWSLambdaBasicExecutionRole.

    • Nom de rôlelambda-role.

    La AWSLambdaBasicExecutionRolepolitique dispose des autorisations dont la fonction a besoin pour écrire des CloudWatch journaux dans Logs.

Le code de fonction Lambda importe la requests bibliothèque, fait une HTTP demande simple, puis renvoie le code d'état et le corps.

import requests def lambda_handler(event, context): print(f"Version of requests library: {requests.__version__}") request = requests.get('https://api.github.com/') return { 'statusCode': request.status_code, 'body': request.text }
Pour déployer la fonction Lambda
  1. Accédez au répertoire function/. Si vous êtes actuellement dans le layer/ répertoire, exécutez la commande suivante :

    cd ../function
  2. Créez un package de déploiement de fichiers .zip à l'aide de la commande suivante :

    zip my_deployment_package.zip lambda_function.py
  3. Déployez la fonction. Dans la AWS CLI commande suivante, remplacez le --role paramètre par votre rôle d'exécution ARN :

    aws lambda create-function --function-name python_function_with_layer \ --runtime python3.11 \ --architectures "arm64" \ --handler lambda_function.lambda_handler \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://my_deployment_package.zip
  4. Ensuite, attachez la couche à votre fonction. Dans la AWS CLI commande suivante, remplacez le --layers paramètre par la version de couche ARN que vous avez indiquée précédemment :

    aws lambda update-function-configuration --function-name python_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:python-requests-layer:1"
  5. Enfin, essayez d'appeler votre fonction à l'aide de la AWS CLI commande suivante :

    aws lambda invoke --function-name python_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json

    Vous devriez obtenir un résultat du type suivant :

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }

    Le response.json fichier de sortie contient des informations détaillées sur la réponse.

Vous pouvez maintenant supprimer les ressources que vous avez créées pour ce didacticiel, sauf si vous souhaitez les conserver. En supprimant AWS les ressources que vous n'utilisez plus, vous évitez des frais inutiles pour votre Compte AWS.

Pour supprimer la couche Lambda
  1. Ouvrez la page Couches de la console Lambda.

  2. Sélectionnez la couche que vous avez créée.

  3. Choisissez Supprimer, puis sélectionnez à nouveau Supprimer.

Pour supprimer la fonction Lambda
  1. Ouvrez la page Functions (Fonctions) de la console Lambda.

  2. Sélectionnez la fonction que vous avez créée.

  3. Sélectionnez Actions, Supprimer.

  4. Saisissez delete dans la zone de saisie de texte et choisissez Delete (Supprimer).

Utilisation des distributions manylinux de roues

Parfois, un package que vous souhaitez inclure en tant que dépendance n'aura pas de roue universelle (en particulier, il n'en a pas any comme balise de plate-forme). Dans ce cas, téléchargez manylinux plutôt la roue qui le supporte. Cela garantit que vos bibliothèques de couches sont compatibles avec Amazon Linux.

numpyest un ensemble qui n'a pas de roue universelle. Si vous souhaitez inclure le numpy package dans votre couche, vous pouvez suivre les exemples d'étapes suivants pour installer et empaqueter correctement votre couche.

Pour installer et empaqueter le contenu de votre couche
  1. Clonez le aws-lambda-developer-guide GitHub dépôt, qui contient l'exemple de code dont vous avez besoin dans le sample-apps/layer-python répertoire.

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. Accédez au layer-numpy répertoire de l'layer-pythonexemple d'application. Ce répertoire contient les scripts que vous utilisez pour créer et empaqueter correctement la couche.

    cd aws-lambda-developer-guide/sample-apps/layer-python/layer-numpy
  3. Examinez le requirements.txtfichier. Ce fichier définit les dépendances que vous souhaitez inclure dans votre couche, à savoir la numpy bibliothèque. Ici, vous spécifiez la distribution URL de la manylinux roue compatible avec Python 3.11, Amazon Linux et le jeu x86_64 d'instructions :

    Exemple requirements.txt
    https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  4. Vérifiez que vous êtes autorisé à exécuter les deux scripts.

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. Exécutez le 1-install.shscript à l'aide de la commande suivante :

    ./1-install.sh

    Ce script permet venv de créer un environnement virtuel Python nommécreate_layer. Il installe ensuite toutes les dépendances requises dans le create_layer/lib/python3.11/site-packages répertoire. La pip commande est différente dans ce cas, car vous devez spécifier le --platform tag commemanylinux2014_x86_64. Cela indique pip d'installer la bonne manylinux roue, même si votre machine locale utilise macOS ou Windows.

    Exemple 1-install.sh
    python3.11 -m venv create_layer source create_layer/bin/activate pip install -r requirements.txt --platform=manylinux2014_x86_64 --only-binary=:all: --target ./create_layer/lib/python3.11/site-packages
  6. Exécutez le 2-package.shscript à l'aide de la commande suivante :

    ./2-package.sh

    Ce script copie le contenu du create_layer/lib répertoire dans un nouveau répertoire nommépython. Il compresse ensuite le contenu du python répertoire dans un fichier nommélayer_content.zip. Il s'agit du fichier .zip de votre couche. Vous pouvez décompresser le fichier et vérifier qu'il contient la bonne structure de fichier, comme indiqué dans la Chemins de couche pour les environnements d'exécution Python section.

    Exemple 2-package.sh
    mkdir python cp -r create_layer/lib python/ zip -r layer_content.zip python

Pour télécharger cette couche sur Lambda, utilisez la commande suivante : PublishLayerVersion AWS CLI

aws lambda publish-layer-version --layer-name python-numpy-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes python3.11 \ --compatible-architectures "x86_64"

Dans la réponse, notez leLayerVersionArn, qui ressemble àarn:aws:lambda:us-east-1:123456789012:layer:python-numpy-layer:1. Pour vérifier que votre couche fonctionne comme prévu, déployez la fonction Lambda dans le function-numpy répertoire.

Pour déployer la fonction Lambda
  1. Accédez au répertoire function-numpy/. Si vous êtes actuellement dans le layer-numpy/ répertoire, exécutez la commande suivante :

    cd ../function-numpy
  2. Vérifiez le code de fonction. La fonction importe la numpy bibliothèque, crée un numpy tableau simple, puis renvoie un code d'état et un corps fictifs.

    import json import numpy as np def lambda_handler(event, context): x = np.arange(15, dtype=np.int64).reshape(3, 5) print(x) return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
  3. Créez un package de déploiement de fichiers .zip à l'aide de la commande suivante :

    zip my_deployment_package.zip lambda_function.py
  4. Déployez la fonction. Dans la AWS CLI commande suivante, remplacez le --role paramètre par votre rôle d'exécution ARN :

    aws lambda create-function --function-name python_function_with_numpy \ --runtime python3.11 \ --handler lambda_function.lambda_handler \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://my_deployment_package.zip
  5. Ensuite, attachez la couche à votre fonction. Dans la AWS CLI commande suivante, remplacez le --layers paramètre par la version de votre couche ARN :

    aws lambda update-function-configuration --function-name python_function_with_numpy \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:python-requests-layer:1"
  6. Enfin, essayez d'appeler votre fonction à l'aide de la AWS CLI commande suivante :

    aws lambda invoke --function-name python_function_with_numpy \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json

    Vous devriez obtenir un résultat du type suivant :

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }

    Vous pouvez examiner les journaux des fonctions pour vérifier que le code imprime le numpy tableau conformément à la norme.