Чтение данных с 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')