我正在使用AWS Cloudformation为我的Web应用程序设置网络基础架构的许多元素(VPC,安全组,子网,自动扩展组等)。我希望整个过程自动化。我想点击一个按钮,然后能够启动整个事情。
我已成功创建了一个Cloudformation模板,用于设置所有这些网络基础架构。但是,EC2实例目前在没有任何所需软件的情况下启动。现在我想弄清楚如何最好地在他们身上获得该软件。
为此,我正在使用Packer.io创建AMI。但有些人反而催促我使用Cloud-Init。我应该使用什么启发式方法来决定将哪些内容融入AMI和/或通过Cloud-Init配置什么?
例如,我想预先配置EC2实例以允许我(saqib
)在没有自己笔记本电脑密码的情况下登录。因此EC2必须有用户。该用户必须具有主目录。并且在该主目录中必须存在包含加密代码的文件.ssh/known_hosts
。我应该将这些目录烘焙到AMI吗?或者我应该使用cloud-init来设置它们?我应该如何决定这个和其他类似的案例呢?
答案 0 :(得分:14)
我喜欢将机器配置与环境配置分开。
一般来说,我使用以下内容作为指南:
构建阶段
发布阶段
user-data
配置应用程序环境(数据库连接,日志转发器等),然后启动应用程序/服务这种方法具有最大的灵活性,可以清晰地分离出连续交付管道的各种问题。
答案 1 :(得分:4)
决定如何组装服务器,AMI和基础架构规划的一个重要因素是回答这个问题:在生产中,我需要多快才能启动新实例?
这个问题的答案将决定你加入AMI的程度与你在开机后的数量之间的关系。
注意:我的经验是使用Chef Server,因此我将使用Chef术语,但任何其他配置管理堆栈的概念都相同。
一般的经验法则是将您的“基础设施视为代码”。这意味着要考虑启动实例,在该计算机上创建用户以及管理known_hosts文件和SSH密钥的过程与应用程序代码相同。能够在源代码中跟踪基础架构的更改,使管理更容易,重新部署甚至CI更容易。
This Chef Introduction涵盖了Cookbook,Recipes,Resources等主厨的术语。它向您展示了如何构建一个简单的LAMP堆栈,以及如何使用一个命令轻松地重新启动它。
所以在你的问题中给出了一个例子,在高级别我会做以下事情:
使用像Chef这样的工具,因为您可以将基础架构分解为执行特定功能的小块代码。已经有许多Cookbook built and available执行创建服务,安装软件包等的基本构建块。
所有这一切,有时您必须为了特定领域和要求而偏离最佳实践。在某些情况下,如果基础架构管理具有所有优势,您仍需要将项目烘焙到AMI中。
让我们假装您的应用程序进行图像处理,并要求使用ImageMagick。我们假设您需要从源代码构建ImageMagick。如果您通过Chef Recipes执行此操作,则可以再添加7分钟将ImageMagick编译为正常实例启动时间。如果新实例上线等待10-12分钟太长,那么您可能需要考虑烘焙已经编译和安装了ImageMagick的AMI。
这是一个可接受的解决方案,但您应该记住,管理自己的预先制作的AMI队列会增加额外的基础架构开销。随着新AMI的发布,您需要更新自定义AMI,扩展到不同的实例类型和不同的AWS区域。