从 S3 下载文件到 /tmp 时 AWS Lambda 函数中的数据丢失

问题描述 投票:0回答:2

我在 AWS 中编写了一个 Lambda 函数,用于将文件从 S3 位置下载到 /tmp 目录(本地 Lambda 空间)。 我可以下载该文件,但是文件大小在这里发生变化,不知道为什么?

    def data_processor(event, context):
        print("EVENT:: ", event)
        bucket_name = 'asr-collection'
        fileKey = 'cc_continuous/testing/1645136763813.wav'
    
        path = '/tmp'
        output_path = os.path.join(path, 'mydir')
        if not os.path.exists(output_path):
            os.makedirs(output_path)
    
        s3 = boto3.client("s3")
    
        new_file_name = output_path + '/' + os.path.basename(fileKey)
    
    
        s3.download_file(
            Bucket=bucket_name, Key=fileKey, Filename=output_path + '/' + os.path.basename(fileKey)
        )
    
        print('File size is: ' + str(os.path.getsize(new_file_name)))
    
        return None

输出:

File size is: 337964

实际大小:230MB 下载的文件大小为330KB

我也尝试过 download_fileobj() 知道如何按原样下载文件而不丢失任何数据吗?

amazon-web-services amazon-s3 aws-lambda serverless
2个回答
1
投票

问题可能是您下载的存储桶来自与托管 Lambda 的不同区域。显然,这在本地运行时没有什么区别。

检查相对于 Lambda 区域的存储桶位置。

请注意,在客户端上设置区域将允许您在与存储桶不同的区域中使用 lambda。但是,如果您打算拉取较大的文件,则可以通过将 lambda 保持在与存储桶相同的区域来获得网络延迟优势。


0
投票

使用 S3 资源实例而不是客户端修复了该问题。

s3 = boto3.resource('s3')
keys = ['TestFolder1/testing/1651219413148.wav']
for KEY in keys: 
    local_file_name = '/tmp/'+KEY
    s3.Bucket(bucket_name).download_file(KEY, local_file_name)
              
© www.soinside.com 2019 - 2024. All rights reserved.