8

我正在使用AWS Cloudformation为我的Web应用程序设置网络基础架构(VPC,SecurityGroups,子网,Autoscaling组等)的众多元素。我想让整个过程自动化。我想点击一个按钮,并能够启动整个事情。如何烘烤AWS AMI以及使用cloud-init进行配置?

我已经成功地创建,设置了这一切的网络基础设施Cloudformation模板。然而,EC2实例目前没有任何所需的软件。现在我正试图弄清楚如何最好地在他们身上获得该软件。

要做到这一点,我使用Packer.io创建的AMI。但有些人反而要求我使用Cloud-Init。我应该使用哪种启发式方法来决定如何烘烤AMI和/或通过Cloud-Init配置什么?

例如,我要预配置的EC2实例,让我(saqib),而从我自己的笔记本电脑密码登录。因此EC2必须有用户。该用户必须有主目录。并且在主目录中必须存在包含加密代码的文件.ssh/known_hosts。我应该将这些目录烘焙到AMI中吗?或者我应该使用cloud-init来设置它们?我应该如何决定在这个和其他类似的情况?

+1

您需要木偶或厨师使用CloudFormation中定义的用户数据完成自动化作业。 – BMW 2015-03-03 06:02:44

+0

谢谢。你能解释一下我应该投入AMI吗?如何决定是否应该在AMI中或通过“用户数据”配置? – 2015-03-03 16:03:11

+0

AWS有一个全面的页面来讨论选项https://aws.amazon.com/answers/configuration-management/aws-ami-design/ – Jason 2017-05-21 22:46:47

回答

13

我喜欢将机器配置与环境配置分开。

一般情况下,我用下面作为指导:

构建阶段

  • 建基地机图像的类似包装机,包括运行应用程序所需的所有软件。从此创建一个AMI。
  • 将应用程序安装到创建应用程序映像的基础机器映像上。标记并版本这个工件。不要像数据库连接等在这里嵌入环境特定的东西,因为这可以避免您在不同的环境运行时间轻松地重复使用AMI。
  • 确保所有服务都停止

发布阶段

  • 旋转起来组成所需的图像和红外线,使用像CFN的环境。
  • 使用云初始化user-data配置应用环境(数据库连接,日志代理等),然后开始应用程序/服务

这种方法提供了最大的灵活性和干净分离出持续交付管道的各种担忧。

4

一个决定,你应该如何组装服务器的AMI和基础设施规划的重要因素是要回答这样的问题:在生产中,如何快速的将我需要一个新的实例启动?

回答这个问题将决定你多少烤成AMI与你建立多大的引导后。

注意:我的经验是与厨师服务器,所以我将使用厨师术语,但其他配置管理堆栈的概念是相同的。

一般的经验法则是把你的“基础结构作为代码”。这意味着要考虑启动实例,在该计算机上创建用户以及管理known_hosts文件和SSH密钥的过程,这与您的应用程序代码一样。能够跟踪源代码中对基础架构的更改使管理更容易,重新部署甚至更容易。

This Chef Introduction涵盖食谱,食谱,资源和更多的厨师的术语。它向您展示了如何构建一个简单的LAMP堆栈,以及如何使用一个命令轻松重新启动它。

所以给出的例子在你的问题,在较高的水平我会做到以下几点:

  • 启动了Cloudformation脚本基地Ubuntu Linux操作系统的AMI(目前14.04)。
  • 在实例配置的UserData部分,引导Chef客户端安装过程。
  • 运行食谱来创建用户。
  • 运行配方创建known_hosts文件为

工具,比如厨师正在使用的用户,因为你能够在基础设施分解为执行特定功能的代码块。有很多食谱已经built and available执行创建服务,安装软件包等基本构建块。

所有这些话都说明了,有时您为了您的特定领域和要求而必须偏离最佳实践。考虑到基础设施管理的所有优点,您仍然可能需要将物品烘焙到AMI中。

让我们假装您的应用程序执行图像处理并且需要使用ImageMagick。假设您需要从源代码构建ImageMagick。如果你是通过Chef Recipes来做到这一点,这可能会增加7分钟的时间将ImageMagick编译为正常的实例启动时间。如果等待10-12分钟对于新实例联机太长,那么您可能需要考虑烘焙已经编译并安装了ImageMagick的自己的AMI。

这是一个可以接受的解决方案,但您应该记住,管理自己的预烘烤AMI队伍会增加额外的基础架构开销。随着新AMI的发布,您需要保持自定义AMI更新,您可以扩展到不同的实例类型和不同的AWS区域。