[AWS lambda] Stellen Sie mit lambda verschiedene Bibliotheken bereit (generieren Sie eine Zip-Datei mit einem Kennwort und laden Sie sie auf s3 hoch) @ Python

Was du machen willst

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, die aufsteht

Die Wand steht vor dem, was ich tun möchte.

  1. ** zipfile (ein Modul, das in Python standardmäßig bereitgestellte Zip-Dateien erstellt) hat ein Kennwort. Die Verschlüsselung von Zip-Dateien wird nicht unterstützt! ** **.
  2. ** Sie können keine passwortgeschützte Zip-Datei erstellen, indem Sie den lokalen Quellcode in eine Zip-Datei packen und für Lambda bereitstellen! ** **.

Ich möchte hier lassen, wie ich über diese Mauer gekommen bin.

Umgebung

Lokale Entwicklungsumgebung

Es wurde bequem mit der Funktion "Remote-Container" von VS Code entwickelt. Weitere Informationen zu Remote-Containern finden Sie in diesem Artikel.

AWS-Umgebung

Ich muss nichts Besonderes schreiben ...

Vor dem Aufprall auf die Wand

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!')
    }

Wie komme ich über die Mauer?

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.

Vorbereitung

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!

Wie komme ich über die Mauer?

Nachdem Sie eine Zip-Datei mit einem Kennwort lokal (Docker-Container) erfolgreich generiert haben, stellen wir sie für Lambda bereit.

$ 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 ... **

Der Kampf um die Aufnahme von zlib in das Bereitstellungspaket beginnt ...!

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)

Vollständiges System

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'
    }

Zusammenfassung

--Wenn Sie mit Python eine passwortgeschützte Zip-Datei erstellen möchten, "pyminizip"!

Artikel, auf die ich mich bezog

Recommended Posts

[AWS lambda] Stellen Sie mit lambda verschiedene Bibliotheken bereit (generieren Sie eine Zip-Datei mit einem Kennwort und laden Sie sie auf s3 hoch) @ Python
Erstellen Sie mit Streamlit schnell ein Python-Datenanalyse-Dashboard und stellen Sie es in AWS bereit
Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her
Verarbeiten Sie die mit Redshift entladene gzip-Datei mit Python of Lambda, gzipen Sie sie erneut und laden Sie sie in S3 hoch
Laden Sie das, was Sie angefordert haben, mit AWS Lambda Python in S3 hoch
Laden Sie Daten mit einem Befehl und einer Aktualisierung auf s3 von aws hoch und löschen Sie die verwendeten Daten (unterwegs).
[Python] Generiere ein Passwort mit Slackbot
[AWS] Verknüpfen Sie Lambda und S3 mit boto3
[AWS] Erstellen Sie mit CodeStar eine Python Lambda-Umgebung und führen Sie Hello World aus
Stellen Sie die Lambda-Funktion ein und lassen Sie sie mit S3-Ereignissen arbeiten!
So generieren Sie QR-Code und Barcode in Python und lesen ihn normal oder in Echtzeit mit OpenCV
Exportieren Sie den RDS-Snapshot mit Lambda (Python) nach S3.
Laden Sie Dateien mit Lambda (Python) auf Google Drive hoch.
Eine Geschichte über das Cross-Kompilieren eines Python-Pakets für AWS Lambda und das Bereitstellen ohne Server
[Einführung in den Systemhandel] Ich habe einen Stochastic Oscillator mit Python gezeichnet und damit gespielt ♬
Versuchen Sie, Schedule auszuführen, um Instanzen in AWS Lambda (Python) zu starten und zu stoppen.
Stellen Sie die Python 3-Funktion mit Serverless Framework unter AWS Lambda bereit
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
Ich möchte Lambda mit Python auf Mac AWS!
Machen Sie mit AWS Lambda und Python gewöhnliche Tweets flottenartig
Ich habe versucht, Dateien mit Python in AWS S3 / Azure BlobStorage / GCP CloudStorage hochzuladen / herunterzuladen
Rufen Sie die Excel-Liste rekursiv in einem bestimmten Ordner mit Python ab und schreiben Sie sie in Excel.
Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen
[Python] Was ist ein Tupel? Erklärt, wie man es benutzt und wie man es benutzt, ohne zu tippen.
Ich habe ein Skript geschrieben, um mit AWS Lambda + Python 2.7 schnell eine Entwicklungsumgebung für Twitter Bot zu erstellen
Verknüpfen Sie Python Enum mit einer Funktion, um es aufrufbar zu machen
[AWS] Versuchen Sie, die Python-Bibliothek mit SAM + Lambda (Python) zur Ebene hinzuzufügen.
Generieren Sie mit apg ein leicht zu merkendes Passwort
Ausgabe von CloudWatch-Protokollen an S3 mit AWS Lambda (Pythyon ver)
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
Erstellen Sie ein Bereitstellungsskript mit Stoff und Küche und verwenden Sie es erneut
[Python] Exportieren Sie regelmäßig mit Lambda aus CloudWatch-Protokollen nach S3
Site-Überwachung und Alarmbenachrichtigung mit AWS Lambda + Python + Slack
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Erstellen einer Cognito-Benutzerliste in S3 mit SQS Stellen Sie mit SAM Warteschlangenverarbeitungsfunktionen und APIs für Lambda bereit
Verschieben Sie CloudWatch-Protokolle regelmäßig mit Lambda nach S3
Erstellen Sie eine temporäre Datei mit Django als Zip und geben Sie sie zurück
[Python 3.8 ~] Wie man rekursive Funktionen mit Lambda-Ausdrücken intelligent definiert
Senden Sie mit ESP32-WROOM-32 aufgenommene Bilder an AWS (API Gateway → Lambda → S3).
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Erstellen Sie mit Python + Django + AWS eine Scraping-App und wechseln Sie Jobs
Bereiten Sie eine Umgebung für die Verwendung von OpenCV und Pillow mit AWS Lambda vor
[Python] Ich habe eine REST-API mit AWS API Gateway und Lambda geschrieben.
[Für Python] Erstellen Sie schnell eine Upload-Datei in AWS Lambda Layer
So erstellen Sie mit AWS Lambda eine serverlose API für maschinelles Lernen
Ich habe GhostScript mit Python ausgeführt, das PDF in Seiten aufgeteilt und es in ein JPEG-Bild konvertiert.
Verwenden Sie AWS Lambda, um Nachrichten zu kratzen und LINE regelmäßig über Updates zu informieren [Python]
Benachrichtigen Sie HipChat mit AWS Lambda (Python)
ImportError beim Versuch, das gcloud-Paket mit der AWS Lambda Python-Version zu verwenden
So generieren Sie eine neue Protokollgruppe in CloudWatch mit Python in Lambda
2. Erstellen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (2. Grundlagen des Python-Programms)
Ich möchte es mit Python Lambda Django machen, aber ich werde aufhören
Erstellen Sie eine Django-App auf Docker und stellen Sie sie in AWS Fargate bereit
Einfache Serverüberwachung mit AWS Lambda (Python) und Ergebnisbenachrichtigung mit Slack