使用触发器使用 AWS lambda 自动清理 CSV 文件

Automate CSV file cleaning with AWS lambda using a trigger

我正在尝试创建一个 Lambda 函数,它将自动从 S3 存储桶中清除 csv 文件。 S3 存储桶每 5 百万接收一次文件,因此我为 Lambda 函数创建了一个触发器。 为了清理 csv 文件,我将使用 pandas 库来创建数据框。我已经安装了一个 pandas 层。创建数据框时,有一条错误消息。 这是我的代码:

import json
import boto3
import pandas as pd
from io import StringIO


#call s3 bucket
client = boto3.client('s3')

def lambda_handler(event, context):
    
    #define bucket_name and object _name
    bucket_name = event['Records'][0]['s3']['bucket']['name']
    object_name = event['Records'][0]['s3']['object']['key']
    
    #create a df from the object
    df = pd.read_csv(object_name)
    

这是错误信息:

[ERROR] FileNotFoundError: [Errno 2] No such file or directory: 'object_name'

在 Cloudwatch 上它还说:

OpenBLAS WARNING - could not determine the L2 cache size on this system, assuming 256k

有没有人遇到过同样的问题?预先感谢您的所有帮助!

在使用pandas之前,您必须使用s3客户端从s3下载文件。类似于:

response = client.get_object(Bucket=bucket_name, Key=object_name)
df = pd.read_csv(response["Body"])

您必须确保 lambda 具有访问 s3 存储桶的正确权限。

更改此行:

df = pd.read_csv("object_name")

对此:

df = pd.read_csv(object_name)

错误原因

object_name 只是 s3 对象相对于 bucket 的相对路径(键),没有 bucket_name 就没有意义,因此当您尝试读取 csv 文件时得到 FileNotFoundError

错误的解决方案

为了正确引用 s3 对象,您必须从 bucket_nameobject_name 构建完全限定的 s3 路径。另请注意,对象键有一些引用字符,因此在构建完全限定路径之前,您必须取消对它们的引用。

from urllib.parse import unquote_plus

def lambda_handler(event, context):
    
    #define bucket_name and object _name
    bucket_name = event['Records'][0]['s3']['bucket']['name']
    object_name = event['Records'][0]['s3']['object']['key']
    
    #create a df from the object
    filepath = f's3://{bucket_name}/{unquote_plus(object_name)}'
    df = pd.read_csv(filepath)