如何正确设置 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 代表我的存储桶的名称):
- GET /bucket?encryption= 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 拒绝访问
我通过
构建了一个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。
我想使用 S3 来托管我通过 Kotlin Spring-Boot 应用程序上传的文件。我按照说明使用了各种其他文档,并针对在 Whosebug 上发现的类似问题尝试了一些解决方案。我总是收到 403 错误。如何设置 S3 和 IAM 以便上传文件?我如何找出问题所在?任何帮助将不胜感激。
我已经激活了访问日志记录,这需要很长时间并且对我没有太大帮助,尤其是因为生成日志大约需要 45 分钟。忽略状态为 200 的响应,日志中出现以下消息(bucket 代表我的存储桶的名称):
- GET /bucket?encryption= 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 拒绝访问
我通过
构建了一个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。