我有一个使用S3存储桶的Spring Boot应用程序。
根据Amazon(https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-roles.html)的顺序应为:



在系统环境变量中:AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY。
在Java系统属性中:aws.accessKeyId和aws.secretKey。
在默认凭据文件中(此文件的位置因平台而异)。
在实例配置文件凭证中,该凭证存在于与EC2实例的IAM角色关联的实例元数据中。



但是我的代码忽略了application.properties中的aws.accessKeyId和aws.secretKey。

public AmazonS3 getS3Client() {
    AWSCredentialsProviderChain instanceProvider = new AWSCredentialsProviderChain();
    AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard();
    builder.setCredentials(instanceProvider);
    builder.setRegion(region);
    return builder.build();
}


当我在EC2实例上使用它时,它可以工作,但是当我尝试在本地使用它进行开发时,它会失败。

更新:

也尝试过

        DefaultAWSCredentialsProviderChain instanceProvider = new DefaultAWSCredentialsProviderChain();
        System.out.println(instanceProvider.getCredentials().getAWSAccessKeyId());
        System.out.println(instanceProvider.getCredentials().getAWSSecretKey());
        return AmazonS3ClientBuilder.standard().withCredentials(instanceProvider).withRegion(region).build();


它也失败了。当我打印访问密钥时,它显示正确的值和不同的秘密(由于安全原因,我认为它是加密的)。
如果我使用BasicCredentials,它可以工作。

BasicAWSCredentials creds = new BasicAWSCredentials(keyName, secretKey);
        return AmazonS3ClientBuilder.standard().withRegion(region)
                .withCredentials(new AWSStaticCredentialsProvider(creds)).disableChunkedEncoding().build();

最佳答案

我不确定您发布的代码在EC2上如何工作,因为AWSCredentialsProviderChain需要提供程序列表。

您想要的是DefaultAWSCredentialsProviderChain

但是,您不需要显式的凭据提供程序(这可能就是它起作用的原因),因为AmazonS3ClientBuilder.standard()创建具有所有默认设置(包括默认提供程序链)的构建器。

如果更改类不能解决您的问题,那么您需要编辑问题以显示(1)您正在使用的命令行(编辑键),以及(2)从终点站。

关于java - 无法读取aws.accessKeyId和aws.secretKey,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56563245/

10-09 02:03