Java AWS从S3下载对象时出错;配置文件不能为空";

Java AWS从S3下载对象时出错;配置文件不能为空";,java,amazon-web-services,amazon-s3,amazon-ec2,Java,Amazon Web Services,Amazon S3,Amazon Ec2,我已经看到了,但是没有答案来解释我的问题。我首先使用了提供的示例(GetObject类),它立即在我的桌面上工作。然而,我的朋友不能让它在他的机器上工作,也不能在我们的EC2实例上工作 有人提到要指定凭据文件,这是有道理的,但我从来没有这样做过,而且我非常确定默认权限设置为允许访问这个bucket 这是stacktrace: Exception in thread "main" java.lang.IllegalArgumentException: profile file cannot be

我已经看到了,但是没有答案来解释我的问题。我首先使用了提供的示例(GetObject类),它立即在我的桌面上工作。然而,我的朋友不能让它在他的机器上工作,也不能在我们的EC2实例上工作

有人提到要指定凭据文件,这是有道理的,但我从来没有这样做过,而且我非常确定默认权限设置为允许访问这个bucket

这是stacktrace:

Exception in thread "main" java.lang.IllegalArgumentException: profile file cannot be null
    at com.amazonaws.util.ValidationUtils.assertNotNull(ValidationUtils.java:37)
    at com.amazonaws.auth.profile.ProfilesConfigFile.<init>(ProfilesConfigFile.java:142)
    at com.amazonaws.auth.profile.ProfilesConfigFile.<init>(ProfilesConfigFile.java:133)
    at com.amazonaws.auth.profile.ProfilesConfigFile.<init>(ProfilesConfigFile.java:100)
    at com.amazonaws.auth.profile.ProfileCredentialsProvider.getCredentials(ProfileCredentialsProvider.java:135)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.getCredentialsFromContext(AmazonHttpClient.java:1029)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1049)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:949)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:662)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:636)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:619)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$300(AmazonHttpClient.java:587)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:574)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:446)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4035)
    at com.amazonaws.services.s3.AmazonS3Client.getBucketRegionViaHeadRequest(AmazonS3Client.java:4474)
    at com.amazonaws.services.s3.AmazonS3Client.fetchRegionFromCache(AmazonS3Client.java:4448)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4020)
    at com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:1307)
    at GetObject.main(GetObject.java:26)
线程“main”java.lang.IllegalArgumentException中的异常:配置文件不能为null 在com.amazonaws.util.ValidationUtils.assertNotNull(ValidationUtils.java:37) 位于com.amazonaws.auth.profile.ProfilesConfigFile.(ProfilesConfigFile.java:142) 在com.amazonaws.auth.profile.ProfilesConfigFile上。(ProfilesConfigFile.java:133) 位于com.amazonaws.auth.profile.ProfilesConfigFile.(ProfilesConfigFile.java:100) 在com.amazonaws.auth.profile.ProfileCredentialsProvider.getCredentials上(ProfileCredentialsProvider.java:135) 在com.amazonaws.http.AmazonHttpClient$RequestExecutor.getCredentialsFromContext(AmazonHttpClient.java:1029)上 在com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1049)上 在com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:949) 在com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:662) 在com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:636) 在com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute上(AmazonHttpClient.java:619) 位于com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$300(AmazonHttpClient.java:587) 在com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:574) 在com.amazonaws.http.AmazonHttpClient.execute上(AmazonHttpClient.java:446) 位于com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4035) 位于com.amazonaws.services.s3.AmazonS3Client.getBucketRegionViaHeadRequest(AmazonS3Client.java:4474) 位于com.amazonaws.services.s3.AmazonS3Client.fetchRegionFromCache(AmazonS3Client.java:4448) 位于com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4020) 位于com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:1307) 位于GetObject.main(GetObject.java:26)
我可以保证GetObjectRequest中的bucketName和key参数都不为null。这里的差异是什么?为什么它只能在我的电脑上成功?这是否与我必须补充aws sdk jar应该已经拥有的众多jar(jackson数据绑定、jackson core、jackson注释、httpclient、httpcore、commons日志和joda time)有关?这看起来很相似,还有一些无法解释的错误(给出了非空参数,aws sdk中的某些东西说它是空的)。

看起来你在评论中解决了这个问题,但我对此感到恼火,希望给未来的读者留下一个更清晰的答案。非常清楚,这里的问题与S3中的文件无关。此错误消息与硬盘上的文件或试图从S3推/拉的文件无关。问题是,您正在使用以下内容初始化S3:

AmazonS3 s3Client = new AmazonS3Client(new ProfileCredentialsProvider());
当您这样做时,它会在~/.aws/credentials中查找配置文件列表。这在您的计算机上可能非常有效,但在通过IAM角色(例如Lambda、Docker、EC2实例等)获得AWS访问权限的任何地方都不起作用。修复方法是初始化AmazonS3Client,如下所示:

AmazonS3 s3Client = new AmazonS3Client();
如果您使用的代码需要某种凭据提供程序,还可以执行以下操作:

AmazonS3 s3Client = new AmazonS3Client(DefaultAWSCredentialsProviderChain.getInstance());
希望这能帮助下一个人。在我的例子中,我使用的是DynamoDB和SQS,但我有同样的错误。我最初忽略了这个问题,因为我认为你的问题与S3有关,而且非常混乱。手腕拍了一下

在较新版本的SDK上,您需要使用以下代码:

AmazonS3 s3Client = AmazonS3ClientBuilder.standard()                  
                      .withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
                      .build();

原因是您朋友的计算机没有“凭据”文件

要解决此问题,请创建文件:

C:\Users\USERNAME \.aws\credentials"
~/.aws/credentials
对于Windows,或创建文件:

C:\Users\USERNAME \.aws\credentials"
~/.aws/credentials
适用于macOS、Linux或Unix。然后写

aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key"
进入文件


或者,您也可以设置环境变量
aws\u access\u key\u id
aws\u secret\u access\u key

Ryan投票最多的答案让我走上了正确的道路,但由于Amazon3Client现在已被弃用,该代码为我解决了问题

    AmazonS3 s3 = AmazonS3ClientBuilder.standard()
                  .withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
                  .build();

此代码似乎正确地选择了活动IAM角色,例如在Lambda中。

我使用了以下代码并为我工作,希望它会有所帮助

       BasicAWSCredentials credentials = new BasicAWSCredentials(accesskey, secretkey);

            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new AWSStaticCredentialsProvider(credentials))
                    .withRegion("ap-south-1")
                    .build();   

BasicAWSCredentials
可能需要这三个组件:

BasicAWSCredentials credentials=新的BasicAWSCredentials(accesskey、secretkey、accessToken);

也考虑,如果凭据来自您的.AWS文件夹,或者您提供的正是上面,用<代码> Basic凭据Lo../P>不确定您是否见过这个:我仍然在查看您的链接和“与AWS凭据一起工作”页面链接到它,但是我从来没有为我的eclipse项目设置过这些,而且我没有凭证文件。我只是开箱即用地运行了这个示例,效果很好。我仍然感到困惑。好吧,我想我发现了这个问题:我原以为凭证会存储在项目文件夹中,但我完全忘记了~/.aws/credentials文件,尽管我从链接的问题中读到了它。我只需要知道如何为在EC2实例上运行的jar设置此设置。作为一般规则,请记住,出于安全考虑,始终建议使用EC2角色,而不是在实例存储上存储用户凭据的配置文件。很抱歉,忘记了文件头前面的[default]。如果您计划