[PYTHON] [AWS Lambda] Créer un package de déploiement à l'aide de l'image Amazon Linux Docker

Si vous souhaitez utiliser une bibliothèque qui ne se trouve pas dans l'environnement d'exécution AWS Lambda, vous devez télécharger le groupe source de bibliothèque dans l'environnement local, l'inclure dans le package de déploiement et le télécharger sur Lambda.

Dans le cas de Python, par exemple, les étapes suivantes sont effectuées lors de la création d'un package de déploiement.

$ virtualenv -p python2.7 venv
$ source venv/bin/activate
$ pip install -r requirements.txt
$ zip deploy_package.zip lambda_function.py #Rendre le script d'exécution zip
$ cd venv/lib/python2.7/site-packages
$ zip -r ../../../../deploy_package.zip * #Ajouter la bibliothèque installée par pip à zip

Si la bibliothèque que vous souhaitez utiliser est du code Python pur, ce package fonctionnera sur Lambda sans aucun problème, mais si la bibliothèque dépend des fonctions du système d'exploitation, Lambda sera construite et installée dans l'environnement local. Cela ne fonctionne pas même si je le télécharge ci-dessus. Dans l'exemple ci-dessus, pip install doit être effectué dans le même environnement que l'environnement d'exécution de Lambda.

Exemple d'échec

Créez et exécutez une fonction Lambda qui utilise une bibliothèque appelée pycrypto.

requirements.txt


pycrypto==2.6.1

lambda_function.py


from Crypto.PublicKey import RSA


def lambda_handler(event, context):
    return {"messagge": "success"}

Préparez les fichiers ci-dessus et créez un package de déploiement dans votre environnement OS X local.

$ virtualenv -p python2.7 venv
$ source venv/bin/activate
$ pip install -r requirements.txt
$ zip deploy_package.zip lambda_function.py
$ cd venv/lib/python2.7/site-packages
$ zip -r ../../../../deploy_package.zip *

Lorsque je télécharge le fichier deploy_package.zip créé sur AWS Lambda et que je l'exécute, j'obtiens l'erreur suivante: Unable to import module 'lambda_function'

Unable to import module 'lambda_function'

En regardant le texte complet du journal des erreurs, il dit «Impossible d'importer le module'lambda_function»: /var/task/Crypto/Util/_counter.so: en-tête ELF invalide ». Il semble que les informations d'en-tête du fichier référencé par pycrypto ne soient pas valides. La cause est que l'environnement dans lequel pycrypto est installé est différent de l'environnement d'exécution Lambda.

Contre-mesures

Vous pouvez contourner ce problème en installant la bibliothèque à l'aide de l'image Amazon Linux Docker.

Préparez un tel Dockerfile dans la même hiérarchie que le fichier ci-dessus

Dockerfile


FROM amazonlinux:latest

RUN yum -y update && yum -y install gcc python27-devel
RUN cd /tmp && \
    curl https://bootstrap.pypa.io/get-pip.py | python2.7 - && \
    pip install virtualenv
WORKDIR /app
CMD virtualenv -p python2.7 venv-for-deployment && \
    source venv-for-deployment/bin/activate && \
    pip install -r requirements.txt

L'exécution de cette commande crée un code de bibliothèque Python construit sur Amazon Linux avec le nom venv-for-deployment.

$ docker build . -t packager
$ docker run --rm -it -v $(PWD):/app packager

Créez ensuite un zip du package de déploiement et téléchargez-le sur AWS Lambda comme indiqué ci-dessous.

$ zip deploy_package.zip lambda_function.py
$ cd venv-for-deployment/lib/python2.7/site-packages
$ zip -r ../../../../deploy_package.zip * .* #Si dotfile est inclus".*"Aussi

Lorsqu'elle est exécutée, la bibliothèque peut être importée et «" succès "» s'affiche en toute sécurité.

success

Automatisation

Puisqu'il y a beaucoup de commandes à frapper un peu, il est pratique de créer un Makefile comme celui-ci car un zip sera généré juste par make.

Makefile


package:
	docker build . -t packager
	docker run --rm -it -v $(PWD):/app packager
	zip deploy_package.zip lambda_function.py
	cd venv-for-deployment/lib/python2.7/site-packages && zip -r ../../../../deploy_package.zip * .*
	echo "Completed. Please upload deploy_package.zip to AWS Lambda"

échantillon

L'échantillon de fonction Lambda utilisé cette fois est placé dans ce référentiel. https://github.com/morishin/python-lambda-function-test

Impressions

AWS Lambda C'est pratique, mais lorsque vous essayez de faire quelque chose d'un peu élaboré, vous pleurez presque.

Recommended Posts

[AWS Lambda] Créer un package de déploiement à l'aide de l'image Amazon Linux Docker
Créer une image de conteneur Docker avec JRE8 / JDK8 sur Amazon Linux
Créer une couche pour AWS Lambda Python dans Docker
Éviter les pièges de l'utilisation d'un Mac (pour les utilisateurs Linux?)
Créer une instance GCE à partir d'une image Docker GCR à l'aide de terraform
Générer une image Docker à l'aide de Fabric
[Go] Créez une commande CLI pour changer l'extension de l'image
Utilisation de PhantomJS avec AWS Lambda jusqu'à l'affichage du html du site Web
Puisque l'image dokcer (1 Go) d'OpenJDK11 est grande, créez une petite image (85 Mo) avec alpine linux + jlink.
Créer un graphique à l'aide du module Sympy
[Linux] Construction de l'environnement Docker avec Amazon Linux 2
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
Placez Python3 dans le conteneur Docker d'Amazon Linux2
J'ai essayé d'utiliser le filtre d'image d'OpenCV
Créez une interface graphique sur le terminal à l'aide de curses
Gratter les données gagnantes de Numbers à l'aide de Docker
Je souhaite prendre une capture d'écran du site sur Docker en utilisant n'importe quelle police
Découpez une partie de la chaîne à l'aide d'une tranche Python
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 1 ~
Créez Amazon Linux avec AWS EC2 et connectez-vous
Créez un code QR pour l'URL sous Linux
Créez une page Web qui exécute un modèle qui augmente la résolution de l'image à l'aide de gradio, ce qui facilite la création d'un écran Web
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 2 ~
[Python] Masquez l'image dans un cercle à l'aide de Pillow
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 3 ~
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 4 ~
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 5 ~
Annonce de la disponibilité de Java 11 LTS sur Amazon Linux 2
Rechercher la table à l'aide de sqlalchemy et créer un dictionnaire
[Linux] Créez un auto-certificat avec Docker et apache
Exemple d'utilisation de lambda
Changez les paramètres régionaux Amazon Linux au Japon à l'aide du fichier lineinfile d'Ansible
Créez instantanément un diagramme de données 2D à l'aide de matplotlib de python
Créer un environnement de développement VS Code + Docker avec une machine virtuelle Linux
Essayez une recherche similaire de recherche d'images à l'aide du SDK Python [Recherche]
Résumé de l'exploration d'image effectuée à la vitesse d'une seconde
Créez un robot de réponse automatique en temps réel à l'aide de l'API Twitter Streaming
J'ai fait une image ponctuelle de l'image d'Irasutoya. (partie 1)
Un résumé approximatif des différences entre Windows et Linux
Créez rapidement une API avec Python, lambda et API Gateway à l'aide d'AWS SAM
Créer un diagramme de corrélation à partir de l'historique des conversations de Twitter
J'ai fait une image ponctuelle de l'image d'Irasutoya. (partie 2)
[Linux] Ecrire un outil de déploiement à l'aide de rsync avec un script shell
Utilisez wxpython pour créer une fenêtre de type d'image d'arrière-plan transparent semblable à un gadget
Envoyer une demande d'AWS Lambda à Amazon Elasticsearch Service
L'histoire de la création d'une base de données à l'aide de l'API Google Analytics
Obtenez le nom d'hôte du PC hôte avec Docker sous Linux
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
Chargez une bibliothèque externe à partir d'une fonction Lambda à l'aide des couches AWS Lambda. L'environnement Python pour Amazon Linux 2 est également en place. (Python3.6, Anaconda)