Package de déploiement AWS Lambda dans Python - AWS Lambda

Package de déploiement AWS Lambda dans Python

Pour créer une image de conteneur afin de déployer votre code de fonction, veuillez consulter .

Un package de déploiement est une archive .zip qui contient le code et les dépendances de la fonction. Vous devez créer une archive de fichier .zip si vous utilisez l'API Lambda pour gérer les fonctions, ou si vous devez inclure des bibliothèques et des dépendances autres que le kit AWS SDK. Vous pouvez charger le package directement dans Lambda, ou vous pouvez utiliser un compartiment Amazon Simple Storage Service (Amazon S3) puis le charger dans Lambda. Si le package de déploiement est supérieur à 50 Mo, vous devez utiliser Amazon S3.

Si vous utilisez l'éditeur de console Lambda pour créer votre fonction, la console gère le package de déploiement. Vous pouvez utiliser cette méthode tant que vous n'avez pas besoin d'ajouter des bibliothèques. Vous pouvez également l'utiliser pour mettre à jour une fonction qui a déjà des bibliothèques dans le package de déploiement, tant que la taille totale ne dépasse pas 3 MB.

Note

Vous pouvez utiliser la commande build de l'interface de ligne de commande AWS SAM pour créer un package de déploiement pour le code et les dépendances de votre fonction Python. L' interface de ligne de commande AWS SAM fournit également une option pour générer votre package de déploiement à l'intérieur d'une image Docker compatible avec l'environnement d'exécution Lambda. Pour obtenir des instructions, consultez Création d'applications avec des dépendances dans le manuel du développeur AWS SAM.

Prérequis

Ces instructions supposent que vous avez déjà une fonction. Si vous n'avez pas encore créé de fonction, veuillez consulter Création de fonctions Lambda avec Python.

Pour effectuer les étapes suivantes, vous avez besoin d'un terminal de ligne de commande ou d'un shell pour exécuter les commandes. Les commandes sont affichées dans les listes précédées d'un symbole d'invite ($) et du nom du répertoire actuel, le cas échéant :

~/lambda-project$ this is a command this is output

Pour les commandes longues, un caractère d'échappement (\) est utilisé afin de fractionner la commande sur plusieurs lignes.

Sur Linux et macOS, utilisez votre gestionnaire de shell et de package préféré. Sur Windows 10, vous pouvez installer le sous-système Windows pour Linux afin d'obtenir une version intégrée à Windows d'Ubuntu et Bash.

Mise à jour d'une fonction sans dépendances

Pour créer ou mettre à jour une fonction à l'aide de l'API Lambda, créez une archive contenant le code de votre fonction et chargez-la avec l'AWS CLI.

Pour mettre à jour une fonction Python sans dépendances

  1. Créez une archive ZIP.

    ~/my-function$ zip function.zip lambda_function.py adding: lambda_function.py (deflated 17%)
  2. Utilisez le préfixe fileb:// pour télécharger le package de déploiement ZIP binaire sur Lambda et mettre à jour le code de la fonction.

    ~/my-function$ aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function", "Runtime": "python3.8", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "lambda_function.lambda_handler", "CodeSize": 815, "CodeSha256": "GcZ05oeHoJi61VpQj7vCLPs8DwCXmX5sE/fE2IHsizc=", "Version": "$LATEST", "RevisionId": "d1e983e3-ca8e-434b-8dc1-7add83d72ebd", ... }

Mise à jour d'une fonction avec dépendances supplémentaires

Si votre fonction dépend de bibliothèques autres que le Kit SDK pour Python (Boto3), installez-les dans un répertoire local avec pip, et incluez-les dans votre package de déploiement.

Note

Pour les bibliothèques qui utilisent des modules d'extension écrits en C ou C++, créez votre package de déploiement dans un environnement Amazon Linux. Vous pouvez utiliser la commande SAM CLI build, qui utilise Docker, ou construire votre package de déploiement sur Amazon EC2 ou CodeBuild.

L'exemple suivant montre comment créer un package de déploiement qui inclut une bibliothèque de traitement d'images nommée Pillow.

Pour mettre à jour une fonction Python avec des dépendances

  1. Installez les bibliothèques dans un nouveau répertoire package local au projet avec l'option --target de pip.

    ~/my-function$ pip install --target ./package Pillow Collecting Pillow Using cached https://files.pythonhosted.org/packages/62/8c/230204b8e968f6db00c765624f51cfd1ecb6aea57b25ba00b240ee3fb0bd/Pillow-5.3.0-cp37-cp37m-manylinux1_x86_64.whl Installing collected packages: Pillow Successfully installed Pillow-5.3.0
    Note

    Pour que --target fonctionne sur les systèmes basés sur Debian comme Ubuntu, vous pouvez aussi avoir besoin de transmettre l'indicateur --system pour empêcher les erreurs distutils.

  2. Créez une archive ZIP des dépendances.

    ~/my-function$ cd package ~/my-function/package$ zip -r9 ${OLDPWD}/function.zip . adding: PIL/ (stored 0%) adding: PIL/.libs/ (stored 0%) adding: PIL/.libs/libfreetype-7ce95de6.so.6.16.1 (deflated 65%) adding: PIL/.libs/libjpeg-3fe7dfc0.so.9.3.0 (deflated 72%) adding: PIL/.libs/liblcms2-a6801db4.so.2.0.8 (deflated 67%) ...
  3. Ajoutez le code de votre fonction dans l'archive.

    ~/my-function/package$ cd $OLDPWD ~/my-function$ zip -g function.zip lambda_function.py adding: lambda_function.py (deflated 56%)
  4. Utilisez le préfixe fileb:// pour télécharger le package de déploiement ZIP binaire sur Lambda et mettre à jour le code de la fonction.

    ~/my-function$ aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function", "Runtime": "python3.8", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "lambda_function.lambda_handler", "CodeSize": 2269409, "CodeSha256": "GcZ05oeHoJi61VpQj7vCLPs8DwCXmX5sE/fE2IHsizc=", "Version": "$LATEST", "RevisionId": "a9c05ffd-8ad6-4d22-b6cd-d34a00c1702c", ... }

Avec un environnement virtuel

Dans certains cas, vous pouvez être amené à utiliser un environnement virtuel pour installer les dépendances de votre fonction. Cela peut se produire si votre fonction ou ses dépendances ont des dépendances sur les bibliothèques natives, ou si vous avez utilisé Homebrew pour installer Python.

Pour mettre à jour une fonction Python avec un environnement virtuel

  1. Créez un environnement virtuel.

    ~/my-function$ virtualenv v-env Using base prefix '~/.local/python-3.7.0' New python executable in v-env/bin/python3.8 Also creating executable in v-env/bin/python Installing setuptools, pip, wheel... done.
    Note

    Pour Python 3.3 et versions ultérieures, vous pouvez utiliser le module venv intégré pour créer un environnement virtuel, au lieu d'installer virtualenv.

    ~/my-function$ python3 -m venv v-env
  2. Activez l'environnement.

    ~/my-function$ source v-env/bin/activate (v-env) ~/my-function$
  3. Installez les bibliothèques avec pip.

    (v-env) ~/my-function$ pip install Pillow Collecting Pillow Using cached https://files.pythonhosted.org/packages/62/8c/230204b8e968f6db00c765624f51cfd1ecb6aea57b25ba00b240ee3fb0bd/Pillow-5.3.0-cp37-cp37m-manylinux1_x86_64.whl Installing collected packages: Pillow Successfully installed Pillow-5.3.0
  4. Désactivez l'environnement virtuel.

    (v-env) ~/my-function$ deactivate
  5. Créez une archive ZIP avec le contenu de la bibliothèque.

    ~/my-function$ cd v-env/lib/python3.8/site-packages ~/my-function/v-env/lib/python3.8/site-packages$ zip -r9 ${OLDPWD}/function.zip . adding: easy_install.py (deflated 17%) adding: PIL/ (stored 0%) adding: PIL/.libs/ (stored 0%) adding: PIL/.libs/libfreetype-7ce95de6.so.6.16.1 (deflated 65%) adding: PIL/.libs/libjpeg-3fe7dfc0.so.9.3.0 (deflated 72%) ...

    En fonction de la bibliothèque, les dépendances peuvent apparaître dans site-packages ou dist-packages, et le premier dossier dans l'environnement virtuel peut être lib ou lib64. Vous pouvez utiliser la commande pip show pour localiser un package spécifique.

  6. Ajoutez le code de votre fonction dans l'archive.

    ~/my-function/v-env/lib/python3.8/site-packages$ cd $OLDPWD ~/my-function$ zip -g function.zip lambda_function.py adding: lambda_function.py (deflated 56%)
  7. Utilisez le préfixe fileb:// pour télécharger le package de déploiement ZIP binaire sur Lambda et mettre à jour le code de la fonction.

    ~/my-function$ aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function", "Runtime": "python3.8", "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", ... }