我的问题是我无法将文件从已部署的项目上传到S3存储桶,即使我能够从本地主机上传。当我调用方法时,期待URL,一切都保持不变(标题,正文等)。
我正在使用boto3与s3交互并使用创建的IAM用户凭据。此外,对于部署,我使用的是AWS Elastic Beanstalk。
以下是我用于上传的代码;
def put(self, bytes, data, folder, file_name):
self.ext = file_name.split(".")[-1]
if self.__is_audio_ext(self.ext):
if folder == self.__voice_record:
self.__create_voice_record(data, folder, file_name)
elif folder == self.__voice_message:
self.__create_voice_message(data, folder, file_name)
else:
return "Response cannot be constructed."
self.s3_client.put_object(Body=bytes, Bucket=self.bucket_name, Key=folder + "/" + file_name)
return "Successfully created at URL " \
+ self.bucket_url + self.bucket_name + "/" + folder + "/" + file_name
else:
return "Invalid file type"
另外,下面是我如何设置boto3
def __init__(self):
self.ext = ""
self.env = {
"aws_access_key_id": settings.AWS_ACCESS_KEY_ID,
"aws_secret_access_key": settings.AWS_SECRET_ACCESS_KEY,
"region_name": 'eu-central-1'
}
self.bucket_name = "********"
self.session = session.Session(region_name='eu-central-1')
self.s3_client = self.session.client('s3', config=boto3.session.Config(signature_version='s3v4'))
self.bucket_url = "http://s3-eu-central-1.amazonaws.com/"
当我向我的服务器发出PUT请求时,这是我得到的错误:
调用PutObject操作时发生错误(AccessDenied): 访问被拒绝“
请注意,我创建了IAM用户并授予其使用S3的完全权限,并且我确信我使用的是正确的凭据。这可以很容易理解,因为我实际上可以从本地上传文件。
这就是为什么我认为问题出现在我的请求中的文件和部署项目之间。但对我来说似乎并不合适。无论如何,不要听我的话,我在这里很困惑。
请不要犹豫,问我不明白的事情。我可以跳过清除一些观点。
我正在努力工作几个小时,无法提出任何正确的解决方案,所以我很乐意为您提供帮助!
谢谢!
答案 0 :(得分:0)
为时已晚,但希望对其他新用户有所帮助。我们应该将实例配置文件附加到具有S3存储桶权限的正确权限的EC2上,并确保存储桶策略应允许附加到实例的角色。