Cet article est un article pratique pour passer en revue et corriger les connaissances acquises en développant Serverless Web App Mosaic. C'est l'un des w2or3w / items / 87b57dfdbcf218de91e2).
Ce serait bien de lire cet article après avoir regardé ce qui suit.
Implémentez la fonction Lambda dans Python 3.6 qui effectue le traitement d'image sur l'image déclenchée en téléchargeant l'image sur S3. OpenCV est utilisé pour le traitement d'image.
Créez un référentiel pour votre projet sur GitHub. Le nom du référentiel est «sample_lambda_py_project».
$ git clone https://github.com/{YourGithubID}/sample_lambda_py_project.git
Créez un dossier approprié (ici, source
) dans sample_vue_project, et créez-y un fichier lambda_function.py
. Pour le moment, supposons que le code soit implémenté en ligne dans Article précédent. (Le contenu du message du journal sera légèrement modifié.)
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))
Je pense que l'environnement Cloud 9 ressemble à ceci.
Ce n'est pas nécessaire pour un code simple tel qu'il est actuellement, mais si vous utilisez une bibliothèque autre que la bibliothèque standard telle qu'OpenCV, vous devez télécharger la bibliothèque sous forme de package dans un fichier zip.
Alors, premièrement, compressons et téléchargeons sur Lambda via S3 sans utiliser la bibliothèque.
Compressez sous le répertoire où se trouve lambda_function.py
avec le nom lambda-package.zip
.
Exécutez la commande suivante dans le répertoire où se trouve lambda_function.py
.
$ zip -r ../lambda-package.zip *
Téléchargez le lambda-package.zip
créé dans S3.
Exécutez la commande suivante tout en conservant le répertoire où se trouve lambda_function.py
.
$ aws s3 cp ../lambda-package.zip s3://sample-vue-project-bucket-work/deploy/lambda-package.zip
AWS Console> Lambda> Fonctions> S3Trigger ******** - travail Accéder. Réglez le code de fonction comme suit. Type d'entrée de code: téléchargement de fichier depuis Amazon S3 Exécution: Python 3.6 Gestionnaire: lambda_function.lambda_handler URL du lien Amazon S3: l'URL du lien de lambda-package.zip téléchargé plus tôt Cliquez sur le bouton Enregistrer en haut à droite de l'écran.
Après avoir téléchargé le fichier depuis l'application Web sample_vue_project, AWS Console> CloudWatch> Groupe de journaux> aws / lambda / S3Trigger ******** - travail Veuillez visiter pour voir le dernier flux de journaux. Function Start (deploy from S3) : Bucket=sample-vue-project-bucket-work, Key=public/191231063457-16f5aaa24b1/faceA.jpeg C'est OK si un journal INFO comme celui-ci est émis.
Dans le répertoire source
où se trouve lambda_function.py
, exécutez la commande suivante.
$ pip --version
pip 9.0.3 from /usr/lib/python3.6/dist-packages (python 3.6)
$ pip install opencv-python -t .
La fonction Lambda doit inclure la bibliothèque dans le package zip à télécharger, donc -t .
Spécifiez cette option et installez-la dans le répertoire courant.
Mettez à jour 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)
(* Je ne parlerai pas de la syntaxe de base de Python ici. Si nécessaire, apprenez quelque part.)
Téléchargé Convertissez un fichier comme public / 191231112635-16f5bb5247f / lenna.png en une image grise, Téléchargement vers un chemin tel que traité / 191231112635-16f5bb5247f / lenna.png.
Vous pouvez spécifier la mémoire et le délai d'expiration dans les paramètres de base de Lambda. Par défaut, mémoire = 128 Mo et délai d'attente de 25 secondes. Les photos prises avec des smartphones récents sont de grande taille, donc si vous conservez les paramètres par défaut, vous risquez de manquer de mémoire et une exception peut se produire. À l'avenir, lorsque nous augmenterons le traitement effectué par Lambda, nous pourrions manquer de temps et de temps. Ajustez les paramètres de base de Lambda selon vos besoins. (* Concernant la taille de l'image, je pense qu'il vaut mieux la compresser côté client avant de la télécharger.)
Veuillez le compresser, le télécharger sur S3, le déployer sur Lambda, puis télécharger l'image à partir de l'application Web. C'est OK si l'image monochrome est téléchargée sous le compartiment S3. Vérifions également le journal CloudWatch. (Lena est belle)
Si vous opérez à partir de la faction Lambda sur S3 qui est la source de déclenchement comme cet exemple de programme, la fonction Lambda sera appelée par cette opération. Si vous ne faites pas attention, vous vous retrouverez avec une boucle infinie de Lambda, alors soyez prudent.
Si vous tombez par inadvertance dans une boucle infinie Lambda, vous devriez le remarquer tout de suite, mais si vous ne le remarquez pas tout de suite, vous ne voulez pas y penser. La machine de facturation automatique continuera à faire son travail sans hésitation.
La façon d'arrêter la boucle infinie Lambda consiste soit à supprimer la fonction, soit à télécharger le code de fonction qui déclenche l'exception. Je pense que c'est une bonne idée de télécharger le code de fonction qui soulève l'exception, car la suppression d'une fonction peut être fastidieuse à créer et à configurer à nouveau, mais y a-t-il un autre moyen? S'il vous plaît, faites-moi savoir.
Dans tous les cas, vous devrez le faire fonctionner avec vos mains tremblantes. En transpirant étrangement.
De plus, je n'ai pas encore débogué le code Python appelé par Lambda. Il semble que vous puissiez déboguer avec Cloud9, donc une fois que vous l'aurez appris, vous pourrez procéder au développement plus efficacement. Une fois que vous l'avez maîtrisé, essayez d'écrire un article.