Java AmazonS3异常:访问被拒绝

Java AmazonS3异常:访问被拒绝,java,amazon-web-services,authentication,amazon-s3,Java,Amazon Web Services,Authentication,Amazon S3,我正在尝试连接到s3 bucket以上载/下载图像 我创建s3客户端的代码如下: AmazonS3 s3 = AmazonS3ClientBuilder .standard() .withRegion("EU-WEST-2") .build(); com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Sta

我正在尝试连接到s3 bucket以上载/下载图像

我创建s3客户端的代码如下:

AmazonS3 s3 = AmazonS3ClientBuilder
            .standard()
            .withRegion("EU-WEST-2")
            .build();
com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 8574612863BD8DC2; S3 Extended Request ID: ueyZy/RLMerNtHeYaOTlRVAqD7w1CksWrjfNLuMgxPWXQbNGDF1Y04RUs4Gh9HeHMwLXxjBc+5o=), S3 Extended Request ID: ueyZy/RLMerNtHeYaOTlRVAqD7w1CksWrjfNLuMgxPWXQbNGDF1Y04RUs4Gh9HeHMwLXxjBc+5o=
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1630)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1302)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1056)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4330)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4277)
    at com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:1410)
    at uk.nhs.digital.cid.pyi.services.paycasso.PaycassoService.registerDocument(PaycassoService.java:80)
    at uk.nhs.digital.cid.pyi.harness.PaycassoClientTestHarness.testVeriSure(PaycassoClientTestHarness.java:61)
    at uk.nhs.digital.cid.pyi.harness.PaycassoClientTestHarness.main(PaycassoClientTestHarness.java:36)
我得到的例外情况如下:

AmazonS3 s3 = AmazonS3ClientBuilder
            .standard()
            .withRegion("EU-WEST-2")
            .build();
com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 8574612863BD8DC2; S3 Extended Request ID: ueyZy/RLMerNtHeYaOTlRVAqD7w1CksWrjfNLuMgxPWXQbNGDF1Y04RUs4Gh9HeHMwLXxjBc+5o=), S3 Extended Request ID: ueyZy/RLMerNtHeYaOTlRVAqD7w1CksWrjfNLuMgxPWXQbNGDF1Y04RUs4Gh9HeHMwLXxjBc+5o=
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1630)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1302)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1056)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4330)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4277)
    at com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:1410)
    at uk.nhs.digital.cid.pyi.services.paycasso.PaycassoService.registerDocument(PaycassoService.java:80)
    at uk.nhs.digital.cid.pyi.harness.PaycassoClientTestHarness.testVeriSure(PaycassoClientTestHarness.java:61)
    at uk.nhs.digital.cid.pyi.harness.PaycassoClientTestHarness.main(PaycassoClientTestHarness.java:36)

试试这个,您需要根据您的访问密钥和密码更改env.getProperty(“amazon.accessKey”)

public AmazonS3 getAmazonS3Client() {

        ClientConfiguration clientConfig = new ClientConfiguration();
        clientConfig.setProtocol(Protocol.HTTP);
        AmazonS3 s3client = new AmazonS3Client(getAmazonCredentials(), clientConfig);
        s3client.setS3ClientOptions(S3ClientOptions
                .builder()
                .setPathStyleAccess(true)
                .disableChunkedEncoding().build());

        return s3client;
    }

    public AWSCredentials getAmazonCredentials() {
        AWSCredentials credentials = new BasicAWSCredentials(
                env.getProperty("amazon.accessKey"),
                env.getProperty("amazon.secretKey")
        );
        return credentials;
    }
要检查bucket是否存在并上载文件,请选中此项

AmazonS3 s3client = amazonS3ClientService.getAmazonS3Client();
    if (!s3client.doesBucketExistV2(env.getProperty("amazon.bucket"))) {
        System.out.println("Bucket is not Exist.");
        return RepeatStatus.FINISHED;
    }

    // Upload Dir
    TransferManager transferManager = new TransferManager(amazonS3ClientService.getAmazonCredentials());
    MultipleFileUpload upload =
            transferManager.uploadDirectory(env.getProperty("amazon.bucket"), file.getName(), file,true);
如果要上载单个文件,请尝试以下操作:

 s3client .putObject(bucket_name, key_name, new File(file_path));

试试这个,您需要根据您的访问密钥和密码更改env.getProperty(“amazon.accessKey”)

public AmazonS3 getAmazonS3Client() {

        ClientConfiguration clientConfig = new ClientConfiguration();
        clientConfig.setProtocol(Protocol.HTTP);
        AmazonS3 s3client = new AmazonS3Client(getAmazonCredentials(), clientConfig);
        s3client.setS3ClientOptions(S3ClientOptions
                .builder()
                .setPathStyleAccess(true)
                .disableChunkedEncoding().build());

        return s3client;
    }

    public AWSCredentials getAmazonCredentials() {
        AWSCredentials credentials = new BasicAWSCredentials(
                env.getProperty("amazon.accessKey"),
                env.getProperty("amazon.secretKey")
        );
        return credentials;
    }
要检查bucket是否存在并上载文件,请选中此项

AmazonS3 s3client = amazonS3ClientService.getAmazonS3Client();
    if (!s3client.doesBucketExistV2(env.getProperty("amazon.bucket"))) {
        System.out.println("Bucket is not Exist.");
        return RepeatStatus.FINISHED;
    }

    // Upload Dir
    TransferManager transferManager = new TransferManager(amazonS3ClientService.getAmazonCredentials());
    MultipleFileUpload upload =
            transferManager.uploadDirectory(env.getProperty("amazon.bucket"), file.getName(), file,true);
如果要上载单个文件,请尝试以下操作:

 s3client .putObject(bucket_name, key_name, new File(file_path));
你有两个问题

  • 您正在为区域使用字符串。您需要使用
    .withRegion(Regions.EU\u WEST\u 2)
  • 从对您问题的评论中,我了解到您没有使用凭据。即使您的bucket是公共的,也必须使用AWS凭据才能使用AWSAPI。不支持匿名凭据 如果要使用匿名凭据(这意味着没有凭据),请使用正常的HTTP URL:
    https://s3.amazonaws.com/bucket/object
    带有库,如
    HttpUrlConnection

    在某些情况下,您可以为
    .withRegion()
    使用字符串,但前提是该区域不在区域枚举中。

    您有两个问题

  • 您正在为区域使用字符串。您需要使用
    .withRegion(Regions.EU\u WEST\u 2)
  • 从对您问题的评论中,我了解到您没有使用凭据。即使您的bucket是公共的,也必须使用AWS凭据才能使用AWSAPI。不支持匿名凭据 如果要使用匿名凭据(这意味着没有凭据),请使用正常的HTTP URL:
    https://s3.amazonaws.com/bucket/object
    带有库,如
    HttpUrlConnection


    在某些情况下,您可以为
    .withRegion()
    使用字符串,但前提是该区域不在区域枚举中。

    我也尝试过使用该字符串

    `AWSCredentials credentials;
        try {
            credentials = new ProfileCredentialsProvider().getCredentials();
        } catch (Exception e) {
            throw new AmazonClientException("Cannot load the credentials from the credential profiles file. "
                    + "Please make sure that your correct credentials file is at the correct "
                    + "location (/Users/userid/.aws/credentials), and is in valid format.", e);
        }
        AWSSecurityTokenServiceClient stsClient = new AWSSecurityTokenServiceClient(credentials);
    
        AssumeRoleRequest assumeRequest = new AssumeRoleRequest().withRoleArn(ROLE_ARN).withDurationSeconds(3600)
                .withRoleSessionName("demo");
    
        AssumeRoleResult assumeResult = stsClient.assumeRole(assumeRequest);
    
        BasicSessionCredentials temporaryCredentials = new BasicSessionCredentials(
                assumeResult.getCredentials().getAccessKeyId(), assumeResult.getCredentials().getSecretAccessKey(),
                assumeResult.getCredentials().getSessionToken());
    

    s3Client=newamazons3client(临时凭证)。with region(Regions.EU_WEST_2
    )`

    我也尝试过这个

    `AWSCredentials credentials;
        try {
            credentials = new ProfileCredentialsProvider().getCredentials();
        } catch (Exception e) {
            throw new AmazonClientException("Cannot load the credentials from the credential profiles file. "
                    + "Please make sure that your correct credentials file is at the correct "
                    + "location (/Users/userid/.aws/credentials), and is in valid format.", e);
        }
        AWSSecurityTokenServiceClient stsClient = new AWSSecurityTokenServiceClient(credentials);
    
        AssumeRoleRequest assumeRequest = new AssumeRoleRequest().withRoleArn(ROLE_ARN).withDurationSeconds(3600)
                .withRoleSessionName("demo");
    
        AssumeRoleResult assumeResult = stsClient.assumeRole(assumeRequest);
    
        BasicSessionCredentials temporaryCredentials = new BasicSessionCredentials(
                assumeResult.getCredentials().getAccessKeyId(), assumeResult.getCredentials().getSecretAccessKey(),
                assumeResult.getCredentials().getSessionToken());
    

    s3Client=new AmazonS3Client(临时凭证)。withRegion(Regions.EU_WEST_2
    )`

    为您的IAM角色提供可编程访问,同时在bucket策略中授予写入权限

       {
      "Version":"2012-10-17",
      "Statement":[
        {
          "Sid":"mybucketpolicy",
          "Effect":"Allow",
          "Principal": {"Service": "s3.amazonaws.com"},
          "Action":["s3:PutObject"],
          "Resource":["arn:aws:s3:::destination-bucket/*"],
          "Condition": {
              "ArnLike": {
                  "aws:SourceArn": "arn:aws:s3:::source-bucket"
               },
             "StringEquals": {
                 "aws:SourceAccount": "accid",
                 "s3:x-amz-acl": "bucket-owner-full-control"
              }
           }
        }
      ]
    }
    

    为您的IAM角色提供可编程访问,并在bucket策略中授予写入权限

       {
      "Version":"2012-10-17",
      "Statement":[
        {
          "Sid":"mybucketpolicy",
          "Effect":"Allow",
          "Principal": {"Service": "s3.amazonaws.com"},
          "Action":["s3:PutObject"],
          "Resource":["arn:aws:s3:::destination-bucket/*"],
          "Condition": {
              "ArnLike": {
                  "aws:SourceArn": "arn:aws:s3:::source-bucket"
               },
             "StringEquals": {
                 "aws:SourceAccount": "accid",
                 "s3:x-amz-acl": "bucket-owner-full-control"
              }
           }
        }
      ]
    }
    

    我也尝试过IAM Roleaws认证证书;请尝试{credentials=new ProfileCredentialsProvider().getCredentials();}catch(异常e){throw new AmazonClientException(“无法从凭据配置文件加载凭据”。+”请确保凭据文件位于正确的“+”位置(/Users/userid/.aws/credentials),并且格式有效,e);}你的s3美元是私人的。您应该使用用户密钥登录并访问令牌否,它是public@Himeshgoswami已尝试使用用户密钥和访问令牌,但它不起作用。我也尝试过使用IAM roleAWSCredentials;请尝试{credentials=new ProfileCredentialsProvider().getCredentials();}catch(异常e){throw new AmazonClientException(“无法从凭据配置文件加载凭据”。+”请确保凭据文件位于正确的“+”位置(/Users/userid/.aws/credentials),并且格式有效,e);}你的s3美元是私人的。您应该使用用户密钥登录并访问令牌否,它是public@Himeshgoswami已尝试使用用户密钥和访问令牌,但无法使用。感谢您的回答。但是我试过使用
    s3Client=newamazons3client(临时凭证)这也是谢谢你的回答。但是我试过使用
    s3Client=newamazons3client(临时凭证)这也是