我遇到了非常奇怪的权限问题。我正在尝试将文件上传到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调用时为何失败。两者都在同一个虚拟环境中。有什么建议吗?
答案 0 :(得分:1)
根据boto3 docs,boto3在以下位置寻找凭证:
- 在boto.client()方法中将凭据作为参数传递
- 在创建会话对象时将凭据作为参数传递
- 环境变量
- 共享的凭据文件(〜/ .aws / credentials)
- AWS配置文件(〜/ .aws / config)
- 承担角色提供者
- Boto2配置文件(/etc/boto.cfg和〜/ .boto)
- 已配置IAM角色的Amazon EC2实例上的实例元数据服务。
请注意,其中许多位置都是带有“〜”的路径。 “〜”是指当前用户的主目录。很有可能,您的REST API在与用于测试代码的系统用户不同的系统下运行。
正确的解决方案是使用IAM角色,因为这允许您的服务器具有S3访问权限,而无需提供IAM凭据。但是,如果这对于您的设置不起作用,则应将IAM凭据放入/etc/boto.cfg文件中,因为这与用户无关。