[DOCKER] Déployez des modules externes (numpy, scipy, requêtes, etc.) sur AWS Lambda

J'aimerais voir comment déployer un module externe sur AWS Lambda (Lambda). Prenons Python comme exemple.

Ordre d'exécution

  1. Préparez Amazon Linux 2 (environnement d'exécution Lambda). Ici, au lieu d'utiliser EC2, nous allons créer un package de déploiement localement à l'aide de Docker Image pour Lambda.
  2. Déployer sur Lambda avec le fichier source
  3. Comment utiliser Lambda Layer

Peu importe celui que vous choisissez pour * 2.

1. Préparez Amazon Linux 2 (environnement d'exécution Lambda)

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

2. Comment utiliser Lambda Layer

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

2. Déployer sur Lambda avec le fichier source

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é.

Recommended Posts

Déployez des modules externes (numpy, scipy, requêtes, etc.) sur AWS Lambda
[AWS / Lambda] Comment charger une bibliothèque externe Python
Publiez régulièrement sur Twitter en utilisant AWS lambda!
Résumé de l'écriture d'AWS Lambda