我已经看过了,但没有答案可以解释我的问题.我首先使用了这里提供的示例(GetObject类),它立即在我的桌面上运行.但是,我的朋友无法让它在他的机器上工作,也不能在我们的EC2实例上工作.
有人提到有指定的凭证文件,这是有道理的,但我从来没有这样做,我很确定默认权限设置为允许访问此存储桶.
这是堆栈跟踪:
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.(ProfilesConfigFile.java:142) at com.amazonaws.auth.profile.ProfilesConfigFile. (ProfilesConfigFile.java:133) at com.amazonaws.auth.profile.ProfilesConfigFile. (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)
我可以保证getNameRequest中的bucketName和key params都不为null.这里的差异是什么?为什么它只能在我的电脑上成功?这完全与我不得不补充aws-sdk jar应该已经拥有的许多罐子这一事实有关(jackson-databind,jackson-core,jackson-annotations,httpclient,httpcore,commons-logging和joda-时间)?看起来很相似,但是在其他方面无法解释的错误(给出非空的参数,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有关并且非常困惑.手腕打了个屁.
瑞安(Ryan)投票最多的答案使我走上了正确的轨道,但是由于AmazonS3Client现在已弃用,因此此代码为我解决了问题
AmazonS3 s3 = AmazonS3ClientBuilder.standard() .withCredentials(DefaultAWSCredentialsProviderChain.getInstance()) .build();
在Lambda中,此代码似乎可以正确地承担起活跃的IAM角色。