【问题标题】:AWS S3 access denied with Java使用 Java 拒绝 AWS S3 访问
【发布时间】: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 用户:

S3 权限:

【问题讨论】:

  • 是否为存储桶分配了存储桶策略?
  • 不,我是 AWS 新手,我应该添加一些东西吗?
  • 不,但这就是您应该为您的存储桶权限屏幕截图显示的内容。如果没有存储桶策略,那么您似乎没有为访问密钥或秘密密钥设置正确的值,或者您没有在代码中设置正确的存储桶名称。
  • 管理对象访问的最佳实践是使用 S3 策略,而不是单个对象 ACL,因为您可以一次管理对整个对象集的访问,而不是为每个对象单独配置 ACL。 blocking public access 属性也可能会阻止调用。

标签: java amazon-s3


【解决方案1】:

我遇到了同样的问题。我让它禁用了第一个选项

阻止对通过新访问控制列表 (ACL) 授予的存储桶和对象的公共访问

如果您想获取有关默认 Canned ACL 的更多信息,这里是link

如果您不想禁用任何这些策略,您可以使用预签名的网址

你可以看例子here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-26
    • 2017-12-24
    • 2021-11-06
    • 2020-09-30
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多