web-dev-qa-db-ja.com

Lambdaを使用してS3からデータを読み取る

AWSのS3バケットにさまざまなjsonファイルを保存しています。

AWS lambda pythonサービスを使用してこのJSONを解析し、解析結果をAWS RDS MySQLデータベースに送信したいと思います。

安定したpythonデータベースを解析および書き込むためのスクリプトがあります。jsonファイルを追加する場合は、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)

編集

私は何かを誤解しています。 S3でファイルを読み取るのではなく、lambdaはそれ自体をダウンロードする必要があります。

here から、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)
31
LearningSlowly

bucket.objects.all() を使用して、バケット内のすべてのオブジェクトのリストを取得できます(必要に応じて、filterpage_sizelimitなどの代替メソッドもあります)

これらのメソッドは S3.ObjectSummary オブジェクトを含むイテレータを返します。そこからobject.getメソッドを使用してファイルを取得できます。

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