如何在Spring Boot应用程序中初始化AWS开发工具包?

时间:2018-09-19 20:36:37

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

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

6 个答案:

答案 0 :(得分:1)

您可以通过几种方法对其进行管理。

  1. 您可以配置aws configure(在本地或linux机器上),这将是您的秘密密钥和访问密钥所必需的,然后默认情况下您不需要在api中传递它们即可创建连接,因为它将选择秘密ket等)。

    AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
    

How to configure aws cli

  1. 如果您使用的是AWS EC2,则在创建ec2实例时,请确保为其分配一个具有SQS权限的角色,那么您甚至无需在该计算机上进行配置。

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

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

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

答案 1 :(得分:1)

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

@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 :(得分:0)

如果您将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之类的属性。

答案 3 :(得分:0)

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();

答案 4 :(得分:0)

我避免使用属性文件,而是在此处AWS Documentation

中更多地使用凭据提供程序链

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

此外,当我查看CI / CD时,为Spring Boot Environment设置环境变量非常有意义,也很容易-特别是在云上。如果使用docker env,则更轻松,更清洁。

答案 5 :(得分:0)

如果您在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外部运行,则可以使用AWSStaticCredentialsProviderawsAccessKeyId的硬编码值

awsSecretAccessKey
aws.awsAccessKeyId:AWS_ACCESS_KEY_ID
aws.awsSecretAccessKey:AWS_SECRET_ACCESS_KEY