为啥将 Spring Cloud 应用程序与 AWS Parameter Store 集成不会从参数存储中返回任何属性?

Posted

技术标签:

【中文标题】为啥将 Spring Cloud 应用程序与 AWS Parameter Store 集成不会从参数存储中返回任何属性?【英文标题】:Why Integrating Spring Cloud application with the AWS Parameter Store return no property from param store?为什么将 Spring Cloud 应用程序与 AWS Parameter Store 集成不会从参数存储中返回任何属性? 【发布时间】:2019-05-31 17:16:28 【问题描述】:

意图:我正在开发一个 POC,它打算将 AWS 参数存储用作属性存储。这会将机密应用程序属性存储在 AWS SSM 的参数存储中。我正在使用 Java 8 和 spring启动/云版本 2。

Resource:我从 spring docs 关注 this ref guide 和

也是一篇综合文章Integrating the AWS Parameter Store with Spring Cloud。因此试图利用

spring-cloud-starter-aws-parameter-store-config.jar

因此在构建文件中添加了所需的依赖项。

预期输出:

实际输出

这是来自 AWS 控制台的快照我正在尝试从 AWS 参数存储访问下面显示的参数

以下是我的 spring 属性文件:

application.yml

bootstrap.yml

我在 POM.xml

中使用具有以下依赖项的 maven
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-aws-parameter-store-config</artifactId>
        </dependency>
    </dependencies>

我在这里错过了什么吗?如果有人已经遇到并解决了这个问题,请告诉我。

我可以从命令行输入和获取参数,只是无法让这个 java 库工作。

我正在尝试的示例的 GitHub 存储库 -

GitHub repo link

【问题讨论】:

参数存储的屏幕与ap-south-1是否来自同一区域? @slimane 是的..来自同一个区域.. ap-south-1,事实上我在我的 aws 实例的 Dev env 中只使用了那个区域 我在我的 aws 实例的 Dev env 中只使用那个区域是什么意思 @slimane 我有特定于环境的 aws 帐户,即 prod 和 dev 不同。在特定于 dev 的帐户中,所有概念证明都仅在 ap-south-1 区域中完成。我可以使用 CLI 从运行此应用程序的同一台机器上检索,它默认为 ap-south-1。 也许 region.auto=true 属性会覆盖静态值,你能验证一下吗? 【参考方案1】:

我检查了你的应用程序,它没有像我预期的那样工作,因为我有 ~.aws/config 文件,这会导致 AWS 凭证配置错误(由 DefaultAWSCredentialsProviderChain 引起,阅读更多 here ),所以我删除了它,我又试了一次,但它没有说 spring 在 env 中找不到 aws 区域,所以显然在 application.yml 中指定的那些将不会被使用,直到 spring 从 AWS 参数存储加载属性。

我是如何做到的

我补充说:

        System.setProperty("aws.accessKeyId","My_Key");
        System.setProperty("aws.secretKey","Secret");
        System.setProperty("aws.region","us-east-1");//same region where all your params exist

SpringApplication.run(DemoApplication.class, args); 之前,然后它起作用了。

aws.region 更改为另一个没有定义参数值的值时,我得到的结果与您的完全相同(空值)。

确保您的机器或 EC2 实例上没有任何会覆盖您应用中提供的配置的 aws 配置。

【讨论】:

是的,你是对的。.aws/config 文件有问题

以上是关于为啥将 Spring Cloud 应用程序与 AWS Parameter Store 集成不会从参数存储中返回任何属性?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 spring cloud gcp starter 将 Spring Boot 与 Cloud SQL 连接

为啥我的Maven引入spring-cloud-starter-zookeeper-all报红?

为啥部署在 Docker 容器上的 Spring Cloud Netflix 应用需要显式设置 eureka.instance.hostname?

为啥 spring-cloud-starter-config 忽略 bootstrap.properties?

当 spring-cloud-starter-zipkin 使用 zipkin.brave 时,为啥需要 Spring sleuth?

送书Spring Cloud与Docker微服务架构实战