3. 云环境

应用程序通常需要特定于环境的配置信息,尤其是在不断变化的环境中,例如 亚马逊云环境。Spring Cloud AWS 支持在 使用常见的 Spring 机制(如属性占位符或 Spring 表达式语言)进行应用程序上下文。spring-doc.cadn.net.cn

3.1. 检索实例元数据

实例元数据可在 EC2 环境。可以使用提供实例元数据的特殊 HTTP 地址查询元数据。Spring Cloud AWS 使应用程序能够直接在表达式或属性占位符中访问此元数据,而无需调用 外部 HTTP 服务。spring-doc.cadn.net.cn

3.1.1. 使用 XML 启用实例元数据支持

实例元数据检索支持是通过 XML 元素启用的,例如 Spring 中的标准属性占位符。 以下代码示例演示了如何在应用程序上下文中激活实例元数据支持。spring-doc.cadn.net.cn

<beans ...>
     <aws-context:context-instance-data />
</beans>

无需授权服务调用即可检索实例元数据,因此不需要上述配置 任何区域或安全特定配置。spring-doc.cadn.net.cn

3.1.2. 使用 Java 启用实例元数据支持

实例元数据也可以在 Java 配置类中配置,而无需 XML 配置。 下一个示例显示了典型的 Spring@Configuration类,该类使用org.springframework.cloud.aws.context.config.annotation.EnableInstanceDataspring-doc.cadn.net.cn

@Configuration
@EnableContextInstanceData
public static class ApplicationConfiguration {
}

3.1.4. 使用实例元数据

实例元数据可用于 XML、Java 占位符和表达式。下面的示例演示了 使用占位符和引用特殊变量的表达式在 XML 文件中实例元数据environmentspring-doc.cadn.net.cn

<beans ...>
 <bean class="org.springframework.cloud.aws....SimpleConfigurationBean">
    <property name="value1" value="#{environment.ami-id}" />
    <property name="value2" value="#{environment.hostname}" />
    <property name="value3" value="${instance-type}" />
    <property name="value4" value="${instance-id}" />
 </bean>
</beans>

实例元数据也可以与 Spring 一起注入org.springframework.beans.factory.annotation.Value注解 直接进入 Java 字段。下一个示例演示了如何在 Spring bean 中使用实例元数据。spring-doc.cadn.net.cn

@Component
public class ApplicationInfoBean {

    @Value("${ami-id:N/A}")
    private String amiId;

    @Value("${hostname:N/A}")
    private String hostname;

    @Value("${instance-type:N/A}")
    private String instanceType;

    @Value("${services/domain:N/A}")
    private String serviceDomain;
}

每个实例元数据都可以通过实例元数据服务中可用的键访问嵌套属性,只需用斜杠 ('/') 分隔属性即可访问。spring-doc.cadn.net.cn

3.1.5. 使用实例用户数据

除了默认实例元数据外,还可以在每个实例上配置用户数据。检索此用户数据并 由 Spring Cloud AWS 解析。可以在使用应用程序启动 EC2 实例时定义用户数据。Spring Cloud AWS 期望格式<key>:<value>;<key>:<value>在用户数据中,以便它可以解析字符串并提取键值对。spring-doc.cadn.net.cn

可以使用下面显示的管理控制台或 CloudFormation 模板来配置用户数据。spring-doc.cadn.net.cn

管理控制台中的用户数据

用于配置用户数据的 CloudFormation 模板片段概述如下:spring-doc.cadn.net.cn

...
"Resources": {
 "ApplicationServerInstance": {
  "Type": "AWS::EC2::Instance",
  "Properties": {
   "ImageId": "ami-6a56b81d",
   "UserData": {
      "Fn::Base64": "data1:value1;data2:value2"
    },
   "InstanceType": "t1.micro",
  }
}
...

用户数据可以直接在应用程序上下文中访问,就像通过占位符访问实例元数据一样 或表达式。spring-doc.cadn.net.cn

@Component
public class SecondConfigurationBean {

    @Value("${data1}")
    private String firstDataOption;

    @Value("${data2}")
    private String secondDataOption;
}

3.1.6. 使用实例标签

用户配置的属性也可以使用标签而不是用户数据进行配置。标签是上下文中的一个全局概念亚马逊云服务并用于不同的服务。Spring Cloud AWS 也支持跨不同服务的实例标签 服务业。 与用户数据相比,用户标签可以在运行时更新,无需停止和重新启动实例。spring-doc.cadn.net.cn

用户数据也可用于执行脚本在实例启动时。因此,利用实例标签进行用户配置和用户数据来执行脚本很有用在实例启动时。spring-doc.cadn.net.cn

可以通过下面概述的管理控制台在实例级别配置特定于实例的标签,并且与用户数据一样,以及随后显示的 CloudFormation 模板。spring-doc.cadn.net.cn

管理控制台中的实例数据

用于配置实例标签的 CloudFormation 模板片段概述如下:spring-doc.cadn.net.cn

...
"Resources": {
    "UserTagAndUserDataInstance": {
        "Type": "AWS::EC2::Instance",
        "Properties": {
            "ImageId": "ami-6a56b81d",
            "InstanceType": "t1.micro",
            "Tags": [
            {
                "Key": "tag1",
                "Value": "tagv1"
            },
            {
                "Key": "tag3",
                "Value": "tagv3"
            },
            {
                "Key": "tag2",
                "Value": "tagv2"
            },
            {
                "Key": "tag4",
                "Value": "tagv4"
            }
            ]
        }
    }
}
...

要检索实例标签,Spring Cloud AWS 必须发出经过身份验证的请求,因此它需要区域和安全配置,然后才能实际解析占位符。此外,由于实例标签在启动时不可用应用程序上下文,它们只能作为表达式引用,而不能使用占位符引用。 这context-instance-data元素定义属性user-tags-map这将在应用程序上下文中为名称创建一个映射。然后可以使用其他 bean 定义的表达式查询此映射。spring-doc.cadn.net.cn

<beans ...>
 <aws-context:context-instance-data user-tags-map="instanceData" />
</beans>

Java Bean 可能会使用@Value注解。spring-doc.cadn.net.cn

public class SimpleConfigurationBean {

   @Value("#{instanceData.tag1}")
   private String value1;

   @Value("#{instanceData.tag2}")
   private String value2;

   @Value("#{instanceData.tag3}")
   private String value3;

   @Value("#{instanceData.tag4}")
   private String value4;
}

3.1.7. 配置自定义 EC2 客户端

在某些情况下,需要自定义 EC2 客户端来检索实例信息。 这context-instance-data元素支持自定义 EC2 客户端,其中包含amazon-ec2属性。 下一个示例显示了使用可能具有特殊配置的自定义 EC2 客户端。spring-doc.cadn.net.cn

<beans ...>

  <aws-context:context-credentials>....</aws-context:context-credentials>
  <aws-context:context-region ... />
  <aws-context:context-instance-data  amazon-ec2="myCustomClient"/>

  <bean id="myCustomClient" class="com.amazonaws.services.ec2.AmazonEC2Client">
    ...
  </bean>
</beans>

3.1.8. 注入默认的 EC2 客户端

如果为实例数据配置了用户标签(见上文),Spring Cloud AWS 会使用指定的区域和安全凭据配置 EC2 客户端。应用程序开发人员可以使用@Autowired注解。spring-doc.cadn.net.cn

public class ApplicationService {

    private final AmazonEC2 amazonEc2;

    @Autowired
    public ApplicationService(AmazonEC2 amazonEc2) {
        this.amazonEc2 = amazonEc2;
    }
}

3.2. 将 Spring Cloud 应用程序与 AWS Parameter Store 集成

Spring Cloud 提供对集中式配置的支持,可以作为常规 Spring 读取和提供PropertySource当应用程序启动时。参数存储配置允许您使用此机制与 AWS 参数存储一起使用。spring-doc.cadn.net.cn

只需添加对spring-cloud-starter-aws-parameter-store-configstarter 模块来激活支持。该支持类似于为 Spring Cloud Config Server 或 Consul 的键值存储提供的支持:配置参数可以定义为在所有服务之间或特定服务之间共享,并且可以是profile-specific 的。检索时将解密加密的值。spring-doc.cadn.net.cn

所有配置参数都是从公共路径前缀中检索的,默认为/config. 从那里共享参数从默认为application和特定于服务的参数使用的路径默认为spring.application.name. 您可以使用点和正斜杠来指定名称配置键。激活的配置文件的名称将使用默认为 强调。spring-doc.cadn.net.cn

这意味着对于名为my-service默认情况下,该模块将查找并使用以下参数:spring-doc.cadn.net.cn

参数键 弹簧属性 描述

/config/application/cloud.aws.stack.namespring-doc.cadn.net.cn

cloud.aws.stack.namespring-doc.cadn.net.cn

由启用了配置支持的所有服务共享。可以使用特定于服务或配置文件的属性覆盖。spring-doc.cadn.net.cn

/config/application_production/cloud.aws.stack.namespring-doc.cadn.net.cn

cloud.aws.stack.namespring-doc.cadn.net.cn

由启用了配置支持并具有production弹簧配置文件已激活。可以使用特定于服务的属性覆盖。spring-doc.cadn.net.cn

/config/my-service/cloud/aws/stack/autospring-doc.cadn.net.cn

cloud.aws.stack.autospring-doc.cadn.net.cn

特定于my-service服务。 请注意,键路径中的斜杠将替换为点。spring-doc.cadn.net.cn

/config/my-service_production/cloud/aws/stack/autospring-doc.cadn.net.cn

cloud.aws.stack.autospring-doc.cadn.net.cn

特定于my-serviceproduction弹簧轮廓已激活。spring-doc.cadn.net.cn

请注意,此模块不支持用作参数值的完整配置文件,例如 Spring Cloud Consul 那样: AWS 参数值限制为 4096 个字符,因此我们仅支持配置单个 Spring 属性。spring-doc.cadn.net.cn

您可以在 Spring Cloud 中配置以下设置bootstrap.propertiesbootstrap.yml文件 (请注意,应用了宽松的属性绑定,因此您不必使用此确切的语法):spring-doc.cadn.net.cn

属性 默认值 解释

aws.paramstore.prefixspring-doc.cadn.net.cn

/configspring-doc.cadn.net.cn

前缀,指示从参数存储加载的每个属性的第一级。 值必须以正斜杠开头,后跟一个或多个有效路径段或为空。spring-doc.cadn.net.cn

aws.paramstore.defaultContextspring-doc.cadn.net.cn

applicationspring-doc.cadn.net.cn

定义跨所有服务共享的属性的上下文的名称spring-doc.cadn.net.cn

aws.paramstore.profileSeparatorspring-doc.cadn.net.cn

_spring-doc.cadn.net.cn

将附加的配置文件与上下文名称分开的字符串。只能包含 点、破折号、正斜杠、反斜杠和字母数字字符旁边的下划线。spring-doc.cadn.net.cn

aws.paramstore.failFastspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

指示检索参数时是否应失败启动应用程序。spring-doc.cadn.net.cn

aws.paramstore.namespring-doc.cadn.net.cn

的配置值spring.application.namespring-doc.cadn.net.cn

构造属性路径以查找此特定服务时要使用的名称。spring-doc.cadn.net.cn

aws.paramstore.enabledspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

可用于禁用参数存储配置支持,即使自动配置在类路径上也是如此。spring-doc.cadn.net.cn

为了找出在应用程序启动时从 AWS Parameter Store 中检索到哪些属性, 开DEBUG登录org.springframework.cloud.aws.paramstore.AwsParamStorePropertySource类。spring-doc.cadn.net.cn

logging.level.org.springframework.cloud.aws.paramstore.AwsParamStorePropertySource=debug

3.3. 将 Spring Cloud 应用程序与 AWS Secrets Manager 集成

Spring Cloud 提供对集中式配置的支持,可以作为常规 Spring 读取和提供PropertySource当应用程序启动时。Secrets Manager 配置允许您使用此机制 与 AWS Secrets Manager 一起使用。spring-doc.cadn.net.cn

只需添加对spring-cloud-starter-aws-secrets-manager-config启动模块以激活支持。 该支持类似于为 Spring Cloud Config Server 或 Consul 的键值存储提供的支持: 配置参数可以定义为在所有服务之间共享或针对特定服务共享,并且可以是 特定于配置文件。spring-doc.cadn.net.cn

所有配置参数都是从公共路径前缀中检索的,默认为/secret. 从那里共享参数从默认为application和特定于服务的参数使用的路径默认为spring.application.name. 您可以使用点和正斜杠来指定名称配置键。激活的配置文件的名称将使用默认为 强调。spring-doc.cadn.net.cn

这意味着对于名为my-service默认情况下,该模块将查找并使用以下参数:spring-doc.cadn.net.cn

参数键 描述

/secret/applicationspring-doc.cadn.net.cn

由启用了配置支持的所有服务共享。可以使用特定于服务或配置文件的属性覆盖。spring-doc.cadn.net.cn

/secret/application_productionspring-doc.cadn.net.cn

由启用了配置支持并具有production弹簧配置文件已激活。可以使用特定于服务的属性覆盖。spring-doc.cadn.net.cn

/secret/my-servicespring-doc.cadn.net.cn

特定于my-service服务。。spring-doc.cadn.net.cn

/secret/my-service_productionspring-doc.cadn.net.cn

特定于my-serviceproduction弹簧轮廓已激活。spring-doc.cadn.net.cn

您可以在 Spring Cloud 中配置以下设置bootstrap.propertiesbootstrap.yml文件 (请注意,应用了宽松的属性绑定,因此您不必使用此确切的语法):spring-doc.cadn.net.cn

属性 默认值 解释

aws.secretsmanager.prefixspring-doc.cadn.net.cn

/secretspring-doc.cadn.net.cn

前缀,表示从 Secrets Manager 加载的每个属性的第一级。 值必须以正斜杠开头,后跟一个或多个有效路径段或为空。spring-doc.cadn.net.cn

aws.secretsmanager.defaultContextspring-doc.cadn.net.cn

applicationspring-doc.cadn.net.cn

定义跨所有服务共享的属性的上下文的名称spring-doc.cadn.net.cn

aws.secretsmanager.profileSeparatorspring-doc.cadn.net.cn

_spring-doc.cadn.net.cn

将附加的配置文件与上下文名称分开的字符串。只能包含 点、破折号、正斜杠、反斜杠和字母数字字符旁边的下划线。spring-doc.cadn.net.cn

aws.secretsmanager.failFastspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

指示检索机密时是否应失败启动应用程序。spring-doc.cadn.net.cn

aws.secretsmanager.namespring-doc.cadn.net.cn

的配置值spring.application.namespring-doc.cadn.net.cn

构造属性路径以查找此特定服务时要使用的名称。spring-doc.cadn.net.cn

aws.secretsmanager.enabledspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

可用于禁用 Secrets Manager 配置支持,即使自动配置位于类路径上。spring-doc.cadn.net.cn