使用Lambda从S3读取数据

Lea*_*wly 31 python json amazon-s3 amazon-web-services aws-lambda

我在AWS上的S3存储桶中存储了一系列json文件.

我希望使用AWS lambda python服务来解析此json并将解析后的结果发送到AWS RDS MySQL数据库.

我有一个稳定的python脚本,用于解析和写入数据库.我需要lambda脚本来遍历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)
Run Code Online (Sandbox Code Playgroud)

赠送:

jsondata
Run Code Online (Sandbox Code Playgroud)

但我无法访问此存储桶来读取其结果.

似乎没有readload功能.

我希望有类似的东西

for bucket in s3.buckets.all():
   print(bucket.contents)
Run Code Online (Sandbox Code Playgroud)

编辑

我误解了一些事情.lambda必须自己下载,而不是在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)
Run Code Online (Sandbox Code Playgroud)

小智 30

s3 = boto3.client('s3')
response = s3.get_object(Bucket=bucket, Key=key)
emailcontent = response['Body'].read().decode('utf-8')
Run Code Online (Sandbox Code Playgroud)

  • 还应注意,您需要创建一个s3对象以用于响应中。即`s3 = boto3.client('s3')` (2认同)

Dys*_*mus 10

您可以使用bucket.objects.all()来获得在桶中的所有对象的列表(也有替代方法,比如filter,page_size以及limit根据您的需要)

这些方法返回一个带有S3.ObjectSummary 对象的迭代器,从那里你可以使用该方法object.get来检索文件.