繁体   English   中英

如何在 Spring Boot 应用程序中初始化 AWS SDK?

[英]How to initialize AWS SDK in spring boot application?

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

在 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>

如果您在 Spring Boot 中使用 Spring Cloud AWS,则可以通过自动配置为您设置一些 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等属性。

有几种方法可以管理它。

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

     AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();

如何配置 aws cli

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

  2. 您可以在application/properties定义您的 ACCESS KEY 和 SECRET KEY 并通过@Value在 sqs 类中@Value

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

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

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

我避免使用属性文件,而是在这里更多地使用凭证提供者链, AWS 文档

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

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

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

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

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

  • DefaultAWSCredentialsProviderChain
  • EnvironmentVariableCredentialsProvider
  • SystemPropertiesCredentialsProvider
  • ProfileCredentialsProvider
  • EC2ContainerCredentialsProviderWrapper

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM