Vous pouvez créer une couche correspondant à chaque version de ligne avec l'image de construction de docker-lambda!
$ docker run --rm -v $(pwd):/var/task lambci/lambda:build-python3.8 \
> pip install -r requirements.txt -t python/lib/python3.8/site-packages/
Les packages logiciels que vous souhaitez exécuter sur AWS Lambda peuvent être superposés avec yumda!
$ docker run --rm -v $(pwd)/git-layer:/lambda/opt lambci/yumda:2 yum install -y <package>
Une mise en garde courante avec AWS Lambda et Lambda Layers est la gestion des binaires natifs. Parce que l'environnement d'exécution Lambda est basé sur un environnement Amazon Linux et une version de noyau spécifiques Les binaires natifs utilisés dans Lambda doivent également être compilés dans cet environnement.
Il se trouve également actuellement dans une période transitoire de fin de prise en charge d'Amazon Linux, en fonction de la version du runtime utilisé. La différence entre être basé sur Amazon Linux ou être basé sur Amazon Linux 2 est également ennuyeuse. Par exemple, dans le cas de Python, au 28 mars 2020, c'est comme suit.
Version | OS |
---|---|
Python 3.8 | Amazon Linux 2 |
Python 3.7 | Amazon Linux |
Python 3.6 | Amazon Linux |
Python 2.7 | Amazon Linux |
AWS Lambda Runtimes https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html
Il est vraiment difficile de démarrer EC2 à chaque fois qu'un package est créé. Vous pouvez également utiliser l 'image du conteneur Amazon Linux publiée sur Docker Hub. Cette image contient un ensemble minimal de packages, donc Il est nécessaire d'installer en plus l'environnement d'exécution cible en l'utilisant comme image de base. Lors du développement pour plusieurs environnements d'exécution et versions, gérez les fichiers Docker et les images pour chaque environnement Je pense que c'est un peu difficile à faire.
L'introduction est devenue longue, mais docker-lambda et yumda sont utiles dans de tels cas.
docker-lambda
docker-lambda reproduit l'environnement d'exécution AWS Lambda dans le conteneur Docker aussi proche que possible. (Mais pas une copie parfaite) L'image du conteneur est publiée sur lambci / lambda sur Docker Hub. Il a été développé en tant que OSS par Michael Hart d'AWS Severless Hero.
docker-lambda https://github.com/lambci/docker-lambda
Il est également utilisé comme environnement d'exécution pour les fonctions Lambda dans l'AWS SAM CLI. En interne, docker-lambda s'exécute lorsque vous appelez la fonction Lambda localement dans l'interface de ligne de commande SAM.
docker-lambda fournit également une image de construction pour la création et l'empaquetage de fonctions Lambda. Les images de construction sont fournies pour chaque version d'exécution avec des balises d'image telles que build-python3.x. Packages qui sont également installés dans l'image de build Voir https://hub.docker.com/r/lambci/lambda/#build-environment. Il comprend également l'AWS CLI et l'AWS SAM CLI, donc si vous voulez le faire, vous pouvez tout faire dans le conteneur.
Utilisez lambci / lambda: build-python3.8
.
Décrivez la bibliothèque que vous souhaitez ajouter à requirements.txt.
J'ajoute simplement que des pandas ici.
requirements.txt
pandas
Pip installez dans l'image de construction pour inclure la bibliothèque dans le calque.
$ docker run --rm -v $(pwd):/var/task lambci/lambda:build-python3.8 \
> pip install -r requirements.txt -t python/lib/python3.8/site-packages/
$ zip -r pandas-1.0.3.zip ./python > /dev/null
Si vous souhaitez rendre plusieurs versions compatibles les unes avec les autres, utilisez l'image de construction pour chaque version. Faites une exécution de docker avec des packages de site, puis zip. La structure des répertoires est la suivante. Vous devez être conscient de la taille limite du package (250 Mo) après le déploiement.
.
`-- python
`-- lib
|-- python3.6
| `-- site-packages
|-- python3.7
| `-- site-packages
`-- python3.8
`-- site-packages
Lorsque j'essaye de vérifier l'opération avec le code super simple suivant en utilisant la couche précédente, ...
lambda_function.py
import pandas as pd;
def lambda_handler(event, context):
pd.show_versions()
J'ai pu le faire!
START RequestId: 813889ca-958c-4b60-ae1d-442870679429 Version: $LATEST
INSTALLED VERSIONS
------------------
commit : None
python : 3.8.2.final.0
python-bits : 64
OS : Linux
OS-release : 4.14.165-102.205.amzn2.x86_64
machine : x86_64
processor : x86_64
byteorder : little
LC_ALL : None
LANG : en_US.UTF-8
LOCALE : en_US.UTF-8
pandas : 1.0.3
numpy : 1.18.2
~~Omis ci-dessous~~
yumda Utilisez yumda pour créer des packages logiciels pouvant s'exécuter dans un environnement AWS Lambda Il peut être préparé avec la commande yum. Comme docker-lambda, il est développé en tant que OSS.
yumda – yum for Lambda https://github.com/lambci/yumda
L'image du conteneur est publiée sur lambci / yumda.
Une image de l'environnement Amazon Linux 2 et une image de l'environnement Amazon Linux sont disponibles.
nodejs10.x, nodejs12.x, python3.8, java11, ruby2.7 sont lambci / yumbda: 2
,
D'autres versions d'exécution utilisent lambci / yumbda: 1
.
Pour voir quels packages sont disponibles pour votre environnement Amazon Linux 2, exécutez une commande similaire à la suivante:
$ docker run --rm lambci/yumda:2 yum list available
Loaded plugins: ovl, priorities
Available Packages
GraphicsMagick.x86_64 1.3.34-1.lambda2 lambda2
GraphicsMagick-c++.x86_64 1.3.34-1.lambda2 lambda2
ImageMagick.x86_64 6.7.8.9-18.lambda2 lambda2
OpenEXR.x86_64 1.7.1-7.lambda2.0.2 lambda2
OpenEXR-libs.x86_64 1.7.1-7.lambda2.0.2 lambda2
~~Omis ci-dessous~~
Ou vous pouvez vérifier les éléments suivants. https://github.com/lambci/yumda/blob/master/amazon-linux-2/packages.txt
Le package est géré dans son propre référentiel et vous pouvez soumettre des demandes supplémentaires dans les problèmes GitHub, Tout ce qui existe déjà dans le référentiel principal d'Amazon Linux et le référentiel amazon-linux-extras Il semble que ce soit une politique à ajouter.
Please file a GitHub Issue with your request and add the package suggestion label. For now we'll only be considering additions that already exist in the Amazon Linux core repositories, or the amazon-linux-extras repositories (including epel).
Ici, je vais essayer d'exécuter la commande git avec la fonction Lmabda de python3.8.
lambda_function.py
import subprocess
def lambda_handler(event, context):
return subprocess.check_output(
"git --version;exit 0",
stderr=subprocess.STDOUT,
shell=True
)
Bien sûr, si vous n'utilisez pas de couches Lambda, le résultat sera communément introuvable.
$ aws lambda invoke --function-name git-layer-test outfile
ExecutedVersion: $LATEST
StatusCode: 200
$ cat outfile
/bin/sh: git: command not found
Créez un calque avec yumda.
$ docker run --rm -v $(pwd)/git-layer:/lambda/opt lambci/yumda:2 yum install -y git
$ cd git-layer
$ zip -yr ../git-2.25.0-1.zip . > /dev/null
Vous pouvez voir que git et ses dépendances sont installés avec une structure de répertoires similaire à la suivante.
.
|-- bin
|-- etc
| |-- alternatives
| |-- pki
| |-- prelink.conf.d
| `-- ssh
|-- lib
| |-- fipscheck
| `-- nss
|-- libexec
| |-- git-core
| `-- openssh
`-- share
|-- git-core
`-- licenses
Publiez le calque et définissez-le dans la fonction Lambda ci-dessus.
$ aws lambda publish-layer-version \
> --layer-name git-2-25-0-1 --zip-file fileb://git-2.25.0-1.zip
$ aws lambda update-function-configuration \
> --function-name git-layer-test \
> --layers arn:aws:lambda:ap-northeast-1:123456789012:layer:git-2-25-0-1:1
Quand je l'ai lancé, j'ai eu une version git!
$ aws lambda invoke --function-name git-layer-test outfile
ExecutedVersion: $LATEST
StatusCode: 200
$ cat outfile
git version 2.25.0
J'ai écrit jusqu'à présent, mais Sevelress Application Repository a également des couches Lambda. Beaucoup sont enregistrés et il existe également un référentiel GitHub appelé λ AWSome Lambda Layers. Une liste de différentes couches est constituée. Si vous avez ce dont vous avez besoin pour cela, il est facile de les utiliser!
c'est tout. Je suis heureux que vous puissiez l'utiliser comme référence.