J'aimerais voir comment déployer un module externe sur AWS Lambda (Lambda). Prenons Python comme exemple.
Ordre d'exécution
Peu importe celui que vous choisissez pour * 2.
Cette étape n'est pas nécessaire pour les modules écrits en Pure Python sans utiliser le langage C en interne tel que le module de requêtes. *** Cependant, pour les modules qui dépendent du langage C, tels que numpy et scipy, il est plus facile de développer dans le même environnement que l'environnement d'exécution Lambda. Même si vous zippez et déployez numpy installé sur Windows ou Mac, une erreur se produira. *** ***
Ici, nous utiliserons l'image Docker disponible publiquement *** lambci / lambda: build-python3.7 *** comme environnement pour Amazon Linux 2.
Créez un répertoire approprié et créez le code source (lambda_function.py) et Dockerfile à exécuter par Lambda.
Contenu de Dockerfile
FROM lambci/lambda:build-python3.7
CMD ["pip3","install","numpy","-t","/var/task"]
Le contenu de lambda_function.py est approprié
import numpy as np
def lambda_handler(event,context):
print(np.arange(10).reshape(2,5))
Création de la source et du Dockerfile terminée
~$ ls
Dockerfile lambda_function.py
Après cela, créez et exécutez.
~$ docker image build -t numpy:latest .
~$ docker container run --rm -v ${PWD}:/var/task numpy:latest
*** -v $ {PWD}: / var / task pour faire référence au module externe installé dans le conteneur même dans l'OS hôte. *** ***
À propos, / var / task est l'un des chemins auxquels Lambda fait référence pour importer des modules externes. Si vous exécutez dans un conteneur Docker, vous devez placer le module externe dans ce chemin. À titre de test, vérifiez le chemin avec Lambda comme suit.
import sys
def lambda_handler(event,context):
print(sys.path)
"""
python3.Résultat d'exécution en 7
['/var/task', '/opt/python/lib/python3.7/site-packages', '/opt/python', '/var/runtime', '/var/lang/lib/python37.zip', '/var/lang/lib/python3.7', '/var/lang/lib/python3.7/lib-dynload', '/var/lang/lib/python3.7/site-packages', '/opt/python/lib/python3.7/site-packages', '/opt/python']
"""
Si la commande ci-dessus réussit, le module source et externe (numpy) doivent être dans la même hiérarchie. Tout ce que vous avez à faire est de le compresser avec la couche Lambda ou le fichier source et de le déployer. Veuillez donc choisir l'une des 2 suivantes.
~$ ls
Dockerfile bin lambda_function.py numpy numpy-1.18.3.dist-info numpy.libs
Comme mentionné ci-dessus, créez un répertoire python et déplacez-y les fichiers et répertoires associés numpy afin que Lambda puisse charger des modules externes. Si vous avez créé le répertoire python au début de la procédure d'exécution, vous n'avez pas besoin d'effectuer les opérations suivantes.
~$ mkdir python
~$ mv bin numpy numpy-1.18.3.dist-info numpy.libs python
Compressez le module externe et déployez-le sur la couche Lambda.
~$ zip -rq numpy.zip python
Compressez les fichiers source et déployez-les avec la console Lambda ou l'AWS CLI.
~$ zip -q lambda_function.zip lambda_function.py
compressez-le et déployez-le avec la console Lambda ou l'AWS CLI. Lorsque vous utilisez Lambda Layer, séparez le module externe et le fichier source, mais cette fois je vais les compresser tous ensemble. La cible zip est donc *.
~$ zip -rq numpy.zip *
Lors du déploiement sur Lambda, il est peut-être trop volumineux pour être affiché à l'écran (numpy est presque invisible), mais il peut être exécuté.