无法用api从s3获取文件。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法用api从s3获取文件。相关的知识,希望对你有一定的参考价值。

I am trying to fetch a file from an s3 bucket. 我已经写了代码使用Chalice微服务的aws。

我无法理解如何解决这个问题。由于我是一个非常新的AWS和根据我的理解,我给权限的IAM角色的S3完全访问。我应该做什么?

这是我得到的错误。

Traceback (most recent call last):
  File "/var/task/chalice/app.py", line 1112, in _get_view_function_response
    response = view_function(**function_args)
  File "/var/task/app.py", line 58, in fetch
    s3.Bucket(os.environ["BUCKET_NAME"]).download_file( 'key', 'key.pem')
  File "/var/task/boto3/s3/inject.py", line 246, in bucket_download_file
    ExtraArgs=ExtraArgs, Callback=Callback, Config=Config)
  File "/var/task/boto3/s3/inject.py", line 172, in download_file
    extra_args=ExtraArgs, callback=Callback)
  File "/var/task/boto3/s3/transfer.py", line 307, in download_file
    future.result()
  File "/var/task/s3transfer/futures.py", line 106, in result
    return self._coordinator.result()
  File "/var/task/s3transfer/futures.py", line 265, in result
    raise self._exception
  File "/var/task/s3transfer/tasks.py", line 126, in __call__
    return self._execute_main(kwargs)
  File "/var/task/s3transfer/tasks.py", line 150, in _execute_main
    return_value = self._main(**kwargs)
  File "/var/task/s3transfer/download.py", line 571, in _main
    fileobj.seek(offset)
  File "/var/task/s3transfer/utils.py", line 367, in seek
    self._open_if_needed()
  File "/var/task/s3transfer/utils.py", line 350, in _open_if_needed
    self._fileobj = self._open_function(self._filename, self._mode)
  File "/var/task/s3transfer/utils.py", line 261, in open
    return open(filename, mode)
OSError: [Errno 30] Read-only file system: 'key.pem.a7A6afCF'

代码关联。

    s3 = boto3.resource('s3')
    # s3.Bucket(os.environ["BUCKET_NAME"]).upload_file(Filename="requirements.txt" , Key="tryagain")
    s3.Bucket(os.environ["BUCKET_NAME"]).download_file( 'key', 'key.pem')

谢谢你的帮助。

答案

由于代码正在执行的lambda由于做的使用。圣杯,从S3下载的文件应该存储在 /tmp而不是在执行lambda函数代码的位置。

建议的解决方案是将

s3.Bucket(os.environ["BUCKET_NAME"]).download_file( 'key', 'key.pem')

改为:

s3.Bucket(os.environ["BUCKET_NAME"]).download_file('key', '/tmp/key.pem')

以上是关于无法用api从s3获取文件。的主要内容,如果未能解决你的问题,请参考以下文章

在Angularjs中使用AWS API从S3代理生成Word文档无法打开“选择使您的文档可读的编码”

带有Java的AWS Lambda无法从S3获取文件

如何从片段中的 JSON 响应中的对象获取数据

Apache zeppelin 无法从 Amazon S3 笔记本 json 文件中获取 URL

直接从服务器将 csv 文件上传到 aws s3 存储桶

从Snipplr获取一个代码片段