【问题标题】:AWS S3 with Spring Boot error "profile file cannot be null"带有 Spring Boot 错误“配置文件不能为空”的 AWS S3
【发布时间】:2023-03-14 07:05:01
【问题描述】:

我有 IAM 角色和客户区域。如何在 EC2 实例中不存在的 Spring Boot 应用程序中授予访问 S3 的权限?

@Configuration
public class AWSConfiguration {

    String clientRegion = "...";
    String roleARN = "...";

    @Bean
    public AmazonS3 amazonS3Client() {

        try {
            AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider()).withRegion(clientRegion).build();

            AssumeRoleRequest roleRequest = new AssumeRoleRequest().withRoleArn(roleARN);
            AssumeRoleResult roleResponse = stsClient.assumeRole(roleRequest);
            Credentials sessionCredentials = roleResponse.getCredentials();

            BasicAWSCredentials basicAwsCred = new BasicAWSCredentials(sessionCredentials.getAccessKeyId(), sessionCredentials.getSecretAccessKey());

            return AmazonS3ClientBuilder.standard()
                    .withCredentials(new AWSStaticCredentialsProvider(basicAwsCred)).withRegion(clientRegion).build();

        } catch (AmazonServiceException e) {
            e.printStackTrace();
        } catch (SdkClientException e) {
            e.printStackTrace();
        }
        return null;
    }
}

我收到以下错误

Caused by: java.lang.IllegalArgumentException: profile file cannot be null
    at com.amazonaws.util.ValidationUtils.assertNotNull(ValidationUtils.java:37) ~[aws-java-sdk-core-1.11.946.jar:na]
    at com.amazonaws.auth.profile.ProfilesConfigFile.<init>(ProfilesConfigFile.java:142) ~[aws-java-sdk-core-1.11.946.jar:na]
    at com.amazonaws.auth.profile.ProfilesConfigFile.<init>(ProfilesConfigFile.java:133) ~[aws-java-sdk-core-1.11.946.jar:na]
    at com.amazonaws.auth.profile.ProfilesConfigFile.<init>(ProfilesConfigFile.java:100) ~[aws-java-sdk-core-1.11.946.jar:na]
    at com.amazonaws.auth.profile.ProfileCredentialsProvider.getCredentials(ProfileCredentialsProvider.java:135) ~[aws-java-sdk-core-1.11.946.jar:na]
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.getCredentialsFromContext(AmazonHttpClient.java:1257) ~[aws-java-sdk-core-1.11.946.jar:na]
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.runBeforeRequestHandlers(AmazonHttpClient.java:833) ~[aws-java-sdk-core-1.11.946.jar:na]
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:783) ~[aws-java-sdk-core-1.11.946.jar:na]

我尝试将 ProfileCredentialsProvider 更改为 DefaultAWSCredentialsProviderChain.getInstance() 但它仍然给我同样的错误并且还询问我角色会话名称。

【问题讨论】:

  • 您的凭据是否配置在某处(环境变量、Java 系统属性等?)
  • 没有。我假设基于 roleArn 和 clientRegion,AWS SDK 将获取凭证并将其设置在 java 系统属性中。我将此称为参考docs.aws.amazon.com/AmazonS3/latest/dev/…
  • 您仍然需要先进行身份验证才能检索会话凭据
  • 我是 AWS 新手。有没有其他方法可以通过只有 roleArn 和 clientRegion 来连接 S3?
  • 不,AWS 需要先检查您是否被允许担任该角色。如果您承诺,您需要使用环境或系统属性等...如果您在 EC2 中运行您的应用程序,您可以将角色配置到实例配置文件中,然后调用 S3 将使用实例角色

标签: java spring amazon-web-services spring-boot amazon-s3


【解决方案1】:

您需要使用环境变量、java 系统属性等提供您的凭据。SDK 才能担任角色。如果您的代码在正确配置了实例配置文件的情况下从 EC2 实例运行,则这不是强制性的,该角色将被自动使用。

这是一个两步过程:

  • 您需要向有权担任该角色的用户进行身份验证
  • 然后您可以检索角色的会话凭据,并使用它们访问具有角色权限的 S3

要在 EC2 中使用,您可以找到文档here

编辑:

了解使用访问密钥访问 AWS 的最佳实践的好页面:here

对于在实例上运行的应用程序、AWS CLI 和适用于 Windows PowerShell 的工具命令,您不必显式获取临时安全凭证 — AWS 开发工具包、AWS CLI 和适用于 Windows PowerShell 的工具会自动从EC2 实例元数据服务并使用它们。要使用临时安全凭证在实例外部进行调用(例如,测试 IAM 策略),您必须提供访问密钥、秘密密钥和会话令牌。

【讨论】:

  • 我的 Spring Boot 应用程序没有在 EC2 实例上运行。我还应该使用 STS 进行身份验证吗?
  • 我认为这不会那么有用。您可以为您的应用程序设置一个专用用户,该用户具有您所需的最少权限并使用访问密钥。一件事是,如果您使用 STS,您将必须管理令牌更新并且需要经过身份验证的用户来执行此操作
  • 根据我的组织 IT 团队,他们目前只能为我提供 IAM 角色和区域名称。如果我想避免 STS,是否有任何替代方法可以仅基于传递的 IAM 角色和区域连接到 AWS?
【解决方案2】:

您使用的是较旧的 V1 Java S3 API。您应该考虑迁移到适用于 Amazon S3 的 Java V2 API。

您的问题看起来像是您设置信用的方式。如果您正在开发 Spring Boot 应用程序,则应使用环境变量设置凭据。例如:

Region region = Region.US_WEST_2;
    S3Client s3 = S3Client.builder()
            .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
            .region(region)
            .build();

如果您想将此 Web 应用程序部署到(例如 AWS Elastic Beanstalk),您只需设置环境变量以及与 Amazon S3 交互的 Spring Boot 应用程序即可。

要了解如何从 Spring Boot Web 应用程序成功调用 Amazon S3,请参阅此 AWS 教程教程。本教程讨论如何构建一个 Spring Boot 应用程序,该应用程序可以从 Amazon S3 存储桶中检索图像(使用 S3 Java V2 API)并使用 Amazon Rekognition 服务对其进行分析。它还讨论了如何将 Web 应用程序部署到 Elastic Beanstalk。

Creating an example AWS photo analyzer application using the AWS SDK for Java

【讨论】:

  • 谢谢。我将使用新的 S3 API。所以,这意味着无论如何我需要在我的环境变量中设置访问密钥和秘密 ID。仅具有 IAM 角色和区域名称将不起作用。正确的?我假设基于我的 IAM 角色,AWS 将为我提供访问 S3 的临时凭证。
  • 正确 - 您需要在 Web 应用程序的环境变量中设置 IAM 角色的凭据。如果您在桌面上运行代码,则可以在凭据文件中设置它们。由于您是新手,请参阅 AWS DEV 主题——它将帮助您......docs.aws.amazon.com/sdk-for-java/latest/developer-guide/…
猜你喜欢
  • 2017-04-15
  • 2017-07-03
  • 2017-06-07
  • 2019-09-28
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 2016-04-01
相关资源
最近更新 更多