AWS S3 - 能够从本地上载文件但不能从已部署上传文件(拒绝访问)

时间:2016-11-11 01:00:19

标签: amazon-web-services file-upload amazon-s3 access-denied boto3

我的问题是我无法将文件从已部署的项目上传到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的完全权限,并且我确信我使用的是正确的凭据。这可以很容易理解,因为我实际上可以从本地上传文件。

这就是为什么我认为问题出现在我的请求中的文件和部署项目之间。但对我来说似乎并不合适。无论如何,不​​要听我的话,我在这里很困惑。

请不要犹豫,问我不明白的事情。我可以跳过清除一些观点。

我正在努力工作几个小时,无法提出任何正确的解决方案,所以我很乐意为您提供帮助!

谢谢!

1 个答案:

答案 0 :(得分:0)

为时已晚,但希望对其他新用户有所帮助。我们应该将实例配置文件附加到具有S3存储桶权限的正确权限的EC2上,并确保存储桶策略应允许附加到实例的角色。

Follow this link