如何正确设置 S3 和 IAM 以将文件上传到 S3 存储桶?

How do I set up S3 and IAM properly to upload files to a S3 bucket?

我想使用 S3 来托管我通过 Kotlin Spring-Boot 应用程序上传的文件。我按照说明使用了各种其他文档,并针对在 Whosebug 上发现的类似问题尝试了一些解决方案。我总是收到 403 错误。如何设置 S3 和 IAM 以便上传文件?我如何找出问题所在?任何帮助将不胜感激。

我已经激活了访问日志记录,这需要很长时间并且对我没有太大帮助,尤其是因为生成日志大约需要 45 分钟。忽略状态为 200 的响应,日志中出现以下消息(bucket 代表我的存储桶的名称):

我通过

构建了一个AmazonS3实例
AmazonS3ClientBuilder.defaultClient()

我检查了实现,它从我设置的环境变量中检索凭据。

为了提交文件,我在我的 S3Service 实现中使用了以下方法:

private fun uploadFileToBucket(fileName: String, file: File) {
    s3client.putObject(
            PutObjectRequest(bucketName, fileName, file)
                    .withCannedAcl(CannedAccessControlList.PublicRead)
    )
}

这是我的 IAM 用户策略(该用户从组继承策略):

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
            "s3:PutAccountPublicAccessBlock",
            "s3:GetAccountPublicAccessBlock",
            "s3:ListAllMyBuckets",
            "s3:HeadBucket"
        ],
        "Resource": "*"
    },
    {
        "Sid": "VisualEditor1",
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::bucket",
            "arn:aws:s3:::bucket/*"
        ]
    }
]

}

这是存储桶策略:

{
    "Version": "2012-10-17",
    "Id": "PolicyId",
    "Statement": [
        {
            "Sid": "StmtId",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::account:user/username"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::bucket"
        }
    ]
}

最后,我希望能够将文件放入存储桶中,并希望提供 public 对这些文件的访问权限。例如,我想从 Angular 应用程序上传图像,通过我的 Spring 启动应用程序上传它们并在 Angular 应用程序上显示它们。现在我什至无法在没有 403 错误的情况下通过 Postman 上传它们。

IAM 政策可以缩短为:

{
 "Version": "2012-10-17",
 "Statement": [
    {
        "Sid": "VisualEditor1",
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::bucket",
            "arn:aws:s3:::bucket/*"
        ]
    }
 ]
}

换句话说,第二条语句提供了完整的 S3 访问权限,因此您的 IAM 策略中的第一条语句毫无意义。

您的存储桶策略可能有问题。很难说,因为我认为您已经用占位符替换了几个值。但是,在这种情况下您根本不需要存储桶策略。我会删除它。

正如 Mark B 指出的那样,IAM 策略可以缩短,而且存储桶策略也没有任何必要。但是,上传文件适用于这些设置和修改后的设置。我的代码和 S3 配置中的问题是我试图修改 ACL 而不允许在我的存储桶中进行修改。正如我在下面的屏幕截图中标记的那样,必须禁用阻止新的 public ACL,否则服务器会根据定义响应 403。