在AWS AMI中需要包含什么内容?使用cloud-init需要进行哪些配置?(这是一个提问标题,无需回答)

17

我正在使用AWS CloudFormation来设置我的Web应用程序的网络基础架构(VPC、SecurityGroups、子网、自动缩放组等),希望整个过程都是自动化的。我想点击一个按钮,就能启动整个过程。

我已经成功创建了一个CloudFormation模板,它可以设置所有这些网络基础架构。但是EC2实例目前没有安装任何必要的软件。现在我正在尝试找出最佳方法来将该软件部署到它们上面。

为了做到这一点,我正在使用Packer.io创建AMI。但有些人建议我使用Cloud-Init。我应该使用什么启发式标准来决定将哪些内容包含在AMI中,或者通过Cloud-Init进行配置?

例如,我想预配置EC2实例以允许我(saqib)从自己的笔记本电脑登录而无需密码。因此,EC2必须有一个用户,该用户必须有一个主目录,在该主目录中必须存在一个包含加密代码的文件.ssh/known_hosts。我应该将这些目录包含在AMI中吗?还是应该使用cloud-init进行设置?在这种和其他类似情况下,我该如何决定?


1
你需要使用Puppet或Chef来完成在CloudFormation中定义的“用户数据”自动化工作。 - BMW
谢谢。请问你能解释一下我应该放什么进 AMI 吗?如何决定某个东西应该放在 AMI 中还是通过“用户数据”进行配置? - Saqib Ali
AWS有一个综合页面,讨论了选项 https://aws.amazon.com/answers/configuration-management/aws-ami-design/ - Jason
2个回答

17

我喜欢将机器供应和环境供应分开。

一般而言,我使用以下作为指南:

构建阶段

  • 使用类似于Packer的工具构建基础机器镜像,包括运行应用程序所需的所有软件。从中创建一个AMI。
  • 将应用程序安装到基础机器映像上,创建一个应用程序映像。标记和版本化此工件。不要在此处嵌入特定于环境的内容,如数据库连接等,因为这会阻止您轻松地跨不同环境运行时重复使用此AMI。
  • 确保所有服务已停止

发布阶段

  • 使用类似于CFN的工具旋转由图像和所需的基础架构组成的环境。
  • 使用Cloud-Init user-data 配置应用程序环境(数据库连接、日志转发器等),然后启动应用程序/服务。

这种方法提供了最大的灵活性,并清晰地分离了持续交付流水线的各个关注点。


2
一个老的答案,但我最近遇到了一个问题,我过去一直是从头开始构建。不幸的是,AWS引入了一个与dbus有关的问题,它不再起作用了。不幸的是,这个基础镜像也有这个bug。现在我确保我的服务器符合预期,并且这也加快了部署速度。 - Paul

5
重要因素之一,决定您如何组装服务器、AMI和基础设施规划的答案是:在生产中,我需要多快启动一个新实例?
这个问题的答案将确定您在AMI中添加了多少内容和在引导后构建了多少内容。
注意:我的经验是使用Chef Server的,因此我会使用Chef术语,但任何其他配置管理堆栈的概念都是相同的。
通常的经验法则是将您的“基础设施视为代码”。这意味着考虑启动实例的过程,在该机器上创建用户以及管理已知主机文件和SSH密钥的过程,就像考虑应用程序代码一样。能够在源代码中跟踪基础设施的更改使得管理更容易,重新部署甚至CI也变得更容易。 这个Chef介绍涵盖了厨师书、菜谱、资源等Chef术语。它向您展示如何构建一个简单的LAMP堆栈,并演示您如何轻松地通过一个命令重新启动它。
因此,考虑到您问题中的示例,整体而言,我会执行以下操作:
  • 使用Cloudformation脚本启动基本的Ubuntu Linux AMI(目前为14.04版本)。
  • 在实例配置的UserData部分中,引导Chef Client安装过程。
  • 运行一个Recipe来创建用户。
  • 运行一个Recipe来为用户创建known_hosts文件。

像Chef这样的工具被用于将基础设施拆分成执行特定功能的小代码块。已经有许多Cookbooks 构建和可用,执行创建服务、安装软件包等基本构建块。

尽管如此,在特定领域和要求的利益上,有时必须偏离最佳实践。在某些情况下,即使考虑到基础设施管理的所有优势,您仍然需要将项目烘焙到AMI中。

假设您的应用程序进行图像处理,并且需要使用ImageMagick。假设您需要从源代码构建ImageMagick。如果您通过Chef Recipes执行此操作,则仅编译ImageMagick就可能会增加7分钟的正常实例启动时间。如果等待10-12分钟对于新实例上线来说太长,那么您可能需要考虑烘焙自己的AMI,其中已经编译并安装了ImageMagick。
这是一种可接受的解决方案,但您应该记住,管理自己的预先烘焙的AMI群集会增加额外的基础设施开销。您需要在发布新AMI、扩展到不同的实例类型和不同的AWS区域时保持自定义AMI的更新。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接