[PYTHON] Docker-lambda et yumda sont utiles lors de la création de couches Lambda

introduction

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>

La préparation environnementale est assez difficile si vous le faites à partir de zéro

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

Qu'est-ce que 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.

Image de construction docker-lambda

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.

Exemple de création d'une couche compatible python3.8

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

Exemple de création d'un calque avec yumda

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

Référence: utiliser les couches Lambda publiées

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.

Recommended Posts

Docker-lambda et yumda sont utiles lors de la création de couches Lambda
[Python] Utiliser et et ou lors de la création de variables
Création d'un alias (lorsqu'il y a plusieurs arguments) [Comparaison de Bash et PowerShell]
Ceci et cela utile lorsqu'il est utilisé avec nohup