从 Java 代码创建 S3 批处理作业时出现 400 错误请求错误

Getting 400 Bad Request Error while creating S3 Batch Job from Java Code

根据 doc,我正在尝试从 Java 代码创建批处理作业。 我能够从具有相同角色和 lambda arn 的控制台创建作业,但是从代码中,我收到 400 Bad Request。此外,根据此 doc

,我没有看到任何错误消息

这是我的代码片段 -

JobOperation jobOperation = new JobOperation().withLambdaInvoke(new LambdaInvokeOperation()
                    .withFunctionArn("arn:aws:lambda:eu-west-1:<account_id>:function:s3BatchOperarationsPOCLambda"));

            JobManifest manifest = new JobManifest()
                    .withSpec(new JobManifestSpec().withFormat(JobManifestFormat.S3InventoryReport_CSV_20161130)
                            .withFields(new String[] { "Bucket", "Key" }))
                    .withLocation(
                            new JobManifestLocation().withObjectArn("arn:aws:s3:::<bucket_name>/manifest.csv")
                                    .withETag("e55392fa1ad40a08e40b13b3c000a0aa"));

            JobReport jobReport = new JobReport().withBucket(reportBucketName).withPrefix("testreport")
                    .withFormat(JobReportFormat.Report_CSV_20180820).withEnabled(true).withReportScope("AllTasks");

            AWSS3Control s3ControlClient = AWSS3ControlClientBuilder.standard().withRegion(Regions.US_WEST_1).build();

            String roleArn = "arn:aws:iam::<account_id>:role/S3-Batch-Role";
            String accountId = <account_id>;
            s3ControlClient.createJob(new CreateJobRequest().withAccountId(accountId).withOperation(jobOperation)
                    .withManifest(manifest).withPriority(12).withRoleArn(roleArn).withReport(jobReport)
                    .withClientRequestToken(uuid).withDescription("S3 job").withConfirmationRequired(false));


        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it and returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            System.out.println("test2" + e.getMessage());

            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }

角色拥有完全的IAM和s3批量操作权限,同时lambda拥有s3的访问权限。 还为批处理操作定义了信任策略。

这是我的错误日志 -

 (Service: AWSS3Control; Status Code: 400; Error Code: 400 Bad Request; Request ID: null; Proxy: null)
com.amazonaws.services.s3control.model.AWSS3ControlException: null (Service: AWSS3Control; Status Code: 400; Error Code: 400 Bad Request; Request ID: null; Proxy: null)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1811)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleServiceErrorResponse(AmazonHttpClient.java:1395)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1371)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1145)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:802)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:770)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:744)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access0(AmazonHttpClient.java:704)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:686)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:550)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:530)
    at com.amazonaws.services.s3control.AWSS3ControlClient.doInvoke(AWSS3ControlClient.java:1532)
    at com.amazonaws.services.s3control.AWSS3ControlClient.invoke(AWSS3ControlClient.java:1499)
    at com.amazonaws.services.s3control.AWSS3ControlClient.invoke(AWSS3ControlClient.java:1488)
    at com.amazonaws.services.s3control.AWSS3ControlClient.executeCreateJob(AWSS3ControlClient.java:265)
    at com.amazonaws.services.s3control.AWSS3ControlClient.createJob(AWSS3ControlClient.java:236)
    at com.code.platformintegrationsscheduler.handlers.test.createS3Job(test.java:68)
    at com.code.platformintegrationsscheduler.handlers.test.main(test.java:27)

我今天遇到了同样的问题,经过一些调试并在 CLI 上尝试相同的操作后,我发现 new JobReport().withBucket(reportBucketName) 使用 bucketArn 而不是存储桶名称。

您的实际问题可能有所不同。我建议您从代码序列化您的请求并在 CLI 中尝试相同的操作并匹配两个请求。

AWS 错误消息在我们实际需要时通常不是很有用。

我遇到了问题,问题与 gradle 版本有关,我们需要确保所有 aws 服务 gradle 版本都相同。

以我为例 -

    compile group: 'com.amazonaws', name: 'aws-java-sdk-dynamodb', version: '1.11.844'
    compile group: 'com.amazonaws', name: 'aws-java-sdk-iam', version: '1.11.844' 
    compile group: 'com.amazonaws', name: 'aws-java-sdk-events', version: '1.11.844'
    compile group: 'com.amazonaws', name: 'aws-java-sdk-s3', version: '1.11.844'
    compile group: 'com.amazonaws', name: 'aws-java-sdk-batch', version: '1.11.844'
    compile group: 'com.amazonaws', name: 'aws-java-sdk-s3control', version:'1.11.844'