Titel Stellen Sie es so bereit, einschließlich einer Bibliothek wie lbxxx.so, generieren Sie eine Zip-Datei mit einem Kennwort für AWS Lambda und speichern Sie sie im S3-Bucket.
Die Wand steht vor dem, was ich tun möchte.
Ich möchte hier lassen, wie ich über diese Mauer gekommen bin.
Es wurde bequem mit der Funktion "Remote-Container" von VS Code entwickelt. Weitere Informationen zu Remote-Containern finden Sie in diesem Artikel.
Ich muss nichts Besonderes schreiben ...
AWS Management Console --Lambda - "Funktion erstellen"
"Von Grund auf neu erstellen"
Funktionsname "zip-sample"
Laufzeit "Python 3.8"
Starten Sie VS Code lokal und erstellen Sie die folgende Verzeichnisstruktur
zip-sample/
└ .devcontainer/
├ Dockerfile
└ devcontainer.json
└ package/
└ lambda_hundler.py
└ requirements.txt
Für Dockerfile und devcontainer.json habe ich es von Quellcode hier erhalten. lambda_hundler.py lautet wie folgt.
lambda_hundler.py
#Der Quellcode von Lambda
import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
Fangen wir an, wenn wir fertig sind. Warum kann das zipfile-Modul keine zip-Datei mit einem Passwort generieren? (Abrupt) Nach der Untersuchung scheint es, dass ** pyminizip ** eine Zip-Datei mit einem Passwort generieren kann. Lassen Sie es uns sofort überprüfen.
Installieren Sie pyminizip nach Bedarf zlib (eine kostenlose Bibliothek zum Komprimieren und Dekomprimieren von Daten).
$ sudo apt install zlib
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package zlib
** Ich war sauer. ** **. Verwenden Sie stattdessen "zlib1g".
$ sudo apt install zlib1g
Fügen Sie Folgendes in die Datei "resources.txt" ein und geben Sie den Befehl "pip install" ein.
requirements.txt
pyminizip==0.2.4
$ cd /workspaces/zip-sample
$ pip install -r requirements.txt -t ./package
Fügen Sie lambda_hundler.py Folgendes hinzu.
lambda_hundler.py
import json
import os
import pyminizip
def lambda_handler(event, context):
#Wir werden das tmp-Verzeichnis verwenden, um es später auf Lambda hochzuladen.
zip_path = "/tmp/zip/"
# /tmp/Wenn das Zip-Verzeichnis nicht vorhanden ist, erstellen Sie eines.
if not os.path.isdir(zip_path):
os.mkdir(zip_path)
KEY = "/tmp/hello.txt"
with open(KEY, mode='w') as f:
f.write('this is test.')
password = "password"
compression_level = 9 #Kompressionsstufe 1-9, je größer die Kompression, desto stärker
#Das erste Argument ist ein Array von Dateipfaden, die in die Zip-Datei aufgenommen werden sollen
#Das zweite Argument ist die Hierarchie in der Zip-Datei
#Das dritte Argument ist der Speicherort und der Dateiname der Zip-Datei.
#Das vierte Argument ist das Passwort
#Das fünfte Argument ist die Komprimierungsstufe
pyminizip.compress_multiple([KEY], ["\\"], "/tmp/zip/sample.zip", password, compression_level)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
#Folgendes ist zum Zeitpunkt der Bereitstellung ausgeschlossen.
lambda_hundler('a','a')
Beginnen wir unten.
$ python lambda_hundler.py
$ ls /tmp/zip
sample.zip
Du hast es sicher gemacht!
Nachdem Sie eine Zip-Datei mit einem Kennwort lokal (Docker-Container) erfolgreich generiert haben, stellen wir sie für Lambda bereit.
lambda_hundler ('a', 'a')
in lambda_handler.py aus und löschen Sie es.$ cd /workspaces/zip-sample/package
$ zip -r ../function.zip .
$ aws lambda update-function-code --function-name sample-zip --zip-file fileb://../function.zip
Lassen Sie uns nach Abschluss der Bereitstellung "test" über die AWS Management Console --lambda --sample-zip ausführen.
[ERROR] OSError: error in closing \tmp\zip\sample.zip (-102)
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 78, in lambda_handler
pyminizip.compress_multiple([KEY], ["\\"], r"\tmp\zip\sample.zip", "password03", 1)
** Ich wurde gescholten **
Nach vielen Recherchen scheint dies zu geschehen, weil ** zlib nicht im Bereitstellungspaket enthalten ist ... **
Sie können es in das Bereitstellungspaket aufnehmen, indem Sie den folgenden Befehl eingeben.
$ wget http://www.zlib.net/zlib-1.2.11.tar.gz
$ tar -xvzf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11
$ ./configure --prefix=/workspaces/sample-zip
share lib include/workspaces/sample-zip/Sollte in der Lage sein zu
$ sudo make install
$ cd /workspaces/sample-zip/
Include share lib include in Zip-Datei
$ zip -gr function.zip lambda_function.py share lib include
Bereitstellen
$ aws lambda update-function-code --function-name sample-zip --zip-file fileb://function.zip
Die Linux-Bibliothek muss nach dem oben beschriebenen Vorgang nicht mehr geändert werden. Danach müssen Sie nur noch den Quellcode komprimieren.
$ cd /workspaces/zip-sample/package
$ zip -r ../function.zip .
$ aws lambda update-function-code --function-name sample-zip --zip-file fileb://../function.zip
Lassen Sie uns nach Abschluss der Bereitstellung "test" über die AWS Management Console --lambda --sample-zip ausführen. **Erfolg! ** (sollte)
Der Quellcode nach Überwindung der Mauer lautet wie folgt.
lambda_hundler.py
def lambda_handler(event, context):
zip_path = "/tmp/zip/"
if not os.path.isdir(zip_path):
os.mkdir(zip_path)
KEY = '/tmp/hello.txt'
with open(KEY, mode='w') as f:
f.write("this is test.")
password = "password"
compression_level = 9 #Kompressionsstufe 1-9, je größer die Kompression, desto stärker
pyminizip.compress_multiple([KEY], ["\\"], "/tmp/zip/sample.zip", password, compression_level)
#Laden Sie die erstellte Zip-Datei auf s3 hoch
s3 = boto3.resource('s3')
s3.Bucket(BUCKET).upload_file(Filename="/tmp/zip/sample.zip", Key="sample.zip")
return {
'status': 200,
'body': 'Die Verarbeitung ist beendet'
}
--Wenn Sie mit Python eine passwortgeschützte Zip-Datei erstellen möchten, "pyminizip"!
Recommended Posts