我已经看到 了这个,但是没有答案来解释我的问题。我首先使用了 此处 提供的示例(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 中的某些内容表示它为空)。
原文由 Xenalin 发布,翻译遵循 CC BY-SA 4.0 许可协议
看起来你在评论中解决了这个问题,但我对此很生气,想为未来的读者留下更清晰的答案。非常清楚, _这里的问题与 S3 中的文件无关_。此错误消息与硬盘驱动器上的文件或您尝试从 S3 推送/拉取的文件 _无关_。问题是您正在使用以下内容初始化 S3:
当您这样做时,它会在 ~/.aws/credentials 中查找配置文件列表。这可能在您的计算机上运行良好,但在您通过 IAM 角色(例如 Lambda、Docker、EC2 实例等)获得 AWS 访问权限的任何地方都不起作用。修复方法是像这样初始化 AmazonS3Client:
如果您使用的代码需要某种凭据提供程序,您还可以执行以下操作:
希望这能帮助下一个人。就我而言,我使用的是 DynamoDB 和 SQS,但我遇到了同样的错误。我最初忽略了这个问题,因为我认为你的问题与 S3 相关并且非常困惑。手腕一拍。
在较新版本的 SDK 上,您需要使用以下代码: