使用AWS Lambda(Python)在s3中压缩文件

使用AWS Lambda(Python)在s3中压缩文件,python,amazon-web-services,amazon-s3,aws-lambda,Python,Amazon Web Services,Amazon S3,Aws Lambda,我在一个s3存储桶中有几百个PDF,我想要一个lambda函数为我所有的PDF创建一个zip文件 在本地Python上执行此操作显然很容易,并且我假设逻辑将以非常直接的方式转移到AWS Lambda。但到目前为止,我还没能让它工作 我一直在使用zipfile Python库以及boto3。我的逻辑很简单,就是找到所有文件,将它们附加到一个“files_to_zip”列表中,然后遍历该列表,将每个文件写入新的zip文件 然而,这引发了许多问题,我认为这是由于我在理解Lambda中如何调用和加载文件

我在一个s3存储桶中有几百个PDF,我想要一个lambda函数为我所有的PDF创建一个zip文件

在本地Python上执行此操作显然很容易,并且我假设逻辑将以非常直接的方式转移到AWS Lambda。但到目前为止,我还没能让它工作

我一直在使用zipfile Python库以及boto3。我的逻辑很简单,就是找到所有文件,将它们附加到一个“files_to_zip”列表中,然后遍历该列表,将每个文件写入新的zip文件

然而,这引发了许多问题,我认为这是由于我在理解Lambda中如何调用和加载文件方面的不足

这是我迄今为止尝试过的代码

    import os
    import boto3
    from io import BytesIO, StringIO
    from zipfile import ZipFile, ZIP_DEFLATED

    def zipping_files(event, context):
        s3 = boto3.resource('s3')

        BUCKET = 'BUCKET NAME'
        PREFIX_1 = 'KEY NAME'
        new_zip = r'NEW KEY NAME' 
        s3_client = boto3.client('s3')
        files_to_zip = []
        response = s3_client.list_objects_v2(Bucket=BUCKET, Prefix=PREFIX_1)

        all = response['Contents']     
        for i in all:
            files_to_zip.append(str(i['Key']))



        with ZipFile(new_zip, 'w',  compression=ZIP_DEFLATED, allowZip64=True) as new_zip:
            for file in files_to_zip:
                new_zip.write(file) 

我收到错误消息,例如我的新zip字符串不存在(FileNotFoundError),这是一个只读操作。

此代码示例尝试在Lambda函数容器的本地文件系统上的默认目录(即
/var/task
afaik)中创建一个本地文件
新的密钥名

步骤1:在
/tmp
目录中创建一个合适的文件路径,即
os.path.join('/tmp',target_filename)

步骤2:您的代码没有将zipfile上载到S3。添加对
s3\u客户端.put\u对象的调用