使用Python在AWS Lambda上带有前导斜杠问题的FileNotFoundError

时间:2018-03-25 14:38:52

标签: python amazon-s3 aws-lambda

我的开发环境是Windows机器。当尝试从本地S3下载文件时,它没有问题。但是,当我将函数加载到Lambda时,我收到FileNotFoundError错误,该错误是由Lambda需要文件密钥中的前导斜杠引起的。

这适用于本地,但不适用于Lambda ......

s3 = boto3.resource('s3')
new_file_key = os.path.join('tmp', file_name)
s3.Bucket('bucketname').download_file(file_key, new_file_key)

这适用于Lambda,但不适用于本地......

s3 = boto3.resource('s3')
new_file_key = os.path.join('/tmp', file_name)
s3.Bucket('bucketname').download_file(file_key, new_file_key)

最简单的处理方法是什么?

2 个答案:

答案 0 :(得分:2)

听起来您希望将文件下载到

    Windows上的
  • C:\tmp
  • 你的lambda容器(linux)上的
  • /tmp

使用this SO answer作为参考,以下内容应以平台无关的方式运行:

s3 = boto3.resource('s3')
new_file_key = os.path.abspath(os.path.join(os.sep, 'tmp', file_name))
s3.Bucket('bucketname').download_file(file_key, new_file_key)

答案 1 :(得分:0)

On MS Windows os.path.join uses \ which doesn't work with s3 paths

The Lambda is running on a Linux host so os.path.join is / which s3 likes

To fix it hardwire the join to use /

new_file_key = '/'.join(['/tmp', file_name])