[PYTHON] Bilden Sie Lambda-Schichten mit Lambda

Einführung

Wenn ich normalerweise "Lambda" verwende, verwende ich "Kelch", um "Lambda" -Funktionen zu erstellen und bereitzustellen.

"Kelch" ist praktisch, aber es scheint, dass "Pip-Installation" jedes Mal durchgeführt wird, wenn es bereitgestellt wird, um das erforderliche "Paket" zu sammeln. Wenn Sie ein schwereres "Paket" wie "Pandas" verwenden, dauert die Bereitstellung daher länger.

Verwenden Sie daher den "LambdaLayers" -Dienst des "Lambda", der das "Paket" registriert, das im Voraus verwendet werden soll.

Annahme

Voraussetzungen für die Erstellung von "LambdaLayers".

  1. LambdaLayers sollte die mit zip konsolidierte Datei von Paketen verwenden, um Lambda im Voraus verfügbar zu machen Referenz /lambda/latest/dg/configuration-layers.html)
  2. Die Ordnerstruktur wie das Layout von package wird ebenfalls festgelegt.
  3. Einige "Pakete" wie "Pandas" müssen unter "Amazon Linux" Referenz "pip install" sein.
  4. Es ist einfach, auf "EC2" zu arbeiten, aber es ist nutzlos, es zu erstellen, wenn Sie keine Umgebung wie "VPC" haben ("VPC" selbst kostet Geld).
  5. Lambda hat einen Bereich namens / tmp, auf den das Programm zugreifen kann.

Die Bedingung von (3) war so streng, dass Lambda die lokal erstellte zip-Datei manchmal nicht erkannte. Sie können dies auch auf EC2 in (4) tun, aber wenn es sich um eine private Entwicklung handelt, die nur serverlos verwendet, Es gab eine (meine) Bitte, dass ich es so weit wie möglich nur mit "Lambda" abschließen wollte, weil ich kein Geld ausgeben möchte.

Implementierung

Ablauf dieser Implementierung

Basierend auf der obigen "Prämisse" erstellen Sie diesmal die für "LambdaLayers" erforderliche "Zip" -Datei mit der folgenden Methode.

Install`` package im / tmp Bereich von Lambda, erstarrt mit zip und lädt auf S3 hoch Die eigentliche Registrierung von "Lambda Layers" erfolgt manuell.

Quellcode

Das von Lambda auszuführende Programm ist wie folgt.

lambda_function.py


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


def lambda_handler(event, context):
    #Bestätigung der Argumente
    if "package_list" not in event:
        return {"error": "[package_list]Ist nicht vorhanden"}
    package_list = event['package_list']
    if type(package_list) is not list:
        return {"error": "[package_list]Ist keine Liste"}    
    if "s3_bucket" not in event:
        return {"error": "[s3_bucket]Ist nicht vorhanden"}
    if "s3_key" not in event:
        return {"error": "[s3_key]Ist nicht vorhanden"}
    
    #Erstellen Sie ein Verzeichnis namens Python und installieren Sie das Paket dort
    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)

    #Pfadobjekt erstellen
    p = Path("/tmp/python")

    #Fügen Sie das installierte Paket zu zip hinzu
    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/", ""))

    #Holen Sie sich das S3-Objekt und laden Sie es hoch
    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']}Ausgabe an"
    }

Lambda Einstellungen

Bitte ändern Sie es entsprechend dem zu installierenden "Paket".

Argument Beispiel

Übergeben Sie bei der Ausführung das folgende Argument, um das in der Paketliste enthaltene Paket zu installieren. Außerdem wird die "zip" -Datei an die in "s3_bucket" und "s3_key" angegebenen Speicherorte hochgeladen.

event


{
  "package_list": ["pandas", "lxml", "requests", "beautifulsoup4"],
  "s3_bucket": "<Eimername von s3>",
  "s3_key": "lambda_layer/python_lib.zip"
}

Wenn Sie eine "zip" -Datei mit dem obigen Beispiel erstellen, wird eine "zip" -Datei von ungefähr "43,1 [MB]" erstellt.

abschließend

Wenn Sie also den obigen Quellcode nach "Lambda" kopieren und ausführen, Sie können jetzt die "Zip" erstellen, die für die Registrierung von "LambdaLayers" erforderlich ist.

Hinweis: Dieses Mal habe ich keine andere Wahl, als "Shell" von "Python" aus auszuführen. Grundsätzlich denke ich nicht, dass es gut ist, "Shell" von "Python" zu nennen Verwenden wir es, wenn es keine andere Wahl gibt, als es zu verwenden.

Recommended Posts

Bilden Sie Lambda-Schichten mit Lambda
Machen Sie eine Yuma mit Discord.py
Erstellen Sie Folien mit iPython
Machen Sie mit AWS Lambda und Python gewöhnliche Tweets flottenartig
Betreiben Sie TwitterBot mit Lambda, Python
Machen Sie mit Kivy SF-ähnliche Knöpfe
Stellen Sie Django serverlos mit Lambda bereit
Schreiben Sie einfach if-elif mit Lambda
Machen wir Othello mit wxPython
Machen Sie es mit der Syntax einfach
Erstelle Puyopuyo AI mit Python
Machen Sie eine Lotterie mit Python
PyTorch mit AWS Lambda [Lambda-Import]
Machen Sie ein Feuer mit kdeplot
Machen Sie Slack Chatbot mit Errbot
Lambda
So erstellen Sie AWS Lambda-Schichten, wenn Selen × Chrom auf AWS Lambda ausgeführt wird
Erstelle einen LINE-Bot mit Python + Heroku
AWS Lambda + Twilio Machen Sie aus einem Google-Kalender eine Sprachbenachrichtigung zum Anrufen
Machen Sie Apache Log CSV mit Python
Machen Sie ASCII-Kunst mit tiefem Lernen
[AWS] API mit API Gateway + Lambda erstellen
Lassen Sie uns eine GUI mit Python erstellen.
Machen Sie einen Sound mit Jupyter Notebook
Gesichtserkennung mit Lambda (Python) + Erkennung
Machen wir einen Blockbruch mit wxPython
Machen wir Othellos KI mit Chainer-Teil 1-
Vertrauteres Testen mit Selen
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
Erstellen Sie ein Empfehlungssystem mit Python
Machen Sie den Computerserver mit LTSP plattenlos
Machen Sie einen Filter mit einer Django-Vorlage
[Lambda] Importanforderungen aktivieren [Python]
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Machen wir mit xCAT einen Spacon
Benachrichtigen Sie HipChat mit AWS Lambda (Python)
Machen wir Othellos KI mit Chainer-Teil 2-
Erstellen Sie mit PySide einen Modelliterator
Bringen Sie Menschen mit Deep Learning zum Lächeln
Machen Sie Scrapy exe mit Pyinstaller
Machen Sie eine schöne Grafik mit Plotly
Verwenden Sie PostgreSQL mit Lambda (Python + psycopg2)
Machen wir ein IoT-Shirt mit Lambda, Kinesis, Raspberry Pi [Teil 1]
Versuchen Sie, Foldl und Foldr mit Python: Lambda zu machen. Auch Zeitmessung
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
Machen Sie die Python-Konsole mit UNKO bedeckt
[AWS] Verwenden von INI-Dateien mit Lambda [Python]
Erstellen Sie einen Audio-Interface-Controller mit pyusb (2).
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Erstellen Sie einen Videoplayer mit PySimpleGUI + OpenCV
Erstellen Sie einen Audio-Interface-Controller mit pyusb (1).
Machen Sie GUI-Apps mit tkinter ganz einfach
Machen Sie einen seltenen Gacha-Simulator mit Flask
Erstellen Sie eine Notebook-Pipeline mit Kedro + Papermill
Fraktal zum Erstellen und Spielen mit Python
Machen Sie mit matplotlib eine teilweise gezoomte Figur
Bearbeiten von DynamoDB-Daten mit Lambda (Node & Python)
Machen Sie ein Zeichnungsquiz mit kivy + PyTorch