AWS 从 S3 下载对象时出错,“配置文件不能为空”

新手上路,请多包涵

我已经看到 了这个,但是没有答案来解释我的问题。我首先使用了 此处 提供的示例(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 许可协议

阅读 669
2 个回答

看起来你在评论中解决了这个问题,但我对此很生气,想为未来的读者留下更清晰的答案。非常清楚, _这里的问题与 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();

原文由 Ryan Shillington 发布,翻译遵循 CC BY-SA 4.0 许可协议

Ryan 投票最高的答案让我走上了正确的轨道,但由于 AmazonS3Client 现在已被弃用,这段代码已经为我解决了这个问题

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

这段代码似乎正确地选择了活跃的 IAM 角色,比如在 Lambda 中。

原文由 Jonathan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题