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:
jsondata
)results
)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)
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_size
et 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.
s3 = boto3.client('s3')
response = s3.get_object(Bucket=bucket, Key=key)
emailcontent = response['Body'].read().decode('utf-8')