AWS Lambda prend en charge Python, j'ai donc essayé de l'utiliser. Cette fois, je l'ai utilisé pour copier des fichiers entre des seaux de S3, mais j'aimerais le partager car il y avait différents points d'intérêt.
Je l'ai essayé principalement pour la troisième raison.
J'ai créé une fonction Lambda pour obtenir un bucket s3 et implémenté un script à copier en parallèle.
Créez une fonction Lambda.
--Cliquez sur Créer une fonction Lambda
Select blue print Sélectionnez le modèle que vous souhaitez utiliser.
--Sélectionnez hello-world-python
Configure function
Effectuez les réglages de base pour la fonction Lambda.
--Name: Nom de la fonction Lambda
Lambda function code
Fournit le code de programme à exécuter.
Vous pouvez choisir parmi les trois types suivants.
Si vous devez importer une bibliothèque Python standard ou une bibliothèque autre que boto3, vous devez choisir la méthode 2 ou 3.
Les détails sont résumés dans ici, veuillez donc vous référer à ceux qui sont intéressés.
Au fait, cette fois, puisque seules la bibliothèque standard et boto3 sont utilisées, elle est implémentée par la méthode 1.
Nous le mettrons en œuvre plus tard, donc nous ne le changerons pas au début.
Lambda function handler and role --Handler: nom du gestionnaire à exécuter (nom du module, nom de la fonction)
Advanced settings Définissez la mémoire disponible et le délai d'expiration.
--Memory (Mo): mémoire disponible
Review
Vérifiez les paramètres.
S'il n'y a pas de problème, sélectionnez Créer une fonction
Implémentez le script à copier avec multi_process.
Voici un exemple simple.
#! /user/local/bin/python
# -*- coding:utf-8 -*-
import boto3
from multiprocessing import Process
def parallel_copy_bucket(s3client, source_bucket, dest_bucket, prefix):
'''
Copier des buckets s3 en parallèle
'''
#Copiez le bucket
def copy_bucket(s3client, dest_bucket, copy_source, key):
s3client.copy_object(Bucket=dest_bucket, CopySource=copy_source, Key=key)
# list_Notez que vous ne pouvez obtenir que 1000 données par objet.
result = s3client.list_objects(
Bucket=source_bucket,
Prefix=prefix
)
#Obtenir la liste des clés de la source de copie et copier
if 'Contents' in result:
keys = [content['Key'] for content in result['Contents']]
p = None
for key in keys:
copy_source = '{}/{}'.format(source_bucket, key)
p = Process(target=copy_bucket, args=(s3client, dest_bucket, copy_source, key))
p.start()
if p:
p.join()
#Handler appelé à l'exécution
def s3_log_copy_handler(event, context):
source_bucket = event["source_bucket"] #Copier le bucket source
dest_bucket = event["dest_bucket"] #Copier le bucket de destination
prefixes = event["prefixes"] #Copier les conditions de nom de fichier source
s3client = boto3.client('s3')
for prefix in prefixes:
print("Start loading {}".format(prefix))
parallel_copy_bucket(s3client, source_bucket, dest_bucket, prefix)
print("Complete loading")
Définissez Configure Sample Event
à partir du bouton ʻActions`
Définir les paramètres à transmettre au gestionnaire
Par exemple, si la configuration de s3 est la suivante
- samplelogs.source #Copier le bucket source
- /key1
- hogehoge.dat
- /key2
- fugafuga.dat
- samplelogs.dest #Copier le bucket de destination
Définissez le JSON comme suit.
.json
{
"source_bucket": "samplelogs.source",
"dest_bucket": "samplelogs.dest",
"prefixes" : [
"key1",
"key2"
]
}
La règle d'exécution S3 par défaut définit uniquement «s3: GetObject» et «s3: PutObject».
À ce moment, si vous appelez s3client.list_objects ()
, vous obtiendrez l'erreur ʻUne erreur client (AccessDenied) s'est produite: Accès refusé. Cette méthode ne peut pas être exécutée avec
S3: GetObject et nécessite une autre autorisation d'exécution appelée
S3: ListObejct. Par conséquent, vous devez ajouter
s3: ListObject` à Policy.
multiprocessing.Pool
Lors de l'exécution dans plusieurs processus, si vous spécifiez un pool, vous obtiendrez l'erreur ʻOSErrors- [Errno 38] Fonction non implémentée`. Il s'agit d'un problème car vous ne disposez pas des autorisations de système d'exploitation nécessaires pour conserver le pool lors de l'exécution sur Lambda. Vous devez déconfigurer le pool et l'exécuter.
Lambda doit être configuré pour expirer lorsque le temps d'exécution dépasse la valeur spécifiée. Étant donné que la valeur maximale du délai d'expiration est de 300 s (5 min), l'exécution ne peut pas être terminée pour les éléments qui prennent plus de temps à s'exécuter. Par conséquent, si vous avez un compartiment avec un fichier raisonnablement volumineux, vous devez exécuter la fonction Lambda plusieurs fois.
Je pense que c'est un bon endroit pour l'utiliser, mais je pense qu'il convient aux traitements légers tels que les alertes, les notifications push et les petits transferts de fichiers. Au contraire, il ne semble pas convenir à l'écriture de traitements lourds. De plus, maintenant que vous disposez d'un point de terminaison d'API, il peut convenir aux API ultra-légères. Je vais l'essayer la prochaine fois.
Voici un résumé des points heureux et malheureux en utilisant la fonction Lambda.
--Je suis heureux
https://boto3.readthedocs.org/en/latest/ http://qiita.com/m-sakano/items/c53ba194a8574f44e78a http://www.perrygeo.com/running-python-with-compiled-code-on-aws-lambda.html
Recommended Posts