AWS Lambda,将S3文件保存到/tmp目录

20

我想从S3复制一组文件,并在我的Lambda函数运行时将它们放在/tmp目录中,以便使用和操作内容。以下代码摘要在我的PC(运行Windows)上运行良好。

s3 = boto3.resource('s3')
BUCKET_NAME = 'car_sentiment'
keys = ['automated.csv', 'connected_automated.csv', 'connected.csv', 
        'summary.csv']
for KEY in keys: 
    try:
        local_file_name = 'tmp/'+KEY
        s3.Bucket(BUCKET_NAME).download_file(KEY, local_file_name)
    except botocore.exceptions.ClientError as e:
        if e.response['Error']['Code'] == "404":
            continue
        else:
            raise

然而,当我尝试在AWS Lambda上运行时,我收到以下错误信息:

{
  "errorMessage": "[Errno 2] No such file or directory: 'tmp/automated.csv.4Bcd0bB9'",
  "errorType": "FileNotFoundError",
  "stackTrace": [
    [
      "/var/task/SentimentForAWS.py",
      28,
      "my_handler",
      "s3.Bucket(BUCKET_NAME).download_file(KEY, local_file_name)"
    ],
    [
      "/var/runtime/boto3/s3/inject.py",
      246,
      "bucket_download_file",
      "ExtraArgs=ExtraArgs, Callback=Callback, Config=Config)"
    ],
    [
      "/var/runtime/boto3/s3/inject.py",
      172,
      "download_file",
      "extra_args=ExtraArgs, callback=Callback)"
    ],
    [
      "/var/runtime/boto3/s3/transfer.py",
      307,
      "download_file",
      "future.result()"
    ],
    [
      "/var/runtime/s3transfer/futures.py",
      73,
      "result",
      "return self._coordinator.result()"
    ],
    [
      "/var/runtime/s3transfer/futures.py",
      233,
      "result",
      "raise self._exception"
    ],
    [
      "/var/runtime/s3transfer/tasks.py",
      126,
      "__call__",
      "return self._execute_main(kwargs)"
    ],
    [
      "/var/runtime/s3transfer/tasks.py",
      150,
      "_execute_main",
      "return_value = self._main(**kwargs)"
    ],
    [
      "/var/runtime/s3transfer/download.py",
      582,
      "_main",
      "fileobj.seek(offset)"
    ],
    [
      "/var/runtime/s3transfer/utils.py",
      335,
      "seek",
      "self._open_if_needed()"
    ],
    [
      "/var/runtime/s3transfer/utils.py",
      318,
      "_open_if_needed",
      "self._fileobj = self._open_function(self._filename, self._mode)"
    ],
    [
      "/var/runtime/s3transfer/utils.py",
      244,
      "open",
      "return open(filename, mode)"
    ]
  ]
}
为什么它认为文件名是tmp/automated.csv.4Bcd0bB9而不只是tmp/automated.csv,我该如何解决?这个问题一直困扰着我,我尝试了多种方法,有些在我本地PC上运行时会生成类似的错误。谢谢!

尝试对你的代码进行一些格式化! - Evert
抱歉,我使用了代码格式并没有仔细检查。我会在一个小时内修复它。 - ViennaMike
你的代码很有帮助。非常感谢。 - Geshan Ravindu
2个回答

33
你应该将文件保存在/tmp而不是tmp/

例如:

local_file_name = '/tmp/' + KEY

1
我本来会发誓并打赌说我已经尝试过了,但显然不是,因为现在它可以工作了。也许是因为在我的Windows机器上添加那个额外的斜杠会破坏它,但现在它可以工作了。很快就会接受答案。感谢您重新格式化这个混乱的代码。当我看到你已经做好了时,我刚好跳回电脑上去修复它。出于好奇和学习的目的,当我操作不正确时,为什么垃圾字符会被添加到文件名的末尾? - ViennaMike
2
@lorless 前导的 / 表示绝对路径。仅使用 tmp/ 将是相对于“当前”目录的偏移量,而该目录不是 / - John Rotenstein
3
只是提醒一下,你不能在 /tmp/ 目录中创建目录。文件必须直接放在 /tmp/ 中。 - Michael Brant
4
@MichaelBrant 我进行了一项测试,并成功地在Lambda函数中使用os.mkdir('/tmp/foo')创建了一个目录/tmp/foo。请注意,此操作是在/tmp/目录下创建一个名为foo的新目录。 - John Rotenstein
@JohnRotenstein 你说得完全正确。谢谢你让我知道,这节省了我的时间! - Michael Brant
显示剩余2条评论

1

lambda 报错的原因是它不允许在 /tmp/ 目录下的层级结构中写入文件。你可以直接将文件写入 /tmp/example.txt 目录,但不能写入 /tmp/dir1/example.txt。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接