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

标签 java amazon-web-services amazon-s3 kotlin aws-sdk

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

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

  • GET/bucket?加密= HTTP/1.1"404 ServerSideEncryptionConfigurationNotFoundError
  • GET/bucket?cors= HTTP/1.1"404 NoSuchCORSConfiguration
  • GET/bucket?policy= HTTP/1.1"404 NoSuchBucketPolicy
  • PUT/bucket?policy= HTTP/1.1"400 MalformedPolicy
  • GET/bucket/?policyStatus HTTP/1.1"404 NoSuchBucketPolicy
  • PUT/bucket?policy= HTTP/1.1"403 AccessDenied

我通过以下方式构建了一个 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 Boot 应用程序上传它们并在 Angular 应用程序上显示它们。现在我什至无法通过 Postman 上传它们而不出现 403 错误。

最佳答案

IAM 策略可以缩短为:

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

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

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

关于java - 如何正确设置 S3 和 IAM 以将文件上传到 S3 存储桶?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54160255/

相关文章:

python - 从 S3 存储桶下载图像并将其存储在本地以外的变量中 (boto3)

java - 如何在java中将S3对象列表从一个文件夹移动/复制到另一个文件夹?

java - 缺少返回语句、循环

java - 如何在 Hibernate 中使用临时表批量删除记录?

c++ - 如何使用 TCP 窗口缩放来增加 C++ 中 AWS S3 的吞吐量?

amazon-web-services - 如何在代码构建中将命令的输出分配给变量

java - 无法让 PMD 5.2.1 检查 JSP 文件?

java - 数据库连接错误

amazon-web-services - 将 SSL 添加到 AWS Beanstalk

image - 操作系统 : How to easily view thumbnails of lots of images in an S3 bucket