【问题标题】:Access denied when uploading S3 Objects上传 S3 对象时访问被拒绝
【发布时间】:2020-03-06 23:26:16
【问题描述】:

我正在关注 this 从 S3 添加/列出对象的教程。

起初,由于Access Denied错误,我无法列出对象,所以我发现我必须为cognito创建的角色添加额外的权限s3:ListBucket和资源arn:aws:s3:::my-bucket给unauth用户

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}

现在,当我尝试上传文件时,我收到了另一个 Access Denied

是我做错了什么还是本教程有很多错误?

附加检查:

  • 存储桶有 CORS
  • 创建bucket后我没有更改任何权限(一切默认)
  • 我正在使用正确的 Cognito 身份池 ID(我可以列出 albmus)
  • 我可以删除相册
  • Access Denied 错误后我可以看到 cognito unauth 中有新身份,因此脚本可以正常工作。
  • 存储桶的所有者(我)拥有存储桶的读/写权限

【问题讨论】:

  • 是否检查了用户的 IAM 权限?还有你用什么上传文件multer
  • @someonewithakeyboard 我只是使用 Java 的 Spring Boot 应用程序来提供静态文件,代码和所有内容都直接来自链接的教程 - 只是在另一个文件中添加了脚本的 html 页面。
  • 尝试在您的Action 列表中添加s3:ListBucketMultipartUploadss3:PutObjectAcl

标签: javascript amazon-web-services amazon-s3


【解决方案1】:

使用策略添加 IAM 角色,这将使用户能够使用 API 或通过控制台上传任何文件。

{
    "Version": "2012-10-17",
    "Id": "1",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::777777:user/myuser"
                 ]
            },
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:GetObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::bucketname/*",
                "arn:aws:s3::: bucketname"
            ]
        }
}

【讨论】:

  • 不确定,如果我正确理解此配置,但我不想授予 AWS 用户访问权限,而是授予来自 cognito 身份池的用户,这就是为什么我将此角色附加到 unauth cognito 用户.
  • 我猜你可以使用 cognito 身份池 ARN 而不是用户 ARN。
  • 实际上这个角色是直接分配给 cognito 的 unauth 用户的,所以它应该可以工作,并且查看 cognito identiy pool 活动我以 unauth 用户的身份点击它。
【解决方案2】:

我不确定 cognito 在内部是如何工作的,它可能正在使用 s3 对象的 ACL。因此,添加 s3:PutObjectAcls3:GetObjectAcl 操作访问权限可能会有所帮助。此外,如果您的代码正在对 S3 进行分段上传,则应考虑添加 s3:ListBucketMultipartUploads 操作访问权限。 s3:PutObject 操作已经添加了Initiate Multipart UploadUpload PartComplete Multipart Upload的权限。

【讨论】:

  • 没有什么对我有用,我授予了 cognito unauth 角色的完全访问权限,但它仍然无法正常工作。我开始想我做错了什么,也许我会从 0 开始。你知道给存储桶本身额外的权限吗?我没有碰它们,教程提到了Make sure you have both Read and Write permissions on Objects.
  • 我使用 cognito 服务进行 s3 下载,因为没有它,android 客户端不允许多部分下载。但是,就我而言,存储桶是公开的,这就是我们没有遇到任何问题的原因。我们在公开存储桶方面没有任何问题。您是否尝试过将存储桶访问权限修改为公共?
  • 这是有道理的,但我希望 cognito unauth 角色是一种无需将存储桶设置为公共就可以访问的用户。你认为我可以创建文件夹(putObject)但不能添加文件(ManagedUpload)有什么解释吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多