【发布时间】:2021-03-08 10:33:43
【问题描述】:
我正在尝试在 Amazon S3 上上传文件,但它返回此错误:
com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 26B9B4844CEA580C), S3 Extended Request ID: S0Ds3cvubCSZTAd1ESUG5rMRifGLHRAHBviyUHzDVI5W8FQxtRDMBNSrhVme6K86UryWxqORv30=
我已经在 AWS 上配置了 IAM 和存储桶,并且我使用了良好的访问权限/秘密(aws 给了我的那个)。有什么问题?谢谢!
S3Client 代码:
s3client = AmazonS3ClientBuilder
.standard()
.withRegion(Regions.CA_CENTRAL_1) // The first region to try your request against
.withForceGlobalBucketAccessEnabled(true) // If a bucket is in a different region, try again in the correct region
.withCredentials(AWSStaticCredentialsProvider(BasicAWSCredentials(accessKey, secretKey)))
.build()
上传文件代码:
private fun uploadFileTos3bucket(fileName: String, file: File) {
s3client.putObject(PutObjectRequest(bucketName, fileName, file)
.withCannedAcl(CannedAccessControlList.PublicRead))
}
IAM 用户:
【问题讨论】:
-
是否为存储桶分配了存储桶策略?
-
不,我是 AWS 新手,我应该添加一些东西吗?
-
不,但这就是您应该为您的存储桶权限屏幕截图显示的内容。如果没有存储桶策略,那么您似乎没有为访问密钥或秘密密钥设置正确的值,或者您没有在代码中设置正确的存储桶名称。
-
管理对象访问的最佳实践是使用 S3 策略,而不是单个对象 ACL,因为您可以一次管理对整个对象集的访问,而不是为每个对象单独配置 ACL。
blocking public access属性也可能会阻止调用。