【发布时间】:2017-06-07 08:56:58
【问题描述】:
我已经看过this,但没有答案来解释我的问题。我首先使用了here(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 和 key params 都不为空。这里有什么差异?为什么它只能在我的 PC 上成功?这是否与我必须补充 aws-sdk jar 应该已经拥有的许多 jar 的事实有关(jackson-databind、jackson-core、jackson-annotations、httpclient、httpcore、commons-logging 和 joda-时间)?看起来很相似,否则会出现无法解释的错误(给出非空参数,aws-sdk 中的某些内容说它是空的)。
【问题讨论】:
-
不确定你是否看过这个:stackoverflow.com/a/41670728/3770040
-
我仍在查看您的链接以及从中链接的“使用 AWS 凭证”页面,但我从未为我的 Eclipse 项目设置这些,而且我没有凭证文件。我只是开箱即用地运行示例,它运行良好。我还是一头雾水。
-
好的,我想我发现了问题:我认为凭据会存储在项目文件夹中,但我完全忘记了 ~/.aws/credentials 文件,尽管它是黑色的和我链接的问题中的白色。我只需要知道如何为在我的 EC2 实例上运行的 jar 进行设置。
-
作为一般规则,请记住,就安全性而言,始终建议使用 EC2 角色,而不是在实例存储中存储用户凭据的配置文件。
标签: java amazon-web-services amazon-s3 amazon-ec2