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