AWS自动更新自动扩展组并使用新的AMI?

时间:2017-02-22 18:04:36

标签: amazon-web-services autoscaling amazon-cloudformation

以下是我在AWS中的内容:

  • 申请ELB
  • Auto Scaling Group,在不同区域(Windows IIS服务器)中有2个实例
  • 启动指向AMI_A的配置
  • 配置的所有相关后端内容(VPC,子网,安全组等)

一切正常。但是,当我需要对服务器进行更新或更改时,我当前正在手动创建新的AMI_B,使用AMI_B创建新的LaunchConfig,更新AutoScalingGroup以使用新的LaunchConfig,将最小实例数增加到4,等待它们变得可用,然后将数字减少到2以消灭旧的实例。

我真的很想自动化这个过程。亚马逊给了我一些CLI的东西,我能够编写AMI创建脚本,创建LaunchConfig,并更新AutoScalingGroup ......但我没有看到一个简单的方法来编写新实例的脚本。

经过一番搜索后,我发现了一些CloudFormation模板看起来像他们想要的那样,但是大部分做得更多,这对我来说有点混乱。

我应该探索CloudFormation吗?是否有一个简单的指南,我可以遵循开始?或者我应该继续使用我已经开始的脚本?

PS - 对不起,如果这是一个重复的问题。事情在AWS上经常发生变化,因此有时候较旧的回复可能不是当前最佳答案。

3 个答案:

答案 0 :(得分:2)

您可以通过多种方式自动执行将Auto Scaling组中的实例更新为新的或更新的启动配置的过程:

CloudFormation

如果您确实想使用CloudFormation管理Auto Scaling Group实例的更新,请参阅UpdatePolicy资源的AWS::AutoScaling::AutoScalingGroup属性以获取文档,并参考"What are some recommended best practices for performing Auto Scaling group rolling updates?"页面中的Create AMI image as part of a cloudformation stack页面。 AWS知识中心获取更多建议。

如果您还想在CloudFormation资源中编写AMI的创建/更新脚本,请参阅我对“Elastic Beanstalk”问题的回答。

但请注意,CloudFormation不是一个简单的工具 - 它是用于编排AWS资源的复杂,相对低级别的服务,并且由于其陡峭的学习曲线,将现有脚本迁移到它可能需要一些时间投资。 / p>

Elastic Beanstalk

如果简单性最重要,那么我建议您评估rolling,它在部署期间同时支持immutable"What is the difference between Elastic Beanstalk and CloudFormation for a .NET project?"更新,更完全托管,面向控制台,平台即服务环境。请参阅我对问题AWS CodeDeploy的回答,以进一步比较CloudFormation和Elastic Beanstalk。

CodeDeploy

如果您想要一个用于更新自动扩展组中的实例的解决方案,您可以插入现有脚本,Deploy an Application to an Auto Scaling Group Using AWS CodeDeploy可能值得研究。您可以在实例上安装代理,然后通过API / CLI / Console触发部署,并管理将应用程序更新部署到您的实例组。有关完整教程,请参阅Working With Deployments。虽然CodeDeploy支持“就地”部署和“蓝绿”部署(有关详细信息,请参阅{{3}}),但我认为此服务假定将S3托管的应用程序包交换到静态基础AMI而不是替换每次部署都有AMI。所以它可能不适合你的AMI交换用例,但也许值得研究。

答案 1 :(得分:1)

您需要Auto Scaling组上的自定义终止策略。

  

OldestLaunchConfiguration。 Auto Scaling终止具有最早启动配置的实例。当您更新组并逐步淘汰先前配置中的实例时,此策略非常有用。

使用控制台自定义终止策略

  1. https://console.aws.amazon.com/ec2/
  2. 打开Amazon EC2控制台
  3. 在导航窗格中,选择Auto Scaling Groups。
  4. 选择Auto Scaling组。

  5. 对于“操作”,请选择“编辑”。

  6. 在“详细信息”选项卡上,找到“终止策略”。选择一个或多个 终止政策。如果您选择多个策略,请将其列入 您希望他们申请的顺序。如果您使用默认值 策略,使其成为列表中的最后一个。

  7. 选择保存。

  8. 在CLI上

     aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg --termination-policies "OldestLaunchConfiguration"
    

    https://docs.aws.amazon.com/autoscaling/latest/userguide/as-instance-termination.html

答案 2 :(得分:0)

我们为此使用Ansible的ec2_asg模块。为此,有replace_all_instancesreplace_batch_size设置。每个文档:

  

以滚动方式,将所有使用旧启动配置的实例替换为新启动配置中的一个。           它将ASG大小增加C(replace_batch_size),等待新实例启动并运行。           之后,它将终止一批旧实例,等待替换,然后重复,直到所有旧实例都被替换为止。           完成后,ASG的大小将减小到预期的大小。

如果您提供target_group_arns,则模块将在下一批之前检查目标组中实例的运行状况。

编辑:为了保持所需的实例数,我们首先将min设置为required。