4. 管理云环境

手动管理控制台上的环境无法扩展,并且随着基础设施复杂性的增加,可能会变得容易出错。亚马逊网络服务提供了适用于云形成的服务,允许定义堆栈配置模板,并引导整个使用服务的基础架构。
为了允许多个并行堆栈,每个堆栈中的资源都包含一些任意生成的名称,拥有唯一的物理名称。为了以统一的方式与堆栈资源进行交互,Spring cloud aws允许开发人员使用逻辑名称而不是随机物理名称来工作。spring-doc.cadn.net.cn

该图显示了一个典型的堆栈配置。spring-doc.cadn.net.cn

CloudFormation overview

模板文件描述了所有堆栈资源以及它们的逻辑名称。CloudFormation服务解析堆栈模板文件并创建所有资源以及它们的物理名称。应用程序可以使用模板中定义的逻辑名称来使用所有配置的堆栈资源。Spring Cloud AW解决所有逻辑名称,以便为开发人员提供相应的物理名称。spring-doc.cadn.net.cn

4.1. 自动 CloudFormation 配置

如果应用程序在堆栈内运行(因为基础 EC2 实例已在堆栈中引导),则Spring Cloud AWS 将自动检测堆栈并从堆栈解析所有资源。开发人员可以使用堆栈模板中的所有逻辑名称来与服务交互。下面的示例中,数据库资源是使用 CloudFormation 模板配置的,为数据库实例定义了一个逻辑名称。spring-doc.cadn.net.cn

"applicationDatabase": {
  "Type": "AWS::RDS::DBInstance",
  "Properties": {
    "AllocatedStorage": "5",
    "DBInstanceClass": "db.t1.micro",
    "DBName": "test"
    ...
  ]
 }
}

数据库随后将创建,并接收一个物理名称(例如,ir142c39k6o5irj),作为数据库服务名称。应用程序开发人员仍可使用逻辑名称(在本例中为applicationDatabase)来与数据库进行交互。下面的示例显示堆栈配置,该配置由元素aws-context:stack-configuration定义,并自动解析特定堆栈。元素data-source使用用于db-instance-identifier属性的逻辑名称来操作数据库。spring-doc.cadn.net.cn

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aws-context="http://www.springframework.org/schema/cloud/aws/context"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/cloud/aws/context
       http://www.springframework.org/schema/cloud/aws/context/spring-cloud-aws-context.xsd">

  <aws-context:context-credentials>
    ...
  </aws-context:context-credentials>

  <aws-context:context-region .. />

  <aws-context:stack-configuration/>

  <jdbc:data-source db-instance-identifier="applicationDatabase" ... />
</beans>

更多关于Amazon RDS配置和设置的详细信息可以在本文档的相应章节中找到。spring-doc.cadn.net.cn

4.2. 手动 CloudFormation 配置

如果应用程序不在已配置 EC2 实例的堆栈中运行,则必须手动配置堆栈配置。配置包含一个附加元素属性stack-name,它将在运行时动态解决所有相应的堆栈配置信息。spring-doc.cadn.net.cn

<beans ....>
    ...
  <aws-context:stack-configuration stack-name="myStackName" />
    ...
</beans>

使用 Java 配置类进行 CloudFormation 配置

Spring Cloud AWS 还支持在 Java 类中配置 CloudFormation 支持,避免在应用程序配置中使用 XML。
Spring Cloud AWS 提供了注释og.springframework.cloud.aws.context.config.annotation.EnableStackConfiguration,允许自动和手动 stack 配置。
下一个示例显示了一个配置类,该类显式配置 CloudFormation 支持(此处为manualStackName)。
spring-doc.cadn.net.cn

@Configuration
@EnableStackConfiguration(stackName = "manualStackName")
class ApplicationConfiguration {
}

不要在需要自动堆栈名时定义stackName属性。spring-doc.cadn.net.cn

Spring Boot 中的 CloudFormation 配置</br>

<font color=#006699>Spring Cloud AWS 还支持在 Spring Boot 配置中配置 CloudFormation 支持。</font><br /> <font color=#006699>可以在下表中描述的属性中定义手册和自动堆栈配置。</font><br />spring-doc.cadn.net.cn

属性 例举 描述

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

我的栈名称spring-doc.cadn.net.cn

配置堆栈名称的名称,将使用该名称检索资源。spring-doc.cadn.net.cn

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

truespring-doc.cadn.net.cn

启用应用的自动堆栈名称检测。spring-doc.cadn.net.cn

4.5. 手动名称解析

Spring Cloud AWS 使用 CloudFormation 堆栈根据逻辑名称内部解析所有资源。 在某些情况下,可能需要在应用程序代码中解决物理名称。 Spring Cloud AWS 提供了一个预先配置的服务,根据逻辑名称解析物理堆栈名称。 示例显示了手动堆栈资源分辨率。spring-doc.cadn.net.cn

@Service
public class ApplicationService {

 private final ResourceIdResolver resourceIdResolver;

 @Autowired
 public ApplicationService(ResourceIdResolver resourceIdResolver) {
    this.resourceIdResolver = resourceIdResolver;
 }

 public void handleApplicationLogic() {
    String physicalBucketName =
        this.resourceIdResolver.resolveToPhysicalResourceId("someLogicalName");
 }
}

4.6. 栈标签

与Amazon EC2实例类似,CloudFormation也提供了针对堆栈的标记,可以用来配置特定于堆栈的配置信息,并在应用程序中接收这些信息。这可以是例如阶段特定的配置属性(如DEV、INT、PRD)。spring-doc.cadn.net.cn

<beans ....>
    ...
    <aws-context:stack-configuration user-tags-map="stackTags"/>
    ...
</beans>

应用程序然后可以使用表达式,如#{stackTags.key1}访问堆栈标记。spring-doc.cadn.net.cn

使用自定义CloudFormation客户端

与 EC2 配置设置一样,aws-context:stack-configuration 元素也支持带有特殊设置的自定义 CloudFormation 客户端。 客户本身可以使用如示例中所示的 amazon-cloud-formation 属性进行配置:spring-doc.cadn.net.cn

<beans>
    <aws-context:stack-configuration amazon-cloud-formation=""/>

    <bean class="com.amazonaws.services.cloudformation.AmazonCloudFormationClient">
    </bean>
</beans>