2015-11-18 9 views
18

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

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

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

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

В псевдо-коде, что я хочу это:

  1. Подключение к ковшу S3 (jsondata)
  2. Прочитайте содержимое поля JSON-файл (results)
  3. Выполнить мой сценарий для этих данных (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) 

EDIT

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

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

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) 

ответ

7

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

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

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

Следует также иметь в виду, что вам нужно создать объект s3, который будет использоваться в вашем ответе. т. е. 's3 = boto3.client ('s3')' – ScottMcC

Смежные вопросы