AWS Lambda unterstützt Python, daher habe ich versucht, es zu verwenden. Dieses Mal habe ich es zum Kopieren von Dateien zwischen Buckets von S3 verwendet, aber ich möchte es gerne teilen, da es verschiedene Punkte von Interesse gab.
Ich habe es hauptsächlich aus dem dritten Grund versucht.
Ich habe eine Lambda-Funktion erstellt, um einen S3-Bucket zu erhalten, und ein Skript implementiert, das parallel kopiert werden kann.
Erstellen Sie eine Lambda-Funktion.
--Klicken Sie auf "Lambda-Funktion erstellen"
Select blue print Wählen Sie die Vorlage aus, die Sie verwenden möchten.
--Wählen Sie "Hallo-Welt-Python"
Configure function
Nehmen Sie die Grundeinstellungen für die Lambda-Funktion vor.
--Name: Lambda-Funktionsname
Lambda function code
Stellt den auszuführenden Programmcode bereit.
Sie können aus den folgenden drei Typen auswählen.
Wenn Sie eine Standard-Python-Bibliothek oder eine andere Bibliothek als boto3 importieren müssen, müssen Sie Methode 2 oder 3 auswählen.
Details sind in hier zusammengefasst. Bitte wenden Sie sich an Interessenten.
Dieses Mal wird es übrigens mit Methode 1 implementiert, da nur die Standardbibliothek und boto3 verwendet werden.
Wir werden es später implementieren, daher werden wir es zunächst nicht ändern.
Lambda function handler and role --Handler: Name des auszuführenden Handlers (Modulname.Funktionsname) --Beispiel: lambda_function.s3_log_copy_handler --Rolle: Lambda-Ausführungsberechtigung (Zugriffsberechtigung für Ressourcen wie s3) --Beispiel: S3-Ausführungsrolle
Advanced settings Stellen Sie den verfügbaren Speicher und die Zeitüberschreitungszeit ein.
Review
Überprüfen Sie die Einstellungen. Wenn es kein Problem gibt, wählen Sie "Funktion erstellen"
Implementieren Sie das zu kopierende Skript mit multi_process.
Unten finden Sie ein einfaches Beispiel.
#! /user/local/bin/python
# -*- coding:utf-8 -*-
import boto3
from multiprocessing import Process
def parallel_copy_bucket(s3client, source_bucket, dest_bucket, prefix):
'''
Kopieren Sie s3-Buckets parallel
'''
#Kopieren Sie den Eimer
def copy_bucket(s3client, dest_bucket, copy_source, key):
s3client.copy_object(Bucket=dest_bucket, CopySource=copy_source, Key=key)
# list_Beachten Sie, dass Sie nur bis zu 1000 Daten für ein Objekt abrufen können.
result = s3client.list_objects(
Bucket=source_bucket,
Prefix=prefix
)
#Holen Sie sich die Liste der Kopierquellenschlüssel und kopieren Sie sie
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 zur Laufzeit aufgerufen
def s3_log_copy_handler(event, context):
source_bucket = event["source_bucket"] #Quell-Bucket kopieren
dest_bucket = event["dest_bucket"] #Ziel-Bucket kopieren
prefixes = event["prefixes"] #Bedingungen für den Namen der Quelldatei kopieren
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")
Stellen Sie "Configure Sample Event" über die Schaltfläche "Actions" ein
Legen Sie die Parameter fest, die an den Handler übergeben werden sollen
Zum Beispiel, wenn die Konfiguration von s3 wie folgt ist
- samplelogs.source #Quell-Bucket kopieren
- /key1
- hogehoge.dat
- /key2
- fugafuga.dat
- samplelogs.dest #Ziel-Bucket kopieren
Stellen Sie den JSON wie folgt ein.
.json
{
"source_bucket": "samplelogs.source",
"dest_bucket": "samplelogs.dest",
"prefixes" : [
"key1",
"key2"
]
}
Die Standard-S3-Ausführungsregel definiert nur "s3: GetObject" und "s3: PutObject".
Wenn Sie zu diesem Zeitpunkt "s3client.list_objects ()" aufrufen, wird der Fehler "Ein Clientfehler (AccessDenied) ist aufgetreten: Zugriff verweigert" angezeigt.
Diese Methode kann nicht mit S3: GetObject
ausgeführt werden und erfordert eine weitere Ausführungsberechtigung namens S3: ListObejct
.
Daher müssen Sie der Richtlinie s3: ListObject
hinzufügen.
multiprocessing.Pool
Wenn Sie in mehreren Prozessen einen Pool angeben, wird der Fehler "OSErrors- [Errno 38] -Funktion nicht implementiert" angezeigt. Dies ist ein Problem, da Sie nicht über die Betriebssystemberechtigungen verfügen, die zum Halten des Pools erforderlich sind, wenn Sie auf Lambda ausgeführt werden. Sie müssen den Pool dekonfigurieren und ausführen.
Lambda muss so konfiguriert werden, dass eine Zeitüberschreitung auftritt, wenn die Ausführungszeit den angegebenen Wert überschreitet. Da der maximale Zeitlimitwert 300 Sekunden (5 Minuten) beträgt, kann die Ausführung für Elemente, deren Ausführung länger dauert, nicht abgeschlossen werden. Wenn Sie einen Bucket mit einer relativ großen Datei haben, müssen Sie die Lambda-Funktion daher mehrmals ausführen.
Ich denke, es ist ein guter Ort, um es zu verwenden, aber ich denke, es ist für die Lichtverarbeitung wie Warnungen, Push-Benachrichtigungen und kleine Dateiübertragungen geeignet. Im Gegenteil, es scheint nicht zum Schreiben schwerer Verarbeitung geeignet zu sein. Da Sie jetzt über einen API-Endpunkt verfügen, ist dieser möglicherweise auch für ultraleichte APIs geeignet. Ich werde es das nächste Mal versuchen.
Hier ist eine Zusammenfassung der glücklichen und unglücklichen Punkte mit der Lambda-Funktion.
--Ich bin glücklich
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