Spring 引导从 AWS 参数存储读取参数
Spring boot reading parameters from AWS parameter store
我创建了 spring boot(gradle) 应用程序,并包含依赖项:
org.springframework.cloud:spring-cloud-starter-aws-parameter-store-config
.
我想使用 AWSSimpleSystemsManagement
从 AWS 参数存储中读取配置,但我不得不这样写(在 aws 中):
config/application_dev/server.port: 8080
有没有办法从 spring 引导读取类似的内容:dev.application.server.port:8080
我认为目前所有这些都是通过自动配置管理的,有没有办法覆盖它
您需要创建一个 bootstrap.propeties 文件以配置根路径
将 "aws.paramstore.prefix = dev" 添加到文件以替换 "config"
请参考:
https://cloud.spring.io/spring-cloud-static/spring-cloud-aws/2.0.0.RELEASE/multi/multi__cloud_environment.html
第 3.2 节
在application.properties中你可以定义属性server.port=8081
.
spring-cloud-starter-aws-parameter-store-config支持的parameter formats是:
/config/application/server.port
/config/application_dev/server.port
/config/my-service/server.port
/config/my-service_dev/server.port
通过在 bootstrap.properties 中定义以下属性,您可以以某种方式更改格式:
spring.application.name=my-service
aws.paramstore.prefix=/config
aws.paramstore.defaultContext=application
aws.paramstore.profileSeparator=_
但只支持简单的自定义,因为主要参数命名逻辑在 AwsParamStorePropertySourceLocator
中是硬编码的。
要显着更改参数格式,您必须定义自定义 PropertySourceLocator
并将其注册为 bootstrap 配置。
问题是 dev.application.server.port
是无效的参数名称。
AWS Systems Manager Parameter Store 使用 /
作为路径分隔符,Spring 使用操作 get-parameters-by-path。
解决方法是使用名称 dev.application/server.port
。
但是这个名字也是无效的。
参数名称必须是完全限定名称,因此有效名称为 /dev.application/server.port
.
要支持这样的参数格式定义自定义 PropertySourceLocator
@Configuration
public class CustomAwsParamStorePropertySourceLocator implements PropertySourceLocator {
private static final Logger LOGGER =
LoggerFactory.getLogger(CustomAwsParamStorePropertySourceLocator.class);
private AWSSimpleSystemsManagement ssmClient;
private List<String> contexts = new ArrayList<>();
public CustomAwsParamStorePropertySourceLocator(AWSSimpleSystemsManagement ssmClient) {
this.ssmClient = ssmClient;
}
public List<String> getContexts() {
return contexts;
}
@Override
public PropertySource<?> locate(Environment environment) {
if (!(environment instanceof ConfigurableEnvironment)) {
return null;
}
ConfigurableEnvironment env = (ConfigurableEnvironment) environment;
List<String> profiles = Arrays.asList(env.getActiveProfiles());
String defaultAppName = "application";
this.contexts.add("/" + defaultAppName + "/");
addProfiles(this.contexts, defaultAppName, profiles);
String appName = env.getProperty("spring.application.name");
this.contexts.add("/" + appName + "/");
addProfiles(this.contexts, appName, profiles);
Collections.reverse(this.contexts);
CompositePropertySource composite = new CompositePropertySource("custom-aws-param-store");
for (String propertySourceContext : this.contexts) {
try {
composite.addPropertySource(create(propertySourceContext));
} catch (Exception e) {
LOGGER.warn("Unable to load AWS config from " + propertySourceContext, e);
}
}
return composite;
}
private void addProfiles(List<String> contexts, String appName, List<String> profiles) {
for (String profile : profiles) {
contexts.add("/" + profile + "." + appName + "/");
}
}
private AwsParamStorePropertySource create(String context) {
AwsParamStorePropertySource propertySource =
new AwsParamStorePropertySource(context, this.ssmClient);
propertySource.init();
return propertySource;
}
}
并通过添加文件 META-INF/spring.factories
在 bootstrap 上下文中注册它
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.example.CustomAwsParamStorePropertySourceLocator
试试这个 spring-boot-and-aws-parameter-store
https://github.com/coveooss/spring-boot-parameter-store-integration
我创建了 spring boot(gradle) 应用程序,并包含依赖项:
org.springframework.cloud:spring-cloud-starter-aws-parameter-store-config
.
我想使用 AWSSimpleSystemsManagement
从 AWS 参数存储中读取配置,但我不得不这样写(在 aws 中):
config/application_dev/server.port: 8080
有没有办法从 spring 引导读取类似的内容:dev.application.server.port:8080
我认为目前所有这些都是通过自动配置管理的,有没有办法覆盖它
您需要创建一个 bootstrap.propeties 文件以配置根路径 将 "aws.paramstore.prefix = dev" 添加到文件以替换 "config"
请参考: https://cloud.spring.io/spring-cloud-static/spring-cloud-aws/2.0.0.RELEASE/multi/multi__cloud_environment.html 第 3.2 节
在application.properties中你可以定义属性server.port=8081
.
spring-cloud-starter-aws-parameter-store-config支持的parameter formats是:
/config/application/server.port
/config/application_dev/server.port
/config/my-service/server.port
/config/my-service_dev/server.port
通过在 bootstrap.properties 中定义以下属性,您可以以某种方式更改格式:
spring.application.name=my-service
aws.paramstore.prefix=/config
aws.paramstore.defaultContext=application
aws.paramstore.profileSeparator=_
但只支持简单的自定义,因为主要参数命名逻辑在 AwsParamStorePropertySourceLocator
中是硬编码的。
要显着更改参数格式,您必须定义自定义 PropertySourceLocator
并将其注册为 bootstrap 配置。
问题是 dev.application.server.port
是无效的参数名称。
AWS Systems Manager Parameter Store 使用 /
作为路径分隔符,Spring 使用操作 get-parameters-by-path。
解决方法是使用名称 dev.application/server.port
。
但是这个名字也是无效的。
参数名称必须是完全限定名称,因此有效名称为 /dev.application/server.port
.
要支持这样的参数格式定义自定义 PropertySourceLocator
@Configuration
public class CustomAwsParamStorePropertySourceLocator implements PropertySourceLocator {
private static final Logger LOGGER =
LoggerFactory.getLogger(CustomAwsParamStorePropertySourceLocator.class);
private AWSSimpleSystemsManagement ssmClient;
private List<String> contexts = new ArrayList<>();
public CustomAwsParamStorePropertySourceLocator(AWSSimpleSystemsManagement ssmClient) {
this.ssmClient = ssmClient;
}
public List<String> getContexts() {
return contexts;
}
@Override
public PropertySource<?> locate(Environment environment) {
if (!(environment instanceof ConfigurableEnvironment)) {
return null;
}
ConfigurableEnvironment env = (ConfigurableEnvironment) environment;
List<String> profiles = Arrays.asList(env.getActiveProfiles());
String defaultAppName = "application";
this.contexts.add("/" + defaultAppName + "/");
addProfiles(this.contexts, defaultAppName, profiles);
String appName = env.getProperty("spring.application.name");
this.contexts.add("/" + appName + "/");
addProfiles(this.contexts, appName, profiles);
Collections.reverse(this.contexts);
CompositePropertySource composite = new CompositePropertySource("custom-aws-param-store");
for (String propertySourceContext : this.contexts) {
try {
composite.addPropertySource(create(propertySourceContext));
} catch (Exception e) {
LOGGER.warn("Unable to load AWS config from " + propertySourceContext, e);
}
}
return composite;
}
private void addProfiles(List<String> contexts, String appName, List<String> profiles) {
for (String profile : profiles) {
contexts.add("/" + profile + "." + appName + "/");
}
}
private AwsParamStorePropertySource create(String context) {
AwsParamStorePropertySource propertySource =
new AwsParamStorePropertySource(context, this.ssmClient);
propertySource.init();
return propertySource;
}
}
并通过添加文件 META-INF/spring.factories
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.example.CustomAwsParamStorePropertySourceLocator
试试这个 spring-boot-and-aws-parameter-store
https://github.com/coveooss/spring-boot-parameter-store-integration