Dieser Artikel ist ein praktischer Artikel zum Überprüfen und Korrigieren der durch die Entwicklung von Serverless Web App Mosaic gewonnenen Erkenntnisse. Es ist eines von w2or3w / items / 87b57dfdbcf218de91e2).
Es wäre schön, diesen Artikel zu lesen, nachdem man sich Folgendes angesehen hat.
Implementieren Sie die Lambda-Funktion in Python 3.6, die eine Bildverarbeitung für das Bild ausführt, die durch das Hochladen des Bildes in S3 ausgelöst wird. OpenCV wird zur Bildverarbeitung verwendet.
Erstellen Sie ein Repository für Ihr Projekt auf GitHub. Der Repository-Name lautet "sample_lambda_py_project".
$ git clone https://github.com/{YourGithubID}/sample_lambda_py_project.git
Erstellen Sie einen geeigneten Ordner (hier "Quelle") in sample_vue_project und erstellen Sie darin eine "lambda_function.py" -Datei. Nehmen wir vorerst an, dass der Code in Vorheriger Artikel inline implementiert ist. (Der Inhalt der Protokollnachricht wird ein wenig geändert.)
lambda_function.py
from urllib.parse import unquote_plus
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
key = unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
logger.info("Function Start (deploy from S3) : Bucket={0}, Key={1}" .format(bucket, key))
Ich denke, die Cloud 9-Umgebung sieht so aus.
Für einfachen Code ist dies nicht erforderlich, aber wenn Sie eine andere Bibliothek als die Standardbibliothek wie OpenCV verwenden, müssen Sie die Bibliothek als Paket in eine Zip-Datei hochladen.
Lassen Sie uns zunächst über S3 komprimieren und auf Lambda hochladen, ohne die Bibliothek zu verwenden.
Komprimieren Sie unter dem Verzeichnis, in dem sich lambda_function.py
befindet, mit dem Namen lambda-package.zip
.
Führen Sie den folgenden Befehl in dem Verzeichnis aus, in dem sich lambda_function.py
befindet.
$ zip -r ../lambda-package.zip *
Laden Sie das erstellte lambda-package.zip
in S3 hoch.
Führen Sie den folgenden Befehl aus, während Sie das Verzeichnis behalten, in dem sich lambda_function.py
befindet.
$ aws s3 cp ../lambda-package.zip s3://sample-vue-project-bucket-work/deploy/lambda-package.zip
AWS Console> Lambda> Funktionen> S3Trigger ******** - Arbeit Zugreifen. Stellen Sie den Funktionscode wie folgt ein. Codeeintragstyp: Datei-Upload von Amazon S3 Laufzeit: Python 3.6 Handler: lambda_function.lambda_handler Amazon S3-Link-URL: Die Link-URL von lambda-package.zip, die zuvor hochgeladen wurde Klicken Sie oben rechts auf dem Bildschirm auf die Schaltfläche Speichern.
Nach dem Hochladen der Datei aus der Web-App sample_vue_project AWS Console> CloudWatch> Protokollgruppe> aws / lambda / S3Trigger ******** - Arbeit Bitte besuchen Sie, um den neuesten Protokolldatenstrom zu sehen. Function Start (deploy from S3) : Bucket=sample-vue-project-bucket-work, Key=public/191231063457-16f5aaa24b1/faceA.jpeg Es ist in Ordnung, wenn ein solches INFO-Protokoll ausgegeben wird.
Führen Sie im Verzeichnis "source", in dem sich "lambda_function.py" befindet, den folgenden Befehl aus.
$ pip --version
pip 9.0.3 from /usr/lib/python3.6/dist-packages (python 3.6)
$ pip install opencv-python -t .
Die Lambda-Funktion muss die Bibliothek in das hochzuladende Zip-Paket aufnehmen, also -t .
Geben Sie diese Option an und installieren Sie sie im aktuellen Verzeichnis.
Aktualisieren Sie lambda_function.py
.
lambda_function.py
# coding: UTF-8
import boto3
import os
from urllib.parse import unquote_plus
import numpy as np
import cv2
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
s3 = boto3.client("s3")
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
key = unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
logger.info("Function Start (deploy from S3) : Bucket={0}, Key={1}" .format(bucket, key))
fileName = os.path.basename(key)
orgFilePath = u'/tmp/' + fileName
processedFilePath = u'/tmp/processed-' + fileName
if (not key.startswith("public")):
logger.info("not start with public")
return
keyOut = key.replace("public", "processed", 1)
logger.info("Output local path = {0}".format(processedFilePath))
try:
s3.download_file(Bucket=bucket, Key=key, Filename=orgFilePath)
orgImage = cv2.imread(orgFilePath)
grayImage = cv2.cvtColor(orgImage, cv2.COLOR_RGB2GRAY)
cv2.imwrite(processedFilePath, grayImage)
s3.upload_file(Filename=processedFilePath, Bucket=bucket, Key=keyOut)
logger.info("Function Completed : processed key = {0}".format(keyOut))
except Exception as e:
logger.exception(e)
raise e
finally:
if os.path.exists(orgFilePath):
os.remove(orgFilePath)
if os.path.exists(processedFilePath):
os.remove(processedFilePath)
(* Ich werde hier nicht auf die grundlegende Syntax von Python eingehen. Falls erforderlich, lernen Sie bitte irgendwo.)
Hochgeladen Konvertieren Sie eine Datei wie public / 191231112635-16f5bb5247f / lenna.png in ein graues Bild. Hochladen auf einen Pfad wie verarbeitet / 191231112635-16f5bb5247f / lenna.png.
Sie können den Speicher und das Zeitlimit in den Grundeinstellungen von Lambda festlegen. Standardmäßig ist Speicher = 128 MB und Timeout 25 Sekunden. Fotos, die mit neueren Smartphones aufgenommen wurden, sind groß. Wenn Sie also die Standardeinstellungen beibehalten, geht Ihnen möglicherweise der Speicher aus und es kann zu einer Ausnahme kommen. Wenn Sie die von Lambda in Zukunft durchgeführte Verarbeitung erhöhen, wird Ihnen möglicherweise die Zeit und die Zeit ausgehen. Passen Sie die Grundeinstellungen von Lambda nach Bedarf an. (* In Bezug auf die Größe des Bildes halte ich es für besser, es vor dem Hochladen auf der Clientseite zu komprimieren.)
Bitte komprimieren Sie es, laden Sie es in S3 hoch, stellen Sie es in Lambda bereit und laden Sie das Bild dann von der Web-App hoch. Es ist in Ordnung, wenn das Schwarzweißbild unter den S3-Bucket hochgeladen wird. Überprüfen wir auch das CloudWatch-Protokoll. (Lena ist wunderschön)
Wenn Sie wie in diesem Beispielprogramm von der Lambda-Fraktion auf S3 aus arbeiten, die die Triggerquelle ist, wird die Lambda-Funktion von dieser Operation aufgerufen. Wenn Sie nicht aufpassen, erhalten Sie eine Endlosschleife von Lambda. Seien Sie also vorsichtig.
Wenn Sie versehentlich in eine Lambda-Endlosschleife fallen, sollten Sie dies sofort bemerken, aber wenn Sie es nicht sofort bemerken, möchten Sie nicht darüber nachdenken. Die automatische Abrechnungsmaschine wird ihre Arbeit ohne zu zögern fortsetzen.
Die Möglichkeit, die Endlosschleife Lambda zu stoppen, besteht darin, entweder die Funktion zu entfernen oder den Funktionscode hochzuladen, der die Ausnahme auslöst. Ich denke, es ist eine gute Idee, den Funktionscode hochzuladen, der die Ausnahme auslöst, da das Löschen einer Funktion das erneute Erstellen und Konfigurieren umständlich macht. Aber gibt es einen anderen besseren Weg? Lass es mich wissen, bitte.
In jedem Fall müssen Sie es mit zitternden Händen bedienen. Beim seltsamen Schwitzen.
Außerdem habe ich den von Lambda aufgerufenen Python-Code noch nicht getestet. Es scheint, dass Sie mit Cloud9 debuggen können. Sobald Sie es gelernt haben, können Sie effizienter mit der Entwicklung fortfahren. Wenn Sie es beherrschen, versuchen Sie, einen Artikel zu schreiben.
Recommended Posts