Déployer des fonctions Lambda en Python avec des archives de fichiers .zip - AWS Lambda

Déployer des fonctions Lambda en Python avec des archives de fichiers .zip

Le code de votre fonction AWS Lambda se compose de scripts ou de programmes compilés et leurs dépendances. Pour déployer votre code de fonction vers Lambda, vous utilisez un package de déploiement. Lambda prend en charge deux types de packages de déploiement : les images conteneurs et les archives de fichiers .zip.

Pour créer le package de déploiement pour une archive de fichier .zip, vous pouvez utiliser un utilitaire d’archivage de fichier .zip intégré ou tout autre utilitaire de fichier .zip (tel que 7zip) pour votre outil de ligne de commande. Remarque : les exigences suivantes s’applique à l’utilisation d’un fichier .zip en tant que package de déploiement :

  • Le fichier .zip contient le code de votre fonction et toutes les dépendances utilisées pour exécuter le code de votre fonction (le cas échéant) sur Lambda. Si votre fonction dépend uniquement des bibliothèques standard ou des bibliothèques de kits SDK AWS, vous n’avez pas besoin d’inclure ces bibliothèques dans votre fichier .zip. Ces bibliothèques sont incluses dans les environnements de l’environnement d’exécution Lambda pris en charge.

  • Si le fichier .zip est supérieur à 50 Mo, nous vous recommandons de le charger dans votre fonction à partir d’un compartiment Amazon Simple Storage Service (Amazon S3).

  • Si votre package de déploiement contient des bibliothèques natives, vous pouvez créer le package de déploiement avec AWS Serverless Application Model (AWS SAM). Vous pouvez utiliser la commande AWS SAM de la CLI sam build avec le --use-container pour créer votre package de déploiement. Cette option génère un package de déploiement à l’intérieur d’une image Docker compatible avec l’environnement d’exécution Lambda.

    Pour plus d’informations, consultez sam build dans le Guide du développeur AWS Serverless Application Model.

  • Vous devez créer le package de déploiement pour être compatible avec cette architecture de l’ensemble des instructions de la fonction.

  • Lambda utilise les autorisations de fichiers POSIX. Ainsi, vous pourriez devoir définir des autorisations pour le dossier du package de déploiement avant de créer l’archive de fichiers .zip.

Note

Un package python peut contenir du code d’initialisation dans le fichier __init__.py. Avant Python 3.9, Lambda n’exécutait pas le code __init__.py pour les packages dans le répertoire, ou les répertoires parents, du gestionnaire de fonction. Dans Python 3.9 et les versions ultérieures, Lambda exécute le code d’initialisation pour les packages de ces répertoires lors de l’initialisation.

Notez que Lambda exécute le code d’initialisation uniquement lorsque l’environnement d’exécution est initialisé pour la première fois, pas pour chaque appel de fonction dans cet environnement initialisé.

Prérequis

Vous avez besoin de l’AWS Command Line Interface (AWS CLI) pour appeler les opérations d’API de service. Pour installer l’AWS CLI, consultez Installation de l’AWS CLI dans le Guide de l’utilisateur AWS Command Line Interface.

Qu’est-ce qu’une dépendance d’environnement d’exécution ?

Un package de déploiement est requis pour créer ou mettre à jour une fonction Lambda avec ou sans dépendances d’environnement d’exécution. Le package de déploiement agit comme le bundle source pour exécuter le code et les dépendances (le cas échéant) de votre fonction sur Lambda.

Une dépendance peut être n’importe quel package, module ou autre dépendance d’assemblage non inclus avec l’environnement d’environnements d’exécution Lambda pour le code de votre fonction.

L’exemple suivant décrit une fonction Lambda sans dépendance d’environnement d’exécution :

  • Si le code de votre fonction est en Python 3.8 (ou version ultérieure) et dépend uniquement des bibliothèques de journalisation et de mathématiques Python standards, vous n’avez pas besoin d’inclure les bibliothèques dans votre fichier .zip. Ces bibliothèques sont incluses avec l’environnement d’exécution Python.

  • Si le code de votre fonction dépend de AWS SDK for Python (Boto3), vous n’avez pas besoin d’inclure la bibliothèque boto3 dans votre fichier .zip. Ces bibliothèques sont incluses dans les environnements d’exécution de Python3.8 et des versions ultérieures.

Remarque : Lambda met régulièrement à jour les bibliothèques Boto3 afin d’activer le dernier ensemble de mises à jour des fonctions et de sécurité. Pour disposer du contrôle total des dépendances que votre fonction utilise, empaquetez toutes vos dépendances avec votre package de déploiement.

Package de déploiement sans dépendance

Créez le fichier .zip pour votre package de déploiement.

Pour créer le package de déploiement
  1. Ouvrez une invite de commandes et créez un répertoire de projet my-math-function. Par exemple, sur macOS :

    mkdir my-math-function
  2. Accédez au répertoire du projet my-math-function.

    cd my-math-function
  3. Copiez le contenu de l’exemple de code Python de GitHub et enregistrez-le dans un nouveau fichier nommé lambda_function.py. Votre structure de répertoire devrait se présenter comme suit :

    my-math-function$ | lambda_function.py
  4. Ajoutez le fichier lambda_function.py à la racine du fichier .zip.

    zip my-deployment-package.zip lambda_function.py

    Cela génère un fichier my-deployment-package.zip dans votre répertoire de projet. La commande produit le résultat suivant :

    adding: lambda_function.py (deflated 50%)

Package de déploiement avec dépendances

Créez le fichier .zip pour votre package de déploiement.

Pour créer le package de déploiement
  1. Ouvrez une invite de commandes et créez un répertoire de projet my-sourcecode-function. Par exemple, sur macOS :

    mkdir my-sourcecode-function
  2. Accédez au répertoire du projet my-sourcecode-function.

    cd my-sourcecode-function
  3. Copiez le contenu de l’exemple de code Python suivant et enregistrez-le dans un nouveau fichier nommé lambda_function.py :

    import requests def lambda_handler(event, context): response = requests.get("https://www.example.com/") print(response.text) return response.text

    Votre structure de répertoire devrait se présenter comme suit :

    my-sourcecode-function$ | lambda_function.py
  4. Installez la bibliothèque de requêtes dans un nouveau répertoire package.

    pip install --target ./package requests
  5. Créez un package de déploiement avec la bibliothèque installée à la racine.

    cd package zip -r ../my-deployment-package.zip .

    Cela génère un fichier my-deployment-package.zip dans votre répertoire de projet. La commande produit le résultat suivant :

    adding: chardet/ (stored 0%) adding: chardet/enums.py (deflated 58%) ...
  6. Ajoutez le fichier lambda_function.py à la racine du fichier .zip.

    cd .. zip my-deployment-package.zip lambda_function.py

Utilisation d’un environnement virtuel

Pour mettre à jour une fonction Python en utilisant un environnement virtuel
  1. Activez l’environnement virtuel. Exemples :

    ~/my-function$ source myvenv/bin/activate
  2. Installez les bibliothèques avec pip.

    (myvenv) ~/my-function$ pip install requests
  3. Désactivez l’environnement virtuel.

    (myvenv) ~/my-function$ deactivate
  4. Créez un package de déploiement avec les bibliothèques installées à la racine.

    ~/my-function$cd myvenv/lib/python3.8/site-packages zip -r ../../../../my-deployment-package.zip .

    La dernière commande enregistre le package de déploiement à la racine du répertoire my-function.

    Astuce

    Une bibliothèque peut apparaître dans site-packages ou dist-packages et le premier dossier lib ou lib64. Vous pouvez utiliser la commande pip show pour localiser un package spécifique.

  5. Ajoutez des fichiers de code de fonction à la racine de votre package de déploiement.

    ~/my-function/myvenv/lib/python3.8/site-packages$ cd ../../../../ ~/my-function$ zip -g my-deployment-package.zip lambda_function.py

    Une fois cette étape accomplie, vous devez disposer de la structure de répertoire suivante :

    my-deployment-package.zip$ │ lambda_function.py │ __pycache__ │ certifi/ │ certifi-2020.6.20.dist-info/ │ chardet/ │ chardet-3.0.4.dist-info/ ...

Déployez votre fichier .zip sur la fonction

Pour déployer le nouveau code sur votre fonction, vous chargez le nouveau fichier .zip de package de déploiement. Vous pouvez utiliser la console Lambda pour charger un fichier .zip vers la fonction, ou la commande UpdateFunctionCode de la CLI.

L’exemple suivant charge un fichier nommé my-deployment-package.zip. Utilisez le préfixe de fichier fileb:// afin de charger le fichier .zip binaire dans Lambda.

~/my-function$ aws lambda update-function-code --function-name MyLambdaFunction --zip-file fileb://my-deployment-package.zip { "FunctionName": "mylambdafunction", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:mylambdafunction", "Runtime": "python3.9", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "lambda_function.lambda_handler", "CodeSize": 5912988, "CodeSha256": "A2P0NUWq1J+LtSbkuP8tm9uNYqs1TAa3M76ptmZCw5g=", "Version": "$LATEST", "RevisionId": "5afdc7dc-2fcb-4ca8-8f24-947939ca707f", ... }