[PYTHON] Créer des couches Lambda avec Lambda

introduction

Quand j'utilise habituellement Lambda, j'utilise calice pour créer et déployer des fonctions Lambda.

«calice» est pratique, mais il semble que «pip install» soit effectué à chaque fois qu'il est déployé pour collecter le «package» nécessaire. Par conséquent, si vous utilisez un package plus lourd tel que pandas, le déploiement prendra plus de temps.

Par conséquent, utilisez le service LambdaLayers du Lambda qui enregistre le package à utiliser à l'avance.

supposition

Prérequis pour la création de «LambdaLayers».

  1. LambdaLayers doit utiliser le fichier de packages consolidé avec zip pour rendre Lambda disponible à l'avance Référence /lambda/latest/dg/configuration-layers.html)
  2. La structure des dossiers telle que la mise en page de «package» est également décidée.
  3. Certains packages tels que pandas doivent être pip install sur ʻAmazon Linux` Référence
  4. C'est facile à faire sur ʻEC2, mais il est inutile de le créer si vous n'avez pas d'environnement tel que VPC ( VPC` lui-même coûte de l'argent).
  5. Lambda a une zone appelée / tmp accessible par le programme.

La condition de (3) était si stricte que «Lambda» ne le reconnaissait parfois pas correctement avec le fichier «zip» créé localement. Vous pouvez également le faire sur ʻEC2dans (4), mais s'il s'agit d'un développement privé qui n'utilise que sans serveur, Il y avait une (ma) demande que je voulais compléter avec seulementLambda` autant que possible parce que je ne veux pas dépenser d'argent.

la mise en oeuvre

Flux de cette implémentation

Sur la base de la prémisse ci-dessus, créez cette fois le fichier zip requis pour LambdaLayers par la méthode suivante.

ʻInstall`` packagedans la zone/ tmp de Lambda, solidifier avec zip et télécharger vers S3` L'enregistrement réel des «couches Lambda» est effectué manuellement.

Code source

Le programme à exécuter par «Lambda» est le suivant.

lambda_function.py


import json
import subprocess
import zipfile
import boto3
from pathlib import Path


def lambda_handler(event, context):
    #Confirmation des arguments
    if "package_list" not in event:
        return {"error": "[package_list]N'existe pas"}
    package_list = event['package_list']
    if type(package_list) is not list:
        return {"error": "[package_list]N'est pas une liste"}    
    if "s3_bucket" not in event:
        return {"error": "[s3_bucket]N'existe pas"}
    if "s3_key" not in event:
        return {"error": "[s3_key]N'existe pas"}
    
    #Créez un répertoire appelé python et installez-y le package
    mkdir_cmd = "mkdir -p /tmp/python"
    pip_install_cmd = f"pip install -t /tmp/python {' '.join(package_list)}"
    process = (subprocess.Popen(f"{mkdir_cmd} && {pip_install_cmd}", stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
    print('commands...\n'+process)

    #Créer un objet Path
    p = Path("/tmp/python")

    #Ajouter le package installé à zip
    with zipfile.ZipFile('/tmp/python_lib.zip', 'w', compression=zipfile.ZIP_DEFLATED) as new_zip:
        for f in list(p.glob("**/*")):
            new_zip.write(f, arcname=str(f).replace("/tmp/", ""))

    #Obtenir un objet S3 et télécharger
    s3 = boto3.resource('s3')
    bucket = s3.Bucket(event['s3_bucket'])
    bucket.upload_file('/tmp/python_lib.zip', event['s3_key'])
    return {
        "success": f"s3://{event['s3_bucket']}/{event['s3_key']}Sortie vers"
    }

Paramètres Lambda

Veuillez le changer en fonction du package à installer.

Exemple d'argument

Lors de l'exécution, passez l'argument suivant pour installer le package inclus dans package_list. Il télécharge également le fichier zip aux emplacements spécifiés dans s3_bucket et s3_key.

event


{
  "package_list": ["pandas", "lxml", "requests", "beautifulsoup4"],
  "s3_bucket": "<Nom du bucket de s3>",
  "s3_key": "lambda_layer/python_lib.zip"
}

Si vous créez un fichier zip en utilisant l'exemple ci-dessus, un fichier zip d'environ43,1 [Mo]sera créé.

en conclusion

Donc, si vous copiez le code source ci-dessus dans Lambda et que vous l'exécutez, Vous pouvez maintenant créer le «zip» requis pour enregistrer les «LambdaLayers».

Remarque: Cette fois, je n'ai pas d'autre choix que d'exécuter shell depuis Python. Fondamentalement, je ne pense pas qu'il soit bon d'appeler shell depuis Python, donc Utilisons-le quand il n'y a pas d'autre choix que de l'utiliser.

Recommended Posts

Créer des couches Lambda avec Lambda
Créez un Yuma avec Discord.py
Créer des diapositives avec iPython
Créez des tweets ordinaires comme une flotte avec AWS Lambda et Python
Exploitez TwitterBot avec Lambda, Python
Créez des boutons de type SF avec Kivy
Déployer Django sans serveur avec Lambda
Écrivez facilement if-elif avec lambda
Faisons Othello avec wxPython
Rendre avec la syntaxe facile
Créez Puyopuyo AI avec Python
Faites une loterie avec Python
PyTorch avec AWS Lambda [importation Lambda]
Faire un feu avec kdeplot
Créer un chatbot Slack avec Errbot
lambda
Comment créer des couches AWS Lambda lors de l'exécution de sélénium × chrome sur AWS Lambda
Créez un bot LINE avec Python + heroku
AWS Lambda + Twilio permet aux rappels de Google Agenda d'appeler avec notification vocale
Créer Apache Log CSV avec Python
Faites de l'art ASCII avec l'apprentissage en profondeur
[AWS] Créer une API avec API Gateway + Lambda
Faisons une interface graphique avec python.
Faites un son avec le notebook Jupyter
Détection de visage avec Lambda (Python) + Rekognition
Faisons une rupture de bloc avec wxPython
Faisons l'IA d'Othello avec Chainer-Part 1-
Des tests plus familiers avec Selenium
[Python] Faire de la fonction une fonction lambda
Créer un système de recommandation avec python
Rendre le serveur de calcul sans disque avec LTSP
Créer un filtre avec un modèle django
[Lambda] Activer les demandes d'importation [python]
Faisons un graphe avec python! !!
Faisons un spacon avec xCAT
Notifier HipChat avec AWS Lambda (Python)
Faisons l'IA d'Othello avec Chainer-Part 2-
Créer un itérateur de modèle avec PySide
Faites sourire les gens avec le Deep Learning
Créer un exe Scrapy avec Pyinstaller
Faire un joli graphique avec plotly
Utiliser PostgreSQL avec Lambda (Python + psycopg2)
Faisons une chemise IoT avec Lambda, Kinesis, Raspberry Pi [Partie 1]
Essayez de créer foldl et foldr avec Python: lambda. Aussi mesure du temps
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
Rendre la console Python couverte d'UNKO
[AWS] Utilisation de fichiers ini avec Lambda [Python]
Créer un contrôleur d'interface audio avec pyusb (2)
Faisons un jeu de shiritori avec Python
Créer un lecteur vidéo avec PySimpleGUI + OpenCV
Créer un contrôleur d'interface audio avec pyusb (1)
Rendez les applications GUI super faciles avec tkinter
Créez un simulateur de gacha rare avec Flask
Créez un pipeline de notebook avec Kedro + Papermill
Fractal pour faire et jouer avec Python
Faire une figure partiellement zoomée avec matplotlib
Manipulation des données DynamoDB avec Lambda (Node et Python)
Créez un quiz de dessin avec kivy + PyTorch