2017-01-06 3 views
4

私はキャッシュから取得しているキーのリストを持っており、キーごとにリクエストすることなくS3から関連するオブジェクト(ファイル)をダウンロードしたい。S3オブジェクトをBott3を使用してダウンロードする

私は次のキーの配列を持っていると仮定すると:

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' 
] 

私は別のSO質問にthis answerに似た何かをしようとしているが、そのように変更されています:

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

'すべてのkey'ごとに個別のAWS APIを打つ避け、'全体のバケツをプルダウンすることとフィルタリング/フルresults'を反復避ける:ここnは API呼び出しでそれを取得するためのコードです。それ以外はどうすればいいですか?あなたの鍵はパターンに従っていますか? – helloV

+0

@helloV私は、S3がリクエストで送信したキーの配列(または区切られたリスト)を受け入れ、一致するオブジェクトを返すことを期待していました。私はboto3とAWSの両方のドキュメントを流してきましたが、何も見つかりませんでしたので、ここで質問します。キーには共通のプレフィックスがありますが、キャッシュの応答は検索パラメータによって異なる場合があります。 – afilbert

+0

すべてのキーに同じ接頭辞が付いていない限り、このような機能はありません。 – helloV

答えて

5

私はあなたが得ようとしている最高のNはあなたのkey_array内のキーの数であるnは API呼び出しだと思います。 s3用のamazon 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結果をキャッシュすることに決めました。 PostgreSQLのネイティブなJSONデータ型です。 – afilbert

関連する問題