Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her

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.

Was du machen willst

  1. Ich möchte eine Datei, die im Bucket von s3 vorhanden ist, in einen anderen Bucket kopieren
  2. Das Kopieren mit einem einzelnen Prozess ist langsam, daher möchte ich Buckets mit mehreren Prozessen gleichzeitig kopieren
  3. Ich möchte AWS Lambda Python verwenden

Ich habe es hauptsächlich aus dem dritten Grund versucht.

Was ich getan habe

Ich habe eine Lambda-Funktion erstellt, um einen S3-Bucket zu erhalten, und ein Skript implementiert, das parallel kopiert werden kann.

Erstellen einer Lambda-Funktion

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.

  1. Bearbeiten Sie den Code auf dem Bildschirm
  2. Laden Sie den Code von Ihrem eigenen Computer hoch
  3. Laden Sie den Code von s3 hoch

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"

Skriptimplementierung

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")

Testlauf

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"
  ]
}

Wo ich süchtig war

Erlauben Sie Role, den s3-Bucket zu verarbeiten

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.

TimeOut-Einstellungen

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.

Impressionen

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

Referenz

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

Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her
Stellen Sie mit Python eine Verbindung zu BigQuery her
Stellen Sie mit Python eine Verbindung zu Wikipedia her
Exportieren Sie den RDS-Snapshot mit Lambda (Python) nach S3.
Laden Sie das, was Sie angefordert haben, mit AWS Lambda Python in S3 hoch
Ich möchte Lambda mit Python auf Mac AWS!
Benachrichtigen Sie HipChat mit AWS Lambda (Python)
[AWS] Versuchen Sie, die Python-Bibliothek mit SAM + Lambda (Python) zur Ebene hinzuzufügen.
Ausgabe von CloudWatch-Protokollen an S3 mit AWS Lambda (Pythyon ver)
[Python] Exportieren Sie regelmäßig mit Lambda aus CloudWatch-Protokollen nach S3
[AWS] Verwenden von INI-Dateien mit Lambda [Python]
Stellen Sie mit Python in Docker eine Verbindung zu MySQL her
Ich möchte mit aws mit Python spielen
[AWS] Verknüpfen Sie Lambda und S3 mit boto3
Stellen Sie mit dem Python-Interpreter von PEPPER Mac eine Verbindung zu Pfeffer her
[AWS] Machen Sie SSI-ähnliche Dinge mit S3 / Lambda
Senden Sie mit ESP32-WROOM-32 aufgenommene Bilder an AWS (API Gateway → Lambda → S3).
Verbinden Sie Python mit MySQL
LINE BOT mit Python + AWS Lambda + API Gateway
Serverlose Anwendung mit AWS SAM! (APIGATEWAY + Lambda (Python))
Beispiel für eine Slack-Benachrichtigung mit Python Lambda
[AWS / Lambda] Laden einer externen Python-Bibliothek
Laden Sie Dateien mit Lambda (Python) auf Google Drive hoch.
Zusammenfassung des Studiums von Python zur Verwendung von AWS Lambda
Stellen Sie mit Python auf Raspberry Pi eine Verbindung zu MySQL her
Dynamische HTML-Seiten mit AWS Lambda und Python
Betreiben Sie TwitterBot mit Lambda, Python
[S3] CRUD mit S3 unter Verwendung von Python [Python]
[Python] Scraping in AWS Lambda
S3-Betrieb mit Python Boto3
Stellen Sie mit GO eine Verbindung zu Postgresql her
[AWS lambda] Stellen Sie mit lambda verschiedene Bibliotheken bereit (generieren Sie eine Zip-Datei mit einem Kennwort und laden Sie sie auf s3 hoch) @ Python
Stellen Sie die Python 3-Funktion mit Serverless Framework unter AWS Lambda bereit
Schreiben Sie mit Lambda (Python, JavaScript) mehrere Datensätze in DynamoDB.
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
Stellen Sie von Python aus eine Verbindung zu SQLite her
Schalten Sie Python mit Alternativen auf 2.7 um
Schreiben Sie mit Python in csv
Stellen Sie eine Verbindung zur Tokio-Region von s3 her
Machen Sie mit AWS Lambda und Python gewöhnliche Tweets flottenartig
Wie benutzt man Python Lambda?
Gepostet als Anhang zu Slack auf AWS Lambda (Python)
[AWS] Was tun, wenn Sie mit Lambda pfeifen möchten?
Herausforderung Problem 5 mit Python: Lambda ... Ich habe mich entschieden, ohne zu kopieren
Erstellen Sie mit AWS SAM schnell eine API mit Python, Lambda und API Gateway
[Python] Ermöglicht den Import von pip3-Paketen in AWS Lambda
Site-Überwachung und Alarmbenachrichtigung mit AWS Lambda + Python + Slack
Verbinden Sie Raspberry Pi mit "Python" mit der Alibaba Cloud IoT Platform
[Einführung in die Udemy Python3 + -Anwendung] 58. Lambda
Python: So verwenden Sie Async mit
Zusammenfassung bei Verwendung von AWS Lambda (Python)
Link, um mit Python zu beginnen
Stellen Sie mit SQL Alchemy eine Verbindung zu mehreren Datenbanken her
[Python] Mit Python in eine CSV-Datei schreiben
[AWS] API mit API Gateway + Lambda erstellen
Schön dich mit Python zu treffen
Versuchen Sie, Facebook mit Python zu betreiben