【问题标题】:From local script, terminate (then recreate) all EC2 instances in Auto Scaling Group从本地脚本终止(然后重新创建)Auto Scaling Group 中的所有 EC2 实例
【发布时间】:2016-06-03 09:09:18
【问题描述】:

设置:

我有一个附加了 Auto Scaling 组的 AWS 负载均衡器。它会启动一个 AMI 实例,我已将其配置为我们的应用程序服务器的基本设置。

我使用User Data 设置执行以下操作:

#!/bin/bash

cd /home/server
GIT_SSH_COMMAND='ssh -i /home/ec2-user/app-server.key' git pull
composer install

也就是说:当 Auto Scaling Group 启动一个新实例时,它会从 GitHub 拉取最新代码,更新 composer 依赖项(它是一个基于 Lumen 的 PHP RESTful 应用程序服务),然后就可以使用了。

这一切都有效。

当我手动 detatch 我的 Auto Scaling 组中的所有 EC2 实例时,会立即创建新实例并成功获取最新代码。可爱!

我要做什么

在我将服务器代码提交到 GitHub 后,我想运行一个本地命令 - 例如,deploy staging,它会自动执行以下操作:

  1. 终止 Auto Scaling 组中的当前实例
  2. 这会导致创建新实例,然后更新为最新代码。

我现在在做什么

它仍然非常手动。我提交到 GitHub,然后我必须去 AWS Web 控制台并“分离”我所有的 EC2 实例,以便新的实例取代它们 - 然后我必须去终止那些分离的实例。

问题

那么 - 考虑到我想要完成的任务,我该如何完成呢?

在我的 Windows PC 上,我想输入一个单词来完成上述所有操作。

也许我的顺序不正确 - 例如,新实例应该在 终止旧实例之前启动,等等 - 在这种情况下,请告诉我完成的最佳方法东西。

我也在寻找 确切 建议:如何实现这一点。我是否需要下载适用于 Windows 的 AWS CLI 工具?如何从家用 PC 执行 AWS 命令​​?等等。

谢谢!

编辑

或者(也许这是一种更清洁的方式?),我也可以告诉我的 Auto Scaling 组/负载均衡器中的当前实例“进行 GitHub 更新”.. 但我不知道该怎么做。实例仅在首次创建时执行一次。

【问题讨论】:

    标签: amazon-web-services amazon-ec2 amazon-elb autoscaling aws-cli


    【解决方案1】:

    整个设置有点脆弱。你可以看看 CodeDeploy:https://aws.amazon.com/codedeploy/

    对于您的特定设置,如果您不允许触摸/更改太多,我会做的是:
    在运行的实例中,我会定期从 github 中提取并与正在运行的实例进行比较。如果有新版本,我会停止服务。该实例将变得不健康并被回收并获取新版本。
    您可能希望在不同机器之间设置一个有点随机的时间表,以确保它们不会同时被回收。

    【讨论】:

    • 我们可以触摸任何我们想要的东西(这完全是我们的架构、代码库等)。考虑到这一点,您会提出与上述不同的建议吗? “从 github 定期拉取”的缺点是我无法在我提交代码的第二秒立即触发部署。
    • 立即对您意味着什么?是 1 秒、1 分钟、5 分钟吗?有什么关系? (即您仍然应该允许两个版本并排运行的一段时间)您也不想在部署过程中杀死所有实例。如果杀死所有实例是可以接受的,您总是可以设置一个 github webhook + sns + lambda 在推送发生时当场执行此操作(示例:aws.amazon.com/blogs/compute/…)。您的 lambda 函数可以终止实例。
    • 我说“立即”是因为在我们的某些环境中——比如我们的登台环境,它真正用于开发人员之间的开发目的,而且周转时间很重要——我真的很想运行一个 @ 987654323@ 我的电脑上的命令,让一切开始这个过程。但是,我同意你的观点,“杀死所有实例”是不可接受的。在一个完美的世界中,我们会启动新实例,等到响应,然后用它们替换现有的扩展组实例......
    • 是否有另一种方法可以“告诉”EC2 实例“从 GitHub 进行更新”?我的意思是,这可能是另一种不涉及替换当前正在运行的 EC2 实例的方法..
    • 您绝对可以通知实例(git webhooks + sns + lamda 和/或 sqs 的组合,但认为这有点过分了)。最简单的做法是编写一个每分钟在机器上运行的 cron 并轮询 github 中的状态。
    猜你喜欢
    • 2021-08-25
    • 2013-07-05
    • 1970-01-01
    • 2018-09-30
    • 2019-02-23
    • 2023-03-13
    • 2011-03-04
    • 2018-10-11
    • 2017-12-22
    相关资源
    最近更新 更多