Чтение данных с S3 с использованием Lambda

У меня есть набор json файлов, хранящихся в ведре S3 на AWS.

Я хочу использовать службу AWS lambda python для анализа этого json и отправки проанализированных результатов в базу данных AWS RDS MySQL.

У меня есть стабильный python script для выполнения разбора и записи в базу данных. Мне нужно lambda script для итерации через json файлы (когда они добавлены).

Каждый json файл содержит список, простой, состоящий из results = [content]

В псевдокоде я хочу:

  • Подключиться к ведерке S3 (jsondata)
  • Прочитайте содержимое файла JSON (results)
  • Выполните мой script для этих данных (results)

Я могу перечислить ведра, которые у меня есть:

import boto3

s3 = boto3.resource('s3')

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

Дарение:

jsondata

Но я не могу получить доступ к этому ведру, чтобы прочитать его результаты.

Не существует функции read или load.

Я хочу что-то вроде

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

ИЗМЕНИТЬ

Я что-то недопонимаю. Вместо того, чтобы читать файл на S3, лямбда должна сама загрузить его.

Из здесь кажется, что вы должны указать lambda путь загрузки, из которого он может получить доступ к самим файлам

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)

Ответы

Ответ 1

Вы можете использовать bucket.objects.all(), чтобы получить список всех объектов в ведре (у вас также есть альтернативные методы, такие как filter, page_size и limit в зависимости от вашей потребности)

Эти методы возвращают итератор с объектами S3.ObjectSummary, оттуда вы можете использовать метод object.get для извлечения файла.

Ответ 2

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