J'ai entendu dire qu'AWS Lambda prend en charge Python 3.6, j'ai donc décidé d'écrire la fonction Lambda que j'avais écrite dans Node.js en Python, mais Lambda qui inclut des modules écrits en C tels que numpy. Lorsque je déploie une fonction à partir d'un Mac, il est difficile de l'exécuter sur Lambda car elle indique ** "C'est un module conçu pour le Mac, donc il ne peut pas être chargé" **.
J'ai résolu ce problème avec Docker, je vais donc résumer comment le faire.
[Mis à jour le 25 mars 2020] J'ai également écrit sur la création d'une couche Lambda. Créer une couche pour AWS Lambda Python avec Docker-Qiita
Cette fois, envisagez de déployer une fonction Lambda qui ne fait que charger numpy comme ceci:
Structure du répertoire
.
├── main.py
└── requirements.txt
main.py
import numpy
def handler(event, context):
pass
requirements.txt
numpy
La commande suivante installe numpy dans le même répertoire, mais elle ne fonctionne pas sur Lambda car numpy est une version Mac, même si je la compresse et la déploie.
$ pip install -r requirements.txt -t .
Vous devriez probablement obtenir cette erreur.
Unable to import module 'main':
Importing the multiarray numpy extension module failed. Most likely you are trying to import a failed build of numpy.
If you're working with a numpy git repo, try `git clean -xdf` (removes all files not under version control). Otherwise reinstall numpy.
Original error was: cannot import name 'multiarray'
Lorsque je recherche la solution sur Google, je n'obtiens qu'une réponse mystérieuse telle que "Lancer une instance Amazon Linux et la construire là-bas". ** Je veux un serveur sans serveur avec AWS Lambda, mais j'ai besoin d'un serveur pour le déploiement ** Comment est-ce? ?? ??
En bref, j'aimerais pouvoir construire dans un environnement Linux. Vous pouvez le faire avec Docker.
Pour exécuter la commande ci-dessus sur le conteneur Docker, procédez comme suit.
$ docker run --rm -v $(pwd):/work -w /work python:3.6 pip install -r requirements.txt -t .
Lancez le conteneur depuis l'image Python 3.6 [^ linux], montez le répertoire courant dans le répertoire de travail / work
, et installez le package là-bas. Lorsque la construction est terminée, ce conteneur n'est plus nécessaire, j'ai donc ajouté l'option --rm
pour le supprimer.
[^ linux]: python: 3.6
L'image est basée sur Debian, donc elle est différente de l'environnement d'exécution Lambda (Amazon Linux), mais elle a été installée numpy-1.13.1-cp36-cp36m-manylinux1_x86_64.whl
Donc je pense que Linux va bien. Il peut y avoir des modules défectueux autres que numpy, mais dans ce cas, vous pouvez supprimer l'image Amazon Linux Docker.
Maintenant que vous avez un numpy intégré dans un environnement Linux, vous devriez pouvoir le solidifier et le déployer.
Vous pourriez vous demander: "Une fois que vous avez installé un module pour Linux, vous ne pouvez pas l'exécuter sur votre Mac pendant le développement."
Bien sûr, il ne peut pas fonctionner sur un Mac, mais je pense qu'il est préférable de tout exécuter dans un conteneur Docker lors du développement.
$ docker run --rm -v $(pwd):/work -w /work python:3.6 python -c 'import main; main.handler({}, None)'
Comme ça.
Recommended Posts