我想使用 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/