【问题标题】:using s3 copy failed with access denied使用 s3 复制失败,访问被拒绝
【发布时间】:2017-03-17 05:03:00
【问题描述】:

我正在尝试将文件从 s3 存储桶中的一个文件夹复制到另一个文件夹。我正在使用 aws jdk 复制文件。我检查了其他问题,但主要是使用其他 sdk。我使用了这篇文章中提到的相同方式(AWS S3 copy object source key and destination key),只是我的密钥包含文件夹结构不同。

我正在使用下面的代码。

public CopyObjectResult copyToAFolder(String sourceBucketName,
        String sourceKeyName, String destinationBucketName,
        String destinationKeyName) {
    LOG.info(
            "Archiving the file Source:{},SourceKey:{},Destination:{},DestinationKey:{}",
            new Object[] { sourceBucketName, sourceKeyName, destinationBucketName,
                    destinationKeyName });
    CopyObjectRequest copyObjRequest = new CopyObjectRequest(sourceBucketName,
            sourceKeyName, destinationBucketName, destinationKeyName);
    return amazonS3Client.copyObject(copyObjRequest);
}

我是这样传参数的。我是通过listing服务得到的键名,所以键名是对的。

 sourceBucketName: myTestBucket
 sourceKeyName:testing/movement/sample.txt
 destinationBucketName:myTestBucket
 destinationKeyName:testing/movement2/sample.txt(I have tried with /testing/movement2/ also)

这会因 accessDenied 异常而失败。我拥有此存储桶的完全访问权限,我可以使用 S3Client 从此存储桶中删除文件。拒绝访问仅针对复制。知道为什么会发生这种情况。

错误。

com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: XXXXXXXXXXXX)
        at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1343) ~[aws-java-sdk-core-1.11.37.jar:na]
        at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:961) ~[aws-java-sdk-core-1.11.37.jar:na]
        at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:738) ~[aws-java-sdk-core-1.11.37.jar:na]
        at com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:489) ~[aws-java-sdk-core-1.11.37.jar:na]
        at com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:448) ~[aws-java-sdk-core-1.11.37.jar:na]
        at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:397) ~[aws-java-sdk-core-1.11.37.jar:na]
        at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:378) ~[aws-java-sdk-core-1.11.37.jar:na]
        at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4039) ~[aws-java-sdk-s3-1.11.37.jar:na]
        at com.amazonaws.services.s3.AmazonS3Client.copyObject(AmazonS3Client.java:1714) ~[aws-java-sdk-s3-1.11.37.jar:na]

【问题讨论】:

  • 你检查文件是否有权限,文件可能除了bucket之外还有自己的权限
  • 它有权限,我可以删除这个文件。
  • 您是否以 IAM 用户的身份发出请求,AWS 检查不同上下文的权限docs.aws.amazon.com/AmazonS3/latest/dev/…
  • 你在哪里运行这段代码?在分配了角色的 EC2 实例上?还是从您的本地计算机?主要问题是代码如何获取凭证以及这些凭证是否对 both 存储桶具有权限。尝试复制到 same 存储桶中的不同路径作为检查凭据的测试。您甚至可以尝试拨打ListObjects 来查看您是否有适当的存储桶访问权限。

标签: java amazon-s3 aws-sdk


【解决方案1】:

我遇到了类似的问题,我被拒绝访问..

原来是因为我没有复制带有元数据的对象,因此添加了加密算法。

    ObjectMetadata metadatum = new ObjectMetadata();
    metadatum.setSSEAlgorithm(AES);
    request.setNewObjectMetadata(metadatum);

【讨论】:

    【解决方案2】:

    解决办法可以,

    • 您需要在 Java 代码中提及正确的 AWS S3 Endpoint。
    • 在 Internet Explorer 中比在 Chrome 中尝试。因为 Chrome 只接受文件名而不是整个文件路径。
    • 如果您尝试从 EC2 实例访问 S3,则实例应具有具有必要权限的 S3 IAM 角色。
    • 如果您在本地计算机上工作,请确保访问密钥和秘密访问密钥均正确且有效。

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 2021-07-27
      相关资源
      最近更新 更多