[Certaines fonctionnalités ajoutées] concernant Lambda sur Amazon re: Invent 2015 en octobre 2015 (https://aws.amazon.com/jp/blogs/aws/aws-lambda-update-python-vpc-increased-function -duration-scheduling-and-more /) a été annoncé. Personnellement, les trois suivants sont importants.
Lancez AWS Lambda avec planification pilotée à l'aide de Data Pipeline J'ai écrit un article auparavant, mais la fonction d'exécution de planification est prise en charge en tant que fonction standard de Lambda. c'était fait. Dans cet article, j'écrirai la fonction Lambda à l'aide de Python et expliquerai la procédure pour exécuter la planification.
L'environnement d'exécution Lambda + Python + Schedule a été annoncé / ajouté cette fois, mais il y a certaines restrictions à prendre en compte. Les principaux éléments sont les suivants.
En tant que toute première étude de cas, c'est le cas le plus solide de l'exécution d'un calendrier de script Python qui s'imprime simplement toutes les 5 minutes. Consultez le journal pour voir si le résultat de l'exécution du programme est correctement émis.
À partir de Lambda dans la console AWS, sélectionnez «Créer une fonction Lambda».
Il existe de nombreux modèles pour la fonction Lambda, mais recherchez et sélectionnez lambda-canary
. Il s'agit d'un modèle pour l'exécution de la planification du script Python sur la fonction Lambda.
Depuis cette fois, nous exécutons un calendrier, sélectionnez «Événement planifié» comme source de l'événement (je pense qu'il est sélectionné par défaut). «Nom» et «Description» sont OK si vous entrez une description appropriée. L'expression de planification doit être "rate (5 minutes)" par défaut, vous pouvez donc la laisser telle quelle.
Définissez le script Python et le rôle IAM.
Le code Python utilise: C'est un code qui s'imprime simplement.
import json, datetime, commands
def lambda_handler(event, context):
print commands.getoutput('cat /proc/cpuinfo | grep -e "processor" -e "model name"')
print commands.getoutput('cat /proc/meminfo | grep MemTotal')
print commands.getoutput('cat /proc/meminfo | grep MemFree')
print datetime.datetime.now().strftime('%Y/%m/%d %H:%M')
print '-------------------------------'
print event
print event['account']
print context.__dict__
print context.memory_limit_in_mb
Outre le script Python, les paramètres suivants sont requis. D'autres sont bons avec maman par défaut.
Name
est le nom de la fonction Lambda. N'importe quelle chaîne convient (à moins qu'elle ne chevauche d'autres fonctions Lambda).Role
est le rôle IAM attribué à la fonction Lambda. Étant donné que nous n'accéderons pas aux autres ressources AWS cette fois, vous pouvez sélectionner lambda_basic_execution
(si vous n'avez pas de rôle IAM appelé lambda_basic_execution
, vous allez créer un rôle avec ce nom).Ceci est la confirmation finale. Sélectionnez «Activer maintenant» pour activer l'exécution de la planification avec ce paramètre. Sélectionnez «Activer maintenant» et appuyez sur «Créer une fonction» pour terminer.
La sortie de la fonction Lambda est enregistrée dans les journaux CloudWatch.
Dans CloudWatch Logs dans AWS Console, sélectionnez Lambda_Test
. Ensuite, le journal d'exécution est ajouté toutes les 5 minutes, et je pense que le contenu imprimé reste dans le journal.
main
, et une méthode appelée lambda_handler
est appelée comme point d'entrée (avec les arguments ʻevent,
context). La spécification de la fonction de point d'entrée peut être modifiée avec
Handler de
Configuration`.
et
context, qui sont les arguments du point d'entrée, diffère selon la source de l'événement. Le contenu de ʻevent
et context
est craché par impression, donc veuillez le vérifier.À partir de Lambda dans AWS Console, accédez à l'onglet ʻEvent sources de la fonction
Lambda_Testque vous venez de créer. Supprimez le programme d'exécution défini dans
rate (5 minutes)avec
x et sélectionnez ʻAjouter une source d'événement
.
Dans la boîte de dialogue «Ajouter une source d'événement», sélectionnez «Événement planifié» pour «Type de source d'événement» et remplissez la boîte de dialogue comme suit.
cron
dans expression de planification
et écrivez cron (0/10 * * *? *)
Le point à noter ici est que la grammaire cron de Lambda est légèrement différente de la grammaire cron générale dite de Linux.
Reportez-vous à cet article Veuillez écrire cron (0/10 * * *? *)
.
Si vous sélectionnez «Activer maintenant», le programme sera exécuté avec ce paramètre. Vérifiez si le journal d'exécution est dans les journaux CloudWatch toutes les 10 minutes.
Si vous souhaitez utiliser une bibliothèque standard non Python 2.7 telle que numpy
, pandas
ou requests
avec Lambda + Python, vous devez compresser et télécharger la bibliothèque avec le fichier de script lui-même. il y a. Pour plus de détails, consultez Création d'un package de déploiement (Python) sur le site Web officiel d'AWS. ).
Enregistrez le script Python suivant dans Local (nous supposerons que vous l'enregistrerez sous le nom de fichier LambdaTest.py
).
Le contenu du script Python consiste à HTTP GET google.co.jp
à l'aide de la bibliothèque requests
et à imprimer le code d'état et le corps de la réponse.
LambdaTest.py
import requests, datetime
def lambda_handler(event, context):
target_URL = 'https://www.google.co.jp'
r = requests.get(target_URL)
print datetime.datetime.now().strftime('%Y/%m/%d %H:%M')
print '-------------------------------'
print r.status_code
print '-------------------------------'
print r.text
Une bibliothèque appelée requests
, qui n'est pas dans le standard Python 2.7, est requise, donc si vous enregistrez ce code dans Lambda tel quel, une erreur se produira. Par conséquent, placez le fichier de bibliothèque de requests
dans le même dossier, compressez-le et enregistrez le zip dans Lambda.
Si vous exécutez pip install
avec l'option -t / PathTo / LambdaTest.py
, le fichier de bibliothèque sera placé dans le dossier spécifié. Par exemple, si LambdaTest.py est dans / home / hoge
, vous pouvez exécuter pip install -t / home / hoge
.
La structure du fichier doit ressembler à celle ci-dessous. Zip ces (2 dossiers, 1 fichier) et leur donner un nom approprié (disons LambdaLibraryZip.zip
)
Lors du téléchargement de la fonction Code of Lambda avec zip, le nom de la fonction Entry Point (fonction principale de Python) devient le nom de fichier * .py
+ .
+ Function of Entry Point in Script
. Dans cet exemple, vous devez le définir sur LambdaTest.lambda_handler
. Définissez Handler
dans l'onglet Configuration
sur LambdaTest.lambda_handler
Depuis l'onglet Code
, allez dans ʻUploader un fichier .ZIP, téléchargez le
LambdaLibraryZip.zip que vous venez de créer, cliquez sur
Enregistrer et tester`, et vérifiez si le script Python fonctionne correctement. S'il te plait donne moi.
Le support de Lambda pour l'exécution de Python et de Schedule est une très bonne nouvelle pour moi en tant que Python Love. Accédez à [Architecture à 2 niveaux] d'Amazon (http://www.slideshare.net/AmazonWebServicesJapan/aws-lambda-2tier) ou à Architecture sans serveur Je pense que ce sera un grand tremplin (et sera de plus en plus enfermé par Amazon ...).
Cependant, je pense qu'il y a encore des zones qui ne peuvent pas être remplacées par l'exécution de Lambda + Python + Schedule.
Lambda a un cycle d'exécution minimum de 5 minutes. Je pense que cela couvrira de nombreux besoins, mais il y a aussi des exigences telles que "Je veux vérifier l'état et la surveillance active toutes les minutes". Je ne connais pas (si vous le savez, faites-le moi savoir) le service AWS qui exécute des programmes à cycle court sans serveur.
La proposition faite par Amazon est [EC2 t2.nano Instance](http://aws.typepad.com/aws_japan/2015/10/ec2-instance-update-x1-sap-hana-t2-nano-websites. html), donc je pense. Préparez une instance qui est encore moins chère que le t2.micro actuel et utilisez-la pour écrire au dos du dépliant.
Le temps de traitement maximal pour Lambda a maintenant été augmenté à 5 minutes (auparavant 1 minute). Lorsqu'il était d'une minute, utilisez la fonction Lambda pour amener le journal de S3 en local, analyser le contenu et, lorsqu'une erreur est trouvée, activer l'alarme et écrire le résultat dans RDS. À ce moment-là, il y avait un cas où Timeout se produisait lorsque la taille du journal dépassait plusieurs centaines de Mo, mais je pense que cette extension à 5 minutes couvrira de nombreux besoins. Cependant, il existe également des exigences qui nécessitent du temps de traitement, telles que "Traitement quotidien par lots ETL d'une grande quantité de données".
Autant que je sache, il y a des exigences qui prennent du temps à traiter avec ce type de calcul et de transfert de données.
Je pense que c'est bien.
Recommended Posts