NoCredentialsError:无法定位凭据 - Python模块boto3。

7
我在一个Python虚拟环境(virtualenv)中运行Django,使用Apache2从Amazon EC2实例(Ubuntu 16.04)提供Django网站的服务,并使用boto3模块将数据写入Amazon S3。我安装了awscli并运行了aws configure正确设置了我的AWS访问密钥。(我知道我配置正确,因为`$ aws s3 ls`返回我S3 Bucket列表。)
然而,当我尝试从Django应用程序向S3写一些对象时,它失败并出现了标题中描述的错误。
我最近切换到新实例并开始使用Python虚拟环境。在此之前,它一直工作正常。我阅读了SO上的相关问题和AWS文档,以下是堆栈跟踪信息:
Environment:


Request Method: POST
Request URL: http://*******/product/4

Django Version: 1.10.6
Python Version: 3.5.2
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'abc.apps.abcdirectConfig')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')



Traceback:

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
  42.             response = get_response(request)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/django/core/handlers/base.py" in _legacy_get_response
  249.             response = self._get_response(request)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
  23.                 return view_func(request, *args, **kwargs)

File "/home/ubuntu/abcdirect/abcdirect/views.py" in view_product
  385.             s3.Bucket('abccms').put_object(Key=s3_file_name, Body=s3_file_data)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/boto3/resources/factory.py" in do_action
  520.                 response = action(self, *args, **kwargs)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/boto3/resources/action.py" in __call__
  83.         response = getattr(parent.meta.client, operation_name)(**params)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/botocore/client.py" in _api_call
  253.             return self._make_api_call(operation_name, kwargs)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/botocore/client.py" in _make_api_call
  530.                 operation_model, request_dict)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/botocore/endpoint.py" in make_request
  141.         return self._send_request(request_dict, operation_model)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/botocore/endpoint.py" in _send_request
  166.         request = self.create_request(request_dict, operation_model)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/botocore/endpoint.py" in create_request
  150.                                      operation_name=operation_model.name)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/botocore/hooks.py" in emit
  227.         return self._emit(event_name, kwargs)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/botocore/hooks.py" in _emit
  210.             response = handler(**kwargs)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/botocore/signers.py" in handler
  90.         return self.sign(operation_name, request)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/botocore/signers.py" in sign
  147.             auth.add_auth(request)

File "/home/ubuntu/.virtualenv/lib/python3.5/site-packages/botocore/auth.py" in add_auth
  679.             raise NoCredentialsError

Exception Type: NoCredentialsError at /product/4
Exception Value: Unable to locate credentials

请检查 ~/.aws/credentials 文件中的凭据是否设置正确。 - julian salas
@juliansalas,它们设置正确。我可以通过命令行连接到S3并上传/下载文件。只是无法通过boto3从Django应用程序连接。 - Bishal
1个回答

13

我找到了导致错误的原因,以下是我的答案,以防其他人遇到同样的问题。

简短说明:AWS配置文件不在Apache主目录下

Django应用程序运行在用户www-data(apache2)下。当我使用aws configure配置凭证时,我的设置存储在.aws/config文件中。

现在问题就在这里。

.aws/configure文件存储在我的主目录中,而不是存储在www-data(apache2)的主目录中,其默认位置为/var/www。因此,当django应用程序调用boto3模块时,该模块在/var/www/.aws/config中查找配置文件,但我的文件位于/home/ubuntu/.aws/config中。

将相关文件简单复制到/var/www/目录下即可解决该问题。


我也遇到了同样的问题。我已经尝试了你提供的解决方案,并将两个配置文件移动到了/var/www文件夹中,但是对于我来说仍然显示相同的错误。我正在使用flask + apache来运行应用程序。 - Ajay
@Ajay 确保文件现在位于 /var/www/.aws/config。确保 Apache 可以读取该文件。更改 .aws 目录及其内部的 config 文件权限,使其可被其他人读取,或将其所有者更改为 Apache。 - Bishal
我已将两个文件的所有者从root更改为ubuntu,因为在我的EC2机器上,apache不是有效用户。执行这些操作后,错误仍然存在。 - Ajay
确保'www-data'用户对该文件具有读取权限。Apache以'www-data'用户身份运行(cat /etc/passwd列出系统中的所有用户)。 - Bishal
让我们在聊天中继续这个讨论:点击此处进入聊天室 - Ajay

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