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.
Voraussetzungen für die Erstellung von "LambdaLayers".
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)package
wird ebenfalls festgelegt.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.
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.
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
EinstellungenBitte ändern Sie es entsprechend dem zu installierenden "Paket".
512 [MB]
5[min]
Ü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.
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