【问题标题】:How to initialize AWS SDK in spring boot application?如何在 Spring Boot 应用程序中初始化 AWS SDK?
【发布时间】:2018-09-19 20:36:36
【问题描述】:

我正在编写一个从 SQS 读取消息的 Spring Boot 应用程序。我可以使用环境变量AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 运行应用程序。但是,我想知道通过类似于application.properties 的文件传递此配置会更简单。如何做到这一点?

【问题讨论】:

  • 您的应用程序在哪里运行:在 EC2 上的 AWS 中还是在 AWS 之外?
  • 我需要管理这两种情况。对于开发,它在我的 mac 上运行,在生产中它将在 EC2 上运行。

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


【解决方案1】:

在 Spring Boot 应用程序中,您可以使用 @value 注释访问 application.yml 文件中提到的属性。您可以像这样创建服务:

@Service
public class AmazonClient {  
    private AmazonSQS sqsClient;

    @Value("${amazonProperties.accessKey}")
    private String accessKey;
    @Value("${amazonProperties.secretKey}")
    private String secretKey;

    @PostConstruct
    private void initializeAmazon() {
        BasicAWSCredentials awsCredentials = new BasicAWSCredentials(this.accessKey, this.secretKey);
        this.sqsClient = AmazonSQSClientBuilder
                .standard()
                .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
                .build();

    }
}

application.yml 文件中:

amazonProperties:
   accessKey: <your_access_key>
   secretKey: <your_secret_key>

【讨论】:

    【解决方案2】:

    如果您在 EC2(主要是非开发环境)中运行您的服务,则无需配置 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY,因为 EC2ContainerCredentialsProviderWrapper 将自动从 AWS 容器中获取凭证。

        @Profile({"non-prod", "prod"})
        @Bean("AWSCredentialsProvider")
        public AWSCredentialsProvider amazonAWSCredentialsProvider() {
            return new EC2ContainerCredentialsProviderWrapper();
        }
    

    注意:如果您决定使用下面提到的任何AWSCredentialsProviderChain,那么请使用AWSCredentialsProvider 而不是AWSStaticCredentialsProvider,否则您最终会遇到 com.amazonaws.AmazonServiceException: The security token included in the request is expired 异常。

    • DefaultAWSCredentialsProviderChain
    • EnvironmentVariableCredentialsProvider
    • SystemPropertiesCredentialsProvider
    • ProfileCredentialsProvider
    • EC2ContainerCredentialsProviderWrapper

    如果应用程序在 AWS 之外运行,那么您可以使用带有硬编码值 awsAccessKeyIdawsSecretAccessKeyAWSStaticCredentialsProvider

    aws.awsAccessKeyId:AWS_ACCESS_KEY_ID
    aws.awsSecretAccessKey:AWS_SECRET_ACCESS_KEY
    
        @Value("${aws.awsAccessKeyId:}")
        private String awsAccessKeyId;
    
        @Value("${aws.awsSecretAccessKey:}")
        private String awsSecretAccessKey;
    
        @Profile({"dev", "test"})
        @Bean("AWSCredentialsProvider")
        public AWSStaticCredentialsProvider amazonAWSCredentialsProviderDevelopment() {
            return new AWSStaticCredentialsProvider(new BasicAWSCredentials(
                    awsAccessKeyId, awsSecretAccessKey));
        }
    

    【讨论】:

      【解决方案3】:

      我避免使用属性文件,而是在这里更多地使用凭据提供程序链,AWS Documentation

      虽然属性文件也可以被环境变量覆盖,但是如果我总是需要这样做,我为什么还要在属性文件中提到它。 另外我还想避免在代码中提交键(在属性文件中)

      此外,当我查看我的 CI/CD 时,为您的 Spring Boot 环境设置环境变量是有意义且容易的 - 特别是在云上。如果使用 docker env,就更简单、更干净了。

      【讨论】:

        【解决方案4】:

        如果您将 Spring Cloud AWS 与 Spring Boot 结合使用,则可以通过自动配置为您设置一些 AWS 客户端(如 SQS 和 SNS)和 EC2 元数据。对于本地测试,您可以使用通过应用程序属性设置的静态提供程序。

        文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-aws/2.0.1.RELEASE/single/spring-cloud-aws.html#_spring_boot_auto_configuration

        具体可以设置cloud.aws.credentials.accessKeycloud.aws.region.static等属性。

        【讨论】:

          【解决方案5】:

          aws sdk 2.0 的变化如下..

              AwsBasicCredentials awsCreds = AwsBasicCredentials.create(this.accessKey, this.secretKey);
          
              S3Client client = S3Client.builder().region(Region.AP_SOUTH_1)
                      .credentialsProvider(StaticCredentialsProvider.create(awsCreds))
                      .build();
          

          【讨论】:

            【解决方案6】:

            有几种方法可以管理它。

            1. 您可以配置 aws configure(在您的本地或 Linux 机器上),这将需要您的密钥和访问密钥,然后您不需要在默认构造函数中将这些传递给您可以创建连接,因为它将选择密钥等来自系统路径。

              AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
              

            How to configure aws cli

            1. 如果您使用的是 AWS EC2,那么当您创建 ec2 实例时,请确保为其分配一个有权访问 SQS 的角色,那么您甚至不需要在该机器上进行配置。

            2. 您可以在application/properties 中定义您的访问密钥和密钥,并通过@Value 加载到sqs 类中。

            3. 您可以在classpath 中创建aws.keys,并可以从文件中加载属性。

            4. 当然,您可以在Constant class 中将它们定义为常量。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-09-06
              • 2013-07-02
              • 2018-11-13
              • 1970-01-01
              • 1970-01-01
              • 2021-11-05
              • 1970-01-01
              相关资源
              最近更新 更多