何时在 Packer 与 Terraform 中提供?

When to provision in Packer vs Terraform?

我遇到的情况是,我需要在启动时为 EC2 实例提供一些包。存在几个 (enterprise/corporate) 个约束条件:

主要是因为第二个限制,我想知道放置供应的最佳位置。这是我想出的

在 Terraform 中提供

正如它所说,我只是在 terraform 中为必要的实例提供。如果我将这些资源打包成模块,那么供应就不会 "leak out"。缺点

在 Packer 中配置

这是基于 Packer 允许您在 AMI 之上配置的 assumption,因此 AMI 可以是 "extended"。此外,这只会在 AWS 中使用,因此不一定会使用其他构建器。 Packer 中的配置使 Terraform 代码更加简单,并且 Terraform 应用将变得更快,因为它只是您启动的 AMI。

对我来说,这两种方法都有其用武之地。但我真正想知道的是,您什么时候选择 Packer Provisioning 而不是 Terraform Provisioning?

使用 Packer 创建完成(或非常接近完成)的映像大大缩短了部署新实例所需的时间,还允许您使用自动缩放组。

如果您在每个 EC2 实例创建时都有 Terraform 运行 供应器,例如 Chef 或 Ansible,您需要在需要部署新实例时为供应器添加大量时间 运行 .在我看来,最好提前使用 Packer 尽可能多地烘焙到 AMI 中,然后使用用户数据 scripts/tools 像 Consul-Template 来提供特定于环境的差异。

Packer 当然可以构建在图像之上,事实上需要一个 source_ami to be specified. I'd strongly recommend tagging your AMIs in a way that allows you to use source_ami_filter in Packer and Terraform's aws_ami data source 因此当您对 AMI 进行更改时,Packer 和 Terraform 会自动将它们拉入构建在图像之上或在下一个部署机会。

我个人烘焙了一个相当轻量级的 "Base" AMI,它进行了一些基本的强化并设置了我想要的所有部署实例的监控和日志记录,并确保 Packer 加密了 AMI 的根卷.所有其他映像都是基于最新的 "Base" AMI 构建的,不必担心确保这些东西是 installed/configured 或担心加密根卷。

通过将您的配置烘焙到 AMI 中,您还可以转向不可变的基础架构模型,该模型具有一些主要优势,因为您知道您始终可以丢弃有问题的实例并快速将其替换为一个新的。根据您的成熟度级别,您甚至可以删除对实例的访问权限,以便在部署实例后无法再更改实例上的任何内容,根据我的经验,这是操作问题的主要因素。

偶尔您可能会遇到一些问题,这使得为其烘焙 AMI 变得非常困难,在这些情况下,您可能会选择 运行 在创建 Terraform 供应器时在 Terraform 供应器中使用供应脚本。有时将现有流程转移到使用 Terraform 的配置器比烘焙 AMI 更容易,但我会尽可能将事情转移到 Packer。

我遇到过同样的情况。据我了解

  • 如果您非常频繁地启动 EC2 实例,请说 2 到 3 次 一天然后用打包机创建一个定制的 AMI,然后打电话 ami 通过 terraform.
  • 如果您的基础镜像(由 packer 创建的 AMI)基于 根据您的要求,与打包机一起使用会很好。但对我来说 运行 加壳脚本非常耗时。
  • 你也可以对 packer 做同样的事情。你可以写你的 脚本中的要求并在地形中调用它。通过拥有一切 合并到 terraform 脚本中会减少一些时间

最后由您决定和启动 EC2 实例的频率。