如何在相对复杂的基础架构中正确自动扩展AWS EC2 Instances组?

时间:2013-08-13 16:43:31

标签: amazon-web-services provisioning puppet autoscaling

我正在努力在Amazon Cloud上迁移我们的服务器,理由是自动扩展可能性,成本,服务等等。显然。

到目前为止,我正在努力尝试并试图深入研究全功能的文档,但由于没有以前的经验,我有很多问题。

设想的基础设施如下:

                                  +-----+
                                  | ELB |
                                  +--+--+
                                     |
                +--------------------|--------------------+
                |            Auto-Scaling Group           |
                |--------------------|--------------------|
                |                    |                    |
                |  +---------+       |       +---------+  |
                |  | varnish |<------+------>| varnish |  |
                |  +----+----+               +---------+  |
                |       |                         |       |
                +-----------------------------------------+
                        |                         |
                        |                         |
                        |     +------------+      |
                        +---->|Internal ELB|<-----+
                              +------+-----+
                                     |
                +-----------------------------------------+
                |            Auto-Scaling Group           |
                |-----------------------------------------|
                |  +---------+       |       +---------+  |
                |  | Apache  |<------+------>| Apache  |  |
                |  +----+----+               +----+----+  |
                |       |                         |       |
                +-----------------------------------------+
                        |         +-----+         |
                        +-------->| RDS |<--------+
                                  +-----+

在的话,我将具有弹性负载平衡器将流量发送到该清漆的情况下,这将反过来发送流量到内部弹性负载平衡器将流量发送到Apache前端。

目前,我已经发现了AWS工具,比如CloudFormation服务似乎能够在给定模板的情况下引导实例,这看起来很棒,但它似乎只能引导。

Puppet有一点经验(并考虑到AWS对该主题的推荐),我参加了Puppet Master这个很棒的工具。

我的想法,可能不可行或不现实,是创建一个&#34; Puppet Node Stack&#34;使用CloudFormation模板,它将根据需要配置实例并连接要配置的puppet master。

准备好堆栈后,我想知道如何VarnishApache实例配置/创建Auto-Scaling组。

似乎CFN有资源配置自动缩放组&amp;政策,所以我想我可以为每个模板创建两个不同的模板。

但AS功能是否会通过CFN服务运行,然后执行所有init事务(并执行user-data)?

我也在这里和那里读到Puppet可以使用EC2标签,也许一个通用的堆栈模板和相应的标签(比如角色)可以做到这一点?

这种架构是否真实可行?你有任何反馈意见吗?

感谢您的建议。

2 个答案:

答案 0 :(得分:5)

自动缩放根据启动配置创建新节点。因此,您将拥有两个单独的自动缩放组和两个单独的启动配置。即

"VarnishScalingGroup" : {
  "Type" : "AWS::AutoScaling::AutoScalingGroup",
  "Properties" : {
    "LaunchConfigurationName" : {"Ref" : "VarnishLaunchConfiguration" },
    "LoadBalancerNames" : {"Ref" : "ELB"},
    ...
  }
},
"VarnishLaunchConfiguration" : {
  "Type" : "AWS::AutoScaling::LaunchConfiguration",
  "Properties" : {
    ...
    "UserData" : {
      ....
    },
    "MetaData" : {
      ...
    }
 },
"ApacheScalingGroup" : {
  "Type" : "AWS::AutoScaling::AutoScalingGroup",
  "Properties" : {
    "LaunchConfigurationName" : {"Ref" : "ApacheLaunchConfiguration" },
    "LoadBalancerNames" : {"Ref" : "InternalELB"},
    ...
  }
},
"ApacheLaunchConfiguration" : {
  "Type" : "AWS::AutoScaling::LaunchConfiguration",
  "Properties" : {
    ...
    "UserData" : {
      ....
    },
    "MetaData" : {
      ...
    }
 }

您要添加的另一件事是针对每个扩展组的单独扩展策略,以及要匹配的相应CloudWatch指标。

CloudFormation也可以启动堆栈更新。如果作为你使用cfn-hup的用户数据的一部分,那么它将定期(你决定)检查堆栈元数据的变化 - 然后执行你喜欢的任何内容。我倾向于启动另一个版本的cfn-init - 它将解析和更新任何元数据。

关键点 - 如果你沿着cfn-hup路径走下去,将不会再次执行userdata,除非CloudFormation堆栈需要删除并创建新实例。

另外一点,如果您希望推出LaunchConfiguration的更新,则需要确保LaunchConfiguration还应用了UpdatePolicy。

答案 1 :(得分:2)

您可能需要考虑使用像packer(http://www.packer.io/)之类的工具预先构建您的AMI,而不是使用“Puppet Node Stack”,这可以为机器配置puppet并创建AMI。然后将配置的AMI添加到您的云信息模板。

正如Peter H.所说,cloudformation可以处理堆栈的更新。因此,当您对puppet设置进行更改时,您可以构建新的AMI并在cloudformation中更新启动配置。自动扩展将开始使用新的AMI进行自动扩展新实例。

将puppet从cloudformation中移除可以让您分清基础架构和服务器配置之间的关注点。

使用预先构建的AMI(已经有Apache / Varnish设置),扩展速度会更快。

无主木偶设置也有优势。即。权力下放,没有将puppetmaster作为失败点等。请参阅https://serverfault.com/questions/408261/pros-and-cons-of-a-decentralized-puppet-architecture