2017-01-06 7 views
4

У меня есть список ключей, которые я извлекаю из кеша, и я хочу загрузить связанные объекты (файлы) из S3 без необходимости делать запрос на ключ ,Загрузить объекты S3 по списку ключей с помощью Boto3

Предполагая, что у меня есть следующий массив ключей:

key_array = [ 
    '20160901_0750_7c05da39_INCIDENT_MANIFEST.json', 
    '20161207_230312_ZX1G222ZS3_INCIDENT_MANIFEST.json', 
    '20161211_131407_ZX1G222ZS3_INCIDENT_MANIFEST.json', 
    '20161211_145342_ZX1G222ZS3_INCIDENT_MANIFEST.json', 
    '20161211_170600_FA68T0303607_INCIDENT_MANIFEST.json' 
] 

Я пытаюсь сделать что-то похожее на this answer на другой SO вопрос, но изменен следующим образом:

import boto3 

s3 = boto3.resource('s3') 

incidents = s3.Bucket(my_incident_bucket).objects(key_array) 

for incident in incidents: 
    # Do fun stuff with the incident body 
    incident_body = incident['Body'].read().decode('utf-8') 

Моя конечная цель что я хотел бы избегать использования AWS API отдельно для каждого ключа в списке. Я также хотел бы избежать необходимости вытащить все ведро и отфильтровать/исправить полные результаты.

+0

'избежать удара API AWS отдельно для каждого key' и' избежать необходимости тянуть целое ведро вниз и фильтрации/итерация полный results'. Как еще вы можете это сделать? Ваши ключи следуют шаблону? – helloV

+0

@helloV Я надеялся, что S3 может принять массив (или иначе разделенный список) ключей, которые я отправляю в запросе, и возвращать соответствующие объекты. Я налил документацию как для boto3, так и для AWS, и ничего не нашел, поэтому подумал, что я попрошу здесь. Ключи имеют общий префикс, но ответ из моего кеша может варьироваться в зависимости от параметров поиска. – afilbert

+0

Нет такой функции, если все ваши ключи имеют одинаковый префикс. – helloV

ответ

5

Я думаю, что лучшее, что вы собираетесь получить это п API вызовы, где п является количество ключей в вашем key_array. API-интерфейс amazon для s3 не предлагает много способов фильтрации на стороне сервера на основе ключей, отличных от префиксов. Вот код, чтобы получить его в п API вызовов:

import boto3 
s3 = boto3.client('s3') 

for key in key_array: 
    incident_body = s3.get_object(Bucket="my_incident_bucket", Key=key)['Body'] 

    # Do fun stuff with the incident body 
+0

Учитывая, что список моих инцидентов может быть сколь угодно многочисленным, я решил переместить эту часть работы в фоновый процесс и кэшировать фактические результаты json. Yay для собственных типов данных JSON для PostgreSQL. – afilbert