将S3存储桶中的gzip文件提取到另一个S3存储桶

时间:2020-02-24 17:29:31

标签: python amazon-web-services amazon-s3 gzip

im尝试从一个S3存储桶中复制gzip文件,并使用gzip库将其内容提取到另一个S3存储桶中。 即时通讯出现错误

不支持从头开始搜索

import boto3, json
from io import BytesIO
import gzip

def lambda_handler():
    try:
        s3 = boto3.resource('s3')
        copy_source = {
            'Bucket': 'srcbucket',
            'Key': 'samp.gz'
            }
        bucket = s3.Bucket('destbucket')
        bucketSrc = s3.Bucket('srcbucket')

        s3Client = boto3.client('s3', use_ssl=False)

        s3Client.upload_fileobj(                      # upload a new obj to s3
            Fileobj=gzip.GzipFile(              # read in the output of gzip -d
                None,                           # just return output as BytesIO
                'rb',                           # read binary
                fileobj=BytesIO(s3Client.get_object(Bucket='srcbucket', Key='samp.gz')['Body'].read())),
            Bucket='destbucket',                      # target bucket, writing to
            Key="")               # target key, writing to

    except Exception as e:
        print(e)

1 个答案:

答案 0 :(得分:0)

您无法解压缩ZIP文件并以您尝试的方式上传其组成文件。

您可以将整个ZIP文件解压缩到/tmp中的Lambda本地磁盘上(请注意,该磁盘空间限制为512MB),然后逐个文件上传。或者,如果它不适合放在磁盘上,或者您不想持久保存在桌面上,则可以逐个文件地将ZIP文件的内容流式传输到内存中,然后将每个流上传到S3。在这两种解决方案中,您都需要为每次上传提供适当的密钥。