AWS Lambda 和 S3 和 Pandas - 将 CSV 加载到 S3,触发 Lambda,加载到 Pandas,放回存储桶?

Tke*_*lly 5 python amazon-s3 amazon-web-services pandas aws-lambda

我是 AWS 和 lambda 的菜鸟,所以如果这是一个愚蠢的问题,我深表歉意。我希望能够做的是将电子表格加载到 s3 存储桶中,根据该上传触发 lambda,让 lambda 将 csv 加载到 Pandas 中并对其进行处理,然后将数据帧写回 csv 到第二个 s3桶。

我已经阅读了很多关于压缩 python 脚本和所有库和依赖项并上传的内容,这是一个单独的问题。我还想出了如何在将文件上传到 S3 存储桶时触发 lambda 并自动将该文件复制到第二个 s3 存储桶。

我无法找到任何信息的部分是中间部分,将文件加载到熊猫中并在 lambda 函数内操作熊猫中的文件。

第一个问题:这样的事情甚至可能吗?第二个问题:如何从 s3 存储桶中“抓取”文件并将其加载到 Pandas 中?会是这样吗?

import pandas as pd
import boto3
import json
s3 = boto3.resource('s3')

def handler(event, context):
     dest_bucket = s3.Bucket('my-destination-bucket')
     df = pd.read_csv(event['Records'][0]['s3']['object']['key'])
     # stuff to do with dataframe goes here

     s3.Object(dest_bucket.name, <code for file key>).copy_from(CopySource = df)
Run Code Online (Sandbox Code Playgroud)

? 我真的不知道这是否接近正确并且是在黑暗中完成的拍摄。任何和所有的帮助都会非常感激,因为我很明显超出了我的能力!

Nic*_*nez 1

此代码在 PUTS 上触发 Lambda 函数,然后获取它,然后将其放入另一个存储桶中:

from __future__ import print_function
import os
import time
import json
import boto3

s3 = boto3.client('s3')

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = quote(event['Records'][0]['s3']['object']['key'].encode('utf8'))
    try:
        response = s3.get_object(Bucket=bucket, Key=key)
        s3_upload_article(response, bucket, end_path)
        return response['ContentType']
    except Exception as e:
        print(e)
        print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
        raise e

def s3_upload_article(html, bucket, end_path):
    s3.put_object(Body=html, Bucket=bucket, Key=end_path, ContentType='text/html', ACL='public-read')
Run Code Online (Sandbox Code Playgroud)

我从自己编写的一个更复杂的 Lambda 脚本中分解了这段代码,但是,我希望它能显示您需要执行的一些操作。对象的 PUTS 仅触发 scipt。事件触发后发生的任何其他操作都由您编写到脚本中。

bucket = event['Records'][0]['s3']['bucket']['name']
key = quote(event['Records'][0]['s3']['object']['key'].encode('utf8'))
Run Code Online (Sandbox Code Playgroud)

前几行的bucket和key是触发事件的对象的bucket和key。其他一切都取决于你。