web-dev-qa-db-fra.com

Lecture des données de S3 avec Lambda

J'ai une gamme de fichiers JSON stockés dans un compartiment S3 sur AWS.

Je souhaite utiliser AWS lambda python service pour analyser ce JSON et envoyer les résultats analysés à une base de données AWS RDS MySQL.

J'ai un script stable python) pour l'analyse syntaxique et l'écriture dans la base de données. J'ai besoin d'un script lambda pour parcourir les fichiers json (lorsqu'ils sont ajoutés).

Chaque fichier json contient une liste, composée simplement de results = [content]

En pseudo-code, ce que je veux, c'est:

  1. Connectez-vous au compartiment S3 (jsondata)
  2. Lire le contenu du fichier JSON (results)
  3. Exécuter mon script pour ces données (results)

Je peux lister les seaux que j'ai par:

import boto3

s3 = boto3.resource('s3')

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

Donnant:

jsondata

Mais je ne peux pas accéder à ce seau pour lire ses résultats.

Il ne semble pas y avoir de fonction read ni load.

Je souhaite quelque chose comme

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

MODIFIER

Je comprends mal quelque chose. Plutôt que de lire le fichier en S3, lambda doit le télécharger lui-même.

De ici il semble que vous deviez donner à lambda un chemin de téléchargement, à partir duquel il peut accéder aux fichiers lui-même.

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)
31
LearningSlowly

Vous pouvez utiliser bucket.objects.all() pour obtenir la liste de tous les objets du compartiment (vous avez également d'autres méthodes telles que filter, page_sizeet limit selon vos besoins)

Ces méthodes renvoient un itérateur avec S3.ObjectSummary objets, vous pouvez utiliser la méthode object.get pour récupérer le fichier.

10
Dysosmus
s3 = boto3.client('s3')
response = s3.get_object(Bucket=bucket, Key=key)
emailcontent = response['Body'].read().decode('utf-8')
28
James Hogbin