2015-11-18 14 views
18

Ich habe eine Reihe von JSON-Dateien in einem S3-Bucket auf AWS gespeichert.Lesen von Daten aus S3 mit Lambda

Ich möchte den AWS Lambda Python-Dienst verwenden, um diesen JSON zu analysieren und die geparsten Ergebnisse an eine AWS RDS MySQL-Datenbank zu senden.

Ich habe ein stabiles Python-Skript zum Parsen und Schreiben in die Datenbank. Ich brauche ein Lambda-Skript, um die JSON-Dateien zu durchlaufen (wenn sie hinzugefügt werden).

Jede JSON-Datei enthält eine Liste, einfach bestehend aus results = [content]

In Pseudo-Code, was ich will, ist:

  1. Verbindung mit dem S3-Bucket (jsondata)
  2. Lesen Sie den Inhalt der JSON-Datei (results)
  3. für diese Daten meines Skript ausführen (results)

Ich kann den Eimer Liste Ich habe von:

import boto3 

s3 = boto3.resource('s3') 

for bucket in s3.buckets.all(): 
    print(bucket.name) 

Giving:

jsondata 

Aber ich kann diesen Eimer nicht zugreifen seine Ergebnisse zu lesen.

Es scheint keine read oder load Funktion zu sein.

Ich wünsche für so etwas wie

for bucket in s3.buckets.all(): 
    print(bucket.contents) 

EDIT

ich etwas Missverständnis bin. Anstatt die Datei in S3 zu lesen, muss Lambda sie selbst herunterladen.

Von here scheint es, dass Sie Lambda einen Download-Pfad geben muss, aus dem er auf die Dateien zugreifen können selbst

import libraries 

s3_client = boto3.client('s3') 

def function to be executed: 
    blah blah 

def handler(event, context): 
    for record in event['Records']: 
     bucket = record['s3']['bucket']['name'] 
     key = record['s3']['object']['key'] 
     download_path = '/tmp/{}{}'.format(uuid.uuid4(), key) 
     s3_client.download_file(bucket, key, download_path) 

Antwort

7

Sie können bucket.objects.all() verwenden, um eine Liste der alle Objekte im Eimer zu bekommen (Sie auch haben alternative Methoden wie filter, page_size und limit nach Bedarf abhängig)

Diese Methoden geben einen Iterator mit S3.ObjectSummary Objekte darin, von dort kann man die Methode verwenden können object.get die Datei abzurufen.

11
s3 = boto3.client('s3') 
response = s3.get_object(Bucket=bucket, Key=key) 
emailcontent = response['Body'].read().decode('utf-8') 
+0

Beachten Sie auch, dass Sie ein s3-Objekt erstellen müssen, um es in Ihrer Antwort zu verwenden. d.h. 's3 = boto3.client ('s3')' – ScottMcC