Comment puis-je créer une couche Lambda à l'aide d'un environnement Lambda simulé avec Docker ?

Dernière mise à jour : 19/12/2019

Je souhaite créer une couche AWS Lambda compatible avec les versions d'exécution de mon environnement cible. Comment dois-je procéder ?

Brève description

Lorsque vous développez des fonctions Lambda, vous avez le choix entre diverses versions d'exécution Lambda prises en charge. À l'aide des images Docker lambci/lambda, vous pouvez simuler l'environnement Lambda en direct, et créer une couche compatible avec les versions d'exécution que vous spécifiez. Pour plus d'informations, consultez la page lambci/lambda du site Web de Docker.

Tenez compte du fait que les images lambci/lambda ne constituent pas une copie exacte de l'environnement Lambda et que certains fichiers peuvent être manquants.

Remarque : AWS Serverless Application Model (AWS SAM) utilise également les images Docker lambci/lambda lorsque vous exécutez la commande sam local start-api afin de tester localement une application sans serveur.

Solution

Remarque : Python est utilisé dans ces instructions. Pour les autres langages, adaptez les étapes en conséquence.

1.    Si ce n'est pas déjà fait, installez Docker pour Linux, Windows ou macOS sur votre ordinateur.

2.    Créez la structure de répertoire appropriée et spécifiez vos dépendances dans le fichier Requirements (requirements.txt) de pip. Pour plus d'informations, consultez la section Fichiers Requirements du guide de l'utilisateur de la commande pip.

Si vous souhaitez que votre couche Lambda soit compatible avec les versions 3.6 et 3.8 de Python, la structure doit être similaire à ce qui suit :

├── requirements.txt
└── python/
    └── lib/
        ├── python3.6/
        │   └── site-packages/
        └── python3.8/
            └── site-packages/

Remarque : la taille totale de la fonction et de toutes les couches, après décompression, ne peut pas dépasser la taille du package de déploiement, qui est de 250 Mo après décompression.

Pour plus d'informations sur la prise en charge des versions de Python par Lambda, consultez la section Création de fonctions Lambda avec Python.

3.    Exécutez la commande suivante une fois avec chaque version d'exécution que vous avez spécifiée dans la structure de répertoire. Ceci permet d'installer, dans le sous-dossier approprié, les bibliothèques compatibles avec cette version d'exécution.

Remarque : remplacez 3.6 par 3.7 ou 3.8, en fonction des bibliothèques compatibles que vous souhaitez installer.

docker run -v "$PWD":/var/task "lambci/lambda:build-python3.6" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.6/site-packages/; exit"

4.    Créez le package de la couche en compressant le dossier python. Le fichier .zip est décompressé dans le dossier /opt de l'environnement Lambda, directement accessible à l'aide du code de votre fonction Lambda.

Remarque : remplacez mypythonlibs par le nom de votre choix.

zip -r mypythonlibs.zip python > /dev/null

5.    Exécutez la commande suivante pour créer ou mettre à jour la couche. Assurez-vous d'inclure les versions d'exécution compatibles que vous avez spécifiées précédemment.

Remarque : remplacez mypythonlibs par le nom du package que vous avez utilisé à l'étape précédente. Remplacez My python libs par la description de votre choix.

aws lambda publish-layer-version --layer-name mypythonlibs --description "My python libs" --zip-file fileb://mypythonlibs.zip --compatible-runtimes "python2.7" "python3.6" "python3.7"

Dans le résultat, prenez note de l'Amazon Resource Name (ARN) de la couche. Vous en aurez besoin à l'étape suivante.

6.    Exécutez la commande suivante. Ceci permet de mettre à jour la configuration de votre fonction Lambda afin que la couche soit utilisée.

Remarque : remplacez arn:aws:lambda:us-east-2:123456789012:layer:mypythonlibs:1 par l'ARN de la couche obtenu à l'étape précédente.

aws lambda update-function-configuration --layers arn:aws:lambda:us-east-2:123456789012:layer:mypythonlibs:1 --function-name my-function

Facultatif : utilisation des images Docker avec votre package Lambda

Vous pouvez également utiliser les images Docker lambci/lambda directement avec votre package Lambda, sans créer de couche. Exécutez la commande suivante pour obtenir les versions requises de vos dépendances :

Remarque : remplacez 3.6 par 3.7 ou 3.8, en fonction des bibliothèques compatibles que vous souhaitez installer.

docker run -v "$PWD":/var/task "lambci/lambda:build-python3.6" /bin/sh -c "pip install -r requirements.txt -t libs; exit"

Ensuite, créez un package de déploiement Lambda incluant le code de votre fonction et les bibliothèques appropriées.