【问题标题】:AWS S3 Credentials Provider not found (Java SDK)未找到 AWS S3 凭证提供程序(Java 开发工具包)
【发布时间】:2018-06-15 03:03:14
【问题描述】:

当尝试使用mvn test 在我的计算机上构建项目时,Amazon S3 客户端无法找到分别存储在 ~/.aws/credentials 和 ~/.aws/config 中的凭证和区域.

当使用 mvn exec 运行程序时,S3 客户端正确验证,并且相同功能没有问题。

有人知道为什么会这样吗?愿意研究替代解决方案,因为我想将应用程序移动到 docker 容器并且不想发送无论如何,该容器的凭据。

完整的错误信息:

com.airdev.serena.AWSTest  Time elapsed: 10.628 sec  <<< FAILURE!
com.amazonaws.SdkClientException: Unable to find a region via the region provider chain. Must provide an explicit region in the builder or setup environment to supply a region.
at com.airdev.serena.AWSTest.before(AWSTest.java:32)

~/.aws/config的内容:

[default]
region = us-west-1

不应该有任何权限问题 - ~/.aws/config 文件是可读的,我还是用 sudo 运行了测试套件。

编辑:

我尝试了以下构建 S3 客户端的方法,以及一些我没有代码的其他组合。

s3Client = AmazonS3ClientBuilder.defaultClient();

s3Client = AmazonS3ClientBuilder.standard()
                                     .withRegion("us-west-1") // The first region to try your request against
                                     .withForceGlobalBucketAccessEnabled(true) // If a bucket is in a different region, try again in the correct region
                                     .build();

即使我设置环境变量或删除 .aws 文件夹并通过aws configure 命令重新设置凭据,这些似乎都没有使用默认凭据链。

【问题讨论】:

  • 如何在 Java 应用程序中创建 S3 客户端?
  • @craigcaulfield 查看上面的编辑

标签: java maven amazon-web-services amazon-s3


【解决方案1】:

使用 aws cli 配置默认凭据提供程序,因为您可以使用 maven exec 进行选择,这可能不是原因。使用命令

aws configure

使用默认凭据提供程序

AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                       .withRegion(Regions.EU_WEST_1)
                       .build();

您还可以在代码中显式提供键。由于您愿意使用 docker,因此凭据需要在 docker 环境中。在代码中使用

BasicAWSCredentials awsCreds = new BasicAWSCredentials("access_key_id","secret_key_id");
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                        .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
                        .build();

【讨论】:

  • 感谢您的回答!将这些凭据直接放在代码中是否存在安全风险?我宁愿避免将身份验证密钥硬编码到代码中,并尽可能将它们保留在环境中,部分原因是它提供的灵活性,部分原因是我希望将代码保留在 GitHub 上。有关我尝试构建 S3 客户端的方式,请参阅编辑后的问题。
  • 尝试使用 Regions.US_WEST_1 进行测试,但没有骰子。
  • 另一个更新 - 正在使用的凭证适用于 IAM 用户,该用户可以完全访问此账户上的所有 S3 资源。账户中的存储桶是应该被访问的存储桶。但是,会发生此错误:com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied。我想也许有一个错误导致它无法访问正确的存储桶,这只出现在测试用例中?我会仔细检查一下。
  • 决定硬编码凭据作为其工作...感谢您的帮助!
  • 在代码中硬编码凭证总是存在风险,如果您在 EC2 上部署,您可以授予 EC2 角色以访问 S3,然后使用默认凭证提供程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 2015-08-18
相关资源
最近更新 更多