AWS - 保持 AMI 更新
AWS - Keeping AMIs updated
假设我从我的一个 EC2 实例创建了一个 AMI。现在,我可以手动将其添加到 LB 或让 AutoScaling 组为我完成(根据我提供的条件)。到目前为止一切都很好。
现在,假设我的开发人员添加了一项新功能,我在现有实例上提取了新代码。请注意,此时 AMI 没有更新,仍然有旧代码。我的问题是我应该如何处理这种情况,以便当自动缩放组从我的 AMI 创建新实例时,它将使用最新代码。
我想到了两种方法,如果您还有其他解决方案,请告诉我:
a) 始终保持 AMI 更新;这意味着只要有拉取请求,旧的 AMI 就应该被移除(删除)并替换为新的。
b) 在 AMI 上有一个启动脚本 (cloud-init),它将在初始启动时从存储库中提取最新代码。 (通过将存储库凭据存储在实例上并直接从 git 中提取代码)
这些方法中哪种更好?如果两者都不好,那么实现此目标的最佳做法是什么?
假设任何事情(几乎)都可以使用 AWS 使用 API 实现自动化;它会再次归结为手头的特定用例。
一开始,人们会建议安装和配置必要的软件包的基本 AMI,并安装初始化脚本,下载源代码始终是最新的。这里需要计算的非常重要的因素是检查或提取代码和配置实例并使其准备好投入使用所花费的时间。如果那个时间段非常大——那么使用该策略进行自动缩放将不是一个好主意。由于 war 米的正常运行时间与自动缩放和云监视的统计数据相结合会导致不同的现实[可能是/可能不是 - 但概率不为零]。这时您可能会考虑经常烘焙新的 AMI。这将使您能够最大限度地减少实例为 war 流量做准备所花费的时间。
我建议您测量一下,看看哪一种既方便又划算。关闭实例并使用 AMI 重新启动需要花费真金白银;然而,这就是您需要做出的权衡。
虽然,我已经回答了一些开放式的问题;因为。问题也少
人们已经开始使用执行配置管理的 Chef、Ansible、Puppet。这些工具共同增加了不同程度的自动化;您也想探索该选项。类似的方法是使用 Docker 或其他容器。
a) keep AMIs updated all the time; meaning that whenever there's a
pull-request, the old AMI should be removed (deleted) and replaced
with the new one.
您不应将源代码存储在 AMI 中。正如您所确定的那样,这会带来维护噩梦和自动缩放问题。
b) have a start-up script (cloud-init) on AMIs that will pull the
latest code from repository on initial launch. (by storing the
repository credentials on the instance and pulling the code directly
from git)
Which one of these methods are better? and if both are not good, then
what's the best practice to achieve this goal?
你的第二项,在服务器启动时下载源代码,是解决这个问题的正确方法。
其他选项是使用 Amazon CodeDeploy 或其他一些部署服务来部署更新。部署服务还可用于将更新部署到现有实例,同时允许新实例在启动时自动下载最新代码。
假设我从我的一个 EC2 实例创建了一个 AMI。现在,我可以手动将其添加到 LB 或让 AutoScaling 组为我完成(根据我提供的条件)。到目前为止一切都很好。
现在,假设我的开发人员添加了一项新功能,我在现有实例上提取了新代码。请注意,此时 AMI 没有更新,仍然有旧代码。我的问题是我应该如何处理这种情况,以便当自动缩放组从我的 AMI 创建新实例时,它将使用最新代码。
我想到了两种方法,如果您还有其他解决方案,请告诉我:
a) 始终保持 AMI 更新;这意味着只要有拉取请求,旧的 AMI 就应该被移除(删除)并替换为新的。
b) 在 AMI 上有一个启动脚本 (cloud-init),它将在初始启动时从存储库中提取最新代码。 (通过将存储库凭据存储在实例上并直接从 git 中提取代码)
这些方法中哪种更好?如果两者都不好,那么实现此目标的最佳做法是什么?
假设任何事情(几乎)都可以使用 AWS 使用 API 实现自动化;它会再次归结为手头的特定用例。
一开始,人们会建议安装和配置必要的软件包的基本 AMI,并安装初始化脚本,下载源代码始终是最新的。这里需要计算的非常重要的因素是检查或提取代码和配置实例并使其准备好投入使用所花费的时间。如果那个时间段非常大——那么使用该策略进行自动缩放将不是一个好主意。由于 war 米的正常运行时间与自动缩放和云监视的统计数据相结合会导致不同的现实[可能是/可能不是 - 但概率不为零]。这时您可能会考虑经常烘焙新的 AMI。这将使您能够最大限度地减少实例为 war 流量做准备所花费的时间。
我建议您测量一下,看看哪一种既方便又划算。关闭实例并使用 AMI 重新启动需要花费真金白银;然而,这就是您需要做出的权衡。
虽然,我已经回答了一些开放式的问题;因为。问题也少
人们已经开始使用执行配置管理的 Chef、Ansible、Puppet。这些工具共同增加了不同程度的自动化;您也想探索该选项。类似的方法是使用 Docker 或其他容器。
a) keep AMIs updated all the time; meaning that whenever there's a pull-request, the old AMI should be removed (deleted) and replaced with the new one.
您不应将源代码存储在 AMI 中。正如您所确定的那样,这会带来维护噩梦和自动缩放问题。
b) have a start-up script (cloud-init) on AMIs that will pull the latest code from repository on initial launch. (by storing the repository credentials on the instance and pulling the code directly from git)
Which one of these methods are better? and if both are not good, then what's the best practice to achieve this goal?
你的第二项,在服务器启动时下载源代码,是解决这个问题的正确方法。
其他选项是使用 Amazon CodeDeploy 或其他一些部署服务来部署更新。部署服务还可用于将更新部署到现有实例,同时允许新实例在启动时自动下载最新代码。