我在 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() 知道如何按原样下载文件而不丢失任何数据吗?
问题可能是您下载的存储桶来自与托管 Lambda 的不同区域。显然,这在本地运行时没有什么区别。
检查相对于 Lambda 区域的存储桶位置。
请注意,在客户端上设置区域将允许您在与存储桶不同的区域中使用 lambda。但是,如果您打算拉取较大的文件,则可以通过将 lambda 保持在与存储桶相同的区域来获得网络延迟优势。
使用 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)