我已经看过了this https://stackoverflow.com/questions/40897548/aws-java-s3-uploading-error-profile-file-cannot-be-null,但没有答案来解释我的问题。我首先使用提供的示例here http://docs.aws.amazon.com/AmazonS3/latest/dev/RetrievingObjectUsingJava.html(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.<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)
我可以保证 GetObjectRequest 中的 BucketName 和关键参数都不为空。这里有什么差异?为什么它只能在我的电脑上成功?这是否与我必须补充 aws-sdk jar 应该已经有的大量 jar (jackson-databind、jackson-core、jackson-annotations、httpclient、httpcore、commons-logging 和 joda-时间)?看起来很相似,否则会出现无法解释的错误(给出非空参数,aws-sdk 中的某些内容表示它为空)。
看来你在评论中解决了这个问题,但我对此很恼火,想为未来的读者留下更清晰的答案。说得超级清楚,这里的问题与S3中的文件无关。该错误消息有nothing与硬盘驱动器上的文件或您尝试从 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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)