Boto S3权限问题

时间:2018-08-29 14:02:51

标签: django amazon-s3 boto3

我遇到了非常奇怪的权限问题。我正在尝试将文件上传到s3,这是我的功能

def UploadFile(FileName, S3FileName):
 session = boto3.session.Session()
 s3 = session.resource('s3')
 s3.meta.client.upload_file(FileName, "MyBucketName", S3FileName)

我确实在服务器上配置了aws-cli。当我登录服务器并启动python解释器时,此功能可以正常工作,但是从django rest api调用时失败:

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied 

不知道为什么从解释器调用时相同的功能起作用,而从Django调用时为何失败。两者都在同一个虚拟环境中。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

根据boto3 docs,boto3在以下位置寻找凭证:

  
      
  1. 在boto.client()方法中将凭据作为参数传递
  2.   
  3. 在创建会话对象时将凭据作为参数传递
  4.   
  5. 环境变量
  6.   
  7. 共享的凭据文件(〜/ .aws / credentials)
  8.   
  9. AWS配置文件(〜/ .aws / config)
  10.   
  11. 承担角色提供者
  12.   
  13. Boto2配置文件(/etc/boto.cfg和〜/ .boto)
  14.   
  15. 已配置IAM角色的Amazon EC2实例上的实例元数据服务。
  16.   

请注意,其中许多位置都是带有“〜”的路径。 “〜”是指当前用户的主目录。很有可能,您的REST API在与用于测试代码的系统用户不同的系统下运行。

正确的解决方案是使用IAM角色,因为这允许您的服务器具有S3访问权限,而无需提供IAM凭据。但是,如果这对于您的设置不起作用,则应将IAM凭据放入/etc/boto.cfg文件中,因为这与用户无关。