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

Kut*_*ren 5 file-upload amazon-s3 access-denied amazon-web-services 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"
Run Code Online (Sandbox Code Playgroud)

另外,下面是我如何设置 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/"
Run Code Online (Sandbox Code Playgroud)

当我向我的服务器发出 PUT 请求时,这是我得到的错误:

调用 PutObject 操作时发生错误 (AccessDenied):拒绝访问”

请注意,我创建了 IAM 用户并授予它使用 S3 的完全权限,并且我确信我使用的是正确的凭据。这很容易理解,因为我实际上可以从本地上传文件。

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

请不要犹豫,问我你不明白的地方。我可能会跳过清除某些点。

我正在研究它几个小时,但无法提出任何适当的解决方案,所以我会很高兴得到任何帮助!

谢谢!

小智 2

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

点击此链接