【问题标题】:AWS: Can't upload a file to private S3 through SDKAWS:无法通过 SDK 将文件上传到私有 S3
【发布时间】:2021-09-06 15:29:32
【问题描述】:

所以我有一个私有 s3 存储桶并希望能够将文件上传到它。 我的用户有一个AmazonS3FullAccess,结果发现这还不够。

错误是

Error executing "PutObject" on "https://my-existing-bucket-name.s3.amazonaws.com/5037f466f9018271b16b1e77d3d7f386.pdf"; AWS HTTP error: Client error: `PUT https://my-existing-bucket-name.s3.amazonaws.com/5037f466f9018271b16b1e77d3d7f386.pdf` resulted in a `403 Forbidden`

我也尝试添加自定义策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::my-existing-bucket-name/*"
        }
    ]
}

但它仍然不起作用,虽然可以使用相同的凭据删除或检索文件。

这是我将文件上传到 AWS 的方式(如果将存储桶访问从私有切换到公共,它工作正常)

    $this->s3Client->putObject([
        'Bucket' => $this->bucket,
        'Key' => $keyName,
        'ContentType' => $contentType,
        'CacheControl' => 'max-age=86400',
        'Body' => fopen($file, 'rb'),
        'ACL' => 'authenticated-read',
    ]);

【问题讨论】:

  • $this->s3Client->putObject 是否在您的 IAM 用户或某个 IAM 角色下执行?
  • @Marcin 有一个具有指定策略的特殊 IAM 用户,我已将他的访问密钥添加到我的 SDK
  • 有桶策略吗?
  • 无,我刚刚将Block all public access 和下面的所有复选框都切换为开启

标签: amazon-web-services amazon-s3


【解决方案1】:

原来问题出在以下选项中

'ACL' => 'authenticated-read'

认证读取的描述为Owner gets FULL_CONTROL. The AuthenticatedUsers group gets READ access.

显然,它与私有存储桶设置冲突,这就是它产生错误的原因。但是错误代码 403 令人困惑,我认为响应代码 409 在这里更有意义。无论如何,当我切换到默认 ACL 时,它就起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2017-09-24
    • 2017-01-10
    相关资源
    最近更新 更多