使用 HCP Packer 和 HCP Terraform 改进基础镜像管理
作者: Randy Keener、Prakash Manglanathan 和 Mark Lewis
本指南旨在为平台团队提供关于 HCP Packer 和 HCP Terraform 集成的规范性指导。本指南使用 HCP Terraform。除非另有说明,HCP Terraform(SaaS)在功能上与 Terraform Enterprise(自托管)类似。
通过集成 HCP Packer 和 HCP Terraform,您可以获得以下好处
- 应用程序开发人员可以快速配置符合组织镜像标准的镜像。
- 平台团队和安全团队都可以了解正在配置的镜像。如果检测到漏洞或基础镜像已过时,平台团队和安全团队可以管理和沟通镜像变更。
目标受众
本指南参考了以下角色
- 平台运维人员:负责 HCP Terraform 和维护黄金镜像的人员。
- 安全运维人员:负责确保基础设施安全的人员。
背景和最佳实践
HCP Packer 具有对象层次结构,需要仔细规划和访问控制。我们建议使用单个 HCP 组织,并将 HCP Packer 对象放在专门用于平台团队使用的单个项目中。
HCP Packer 注册表:这是 HCP Packer 中的顶级对象。我们建议在一个组织中使用单个统一的注册表。对于大型组织,可能需要多个注册表,但某些功能(例如祖源跟踪)可能会丢失。HCP Packer 存储桶:这是存储镜像元数据的位置。我们建议为每个应用程序或团队创建一个单独的存储桶。使用一致的命名约定来命名存储桶,例如 images。平台团队负责创建存储桶并分配适当的权限。
我们建议使用如下命名约定:<bu>-<appname>-images,其中
HCP Packer 通道:通道用于管理镜像的生命周期。我们建议至少有 3 个通道 - 开发、测试和生产。平台团队负责创建通道,并应确保在所有存储桶中使用一致的命名约定。
工作流程
下图说明了各种组件如何交互以实现此集成上下文中的工作流程。

负责创建黄金镜像的平台团队执行此工作流程。输出是组织黄金镜像,也称为基础镜像或第一层镜像。
- 黄金镜像 Packer 代码存储在 Packer 存储库 (VCS) 中。
- 镜像代码引用 HCP Packer 注册表,以确保存储元数据。更多详细信息 此处。
- 通过 VCS 中的 PR 流程执行对 Packer 代码的任何更改。
- 在 PR 合并时触发 CI/CD 管道。
- CI/CD 管道执行 Packer 构建。这将构建云提供商中的镜像,并将元数据存储在 HCP Packer 注册表中作为新版本。
- 将新的 Packer 版本分配给用于测试和验证的 HCP Packer 通道
- 扫描生成的镜像是否存在漏洞和合规性问题(这应使用您现有的镜像扫描工具)。
- 完成测试后,将镜像提升到生产通道,并将镜像本身存储在云端(公共或私有)。
如果您希望自动化从新黄金镜像生成应用程序镜像的过程,并且有数百个镜像需要自动化,请设计工作流程,以便应用程序镜像构建按批处理进行,而不是同时进行,以避免可能使网络饱和的构建风暴。
有关更多详细信息,请参阅 撤销和恢复 文档。
先决条件
要完成本指南,您需要以下条件
- HCP Packer 的管理员访问权限
- HCP Terraform 的管理员访问权限
- 创建 API 令牌 文档
- VCS 存储库的管理员访问权限
此外,我们建议您查看以下内容
验证的架构
下图说明了 HCP Packer 和 HCP Terraform 之间的集成。

此集成的核心组件是
VCS 仓库:Terraform 和 Packer 代码将存储和协作的地方。VCS 仓库应具有与 Packer 构建流水线(CI/CD)以及 HCP Terraform 的连接性。
CI/CD 流水线:构建流水线对于执行 Packer 构建是必要的。该流水线需要能够访问 HCP Packer 以及正在构建和存储镜像的云提供商。
HCP Terraform:Terraform 代码将在其中执行的地方。Terraform 代码将用于配置基础设施(例如虚拟机),镜像将部署到该基础设施上。HCP Terraform 需要连接到 HCP Packer 以获取镜像元数据。除了与 VCS 和云提供商的集成之外,还需要这样做。
HCP Packer:镜像元数据将存储在这里。机器镜像不会存储在 HCP Packer 中。
本指南不涵盖 SSO、日志记录和 SCIM 工具等其他组件的详细信息,这些组件不是此集成的核心部分。
人员和流程
Terraform 运营指南包含关于在 onboarding HCP Terraform 或 Terraform Enterprise 时人员和流程建议的广泛讨论。在本节中,我们简要描述了与管理此特定集成相关的核心团队及其角色和职责。
在此集成的上下文中,平台团队将负责以下事项
- 确保 HCP Terraform 和 HCP Packer 之间的集成已建立。
- 确保适当的 Terraform 工作区已分配 HCP Packer 运行任务。
- 与安全团队建立定期协作会议,以确保集成的目标正在实现。
- 为所有或选定的工作区启用运行任务。还在相关工作区上启用漂移检测。
- 在工作区上启用 HCP Terraform 通知,并确保正确的渠道(电子邮件组、Slack 等)接收通知。
- 为应用程序团队设定期望,现在运行任务已为他们的 Terraform 运行启用
- 运行任务涉及额外的处理,这意味着这可能会略微增加应用程序团队的等待时间。
- 以前有效的工作区运行可能会被运行任务阻止,并且需要进行修复。
- 确保将文档放置在应用团队可以集中访问的位置,以了解此集成。
- 为平台团队提供关于如何使用 HCP Packer 的启用/培训。
- 使用对 HCP Packer 的更改更新模块和 CI/CD 流水线。
将 Packer 连接到 HCP Packer
请按照此 教程,了解有关所涉及步骤的更多详细信息。
完成这些步骤后,您应该具有以下内容
- 已创建 Packer 注册表。
- 已创建 Packer 存储桶。
- 已创建 Packer 频道。
- HCP Packer 已与 Packer 代码集成,以便在构建时将元数据存储在 HCP Packer 注册表中。
有关将 Packer 连接到 HCP Packer 的更多详细信息,请参阅 文档。
为了测试此步骤,请确保在运行 packer build 时,HCP Packer 中会创建一个新版本。
从 Terraform 引用 HCP Packer 镜像
HCP 提供程序通过提供专门的数据源来增强 Terraform 的功能,这些数据源允许从 HCP 服务检索关键元数据。这些数据源对于 Terraform 脚本中的动态配置管理至关重要。
hcp_packer_version数据源:从 HCP Packer 中的指定通道检索版本元数据。- 用法:此数据源用于获取软件或工件特定版本的详细信息,以确保基础设施使用指定的正确配置和版本进行部署。
hcp_packer_artifact数据源:使用版本指纹和通道名称从 HCP Packer 检索详细元数据和镜像位置。- 用法:对于需要有关工件的精确信息以进行受控部署的操作至关重要。
有关 HCP 提供程序和数据源的更多详细信息,请参见 此处。
以下 Terraform 配置显示了如何在 Terraform 中使用 HCP 数据源来引用 HCP Packer 镜像
# AWS configuration
data "hcp_packer_artifact" "aws_web_server" {
bucket_name = "aws-web-server-images"
channel = "production"
}
resource "aws_instance" "web" {
ami = data.hcp_packer_artifact.aws_web_server.id
instance_type = "t3.micro"
# Additional configuration...
}
# Azure configuration
data "hcp_packer_artifact" "azure_web_server" {
bucket_name = "azure-web-server-images"
channel = "production"
}
resource "azurerm_linux_virtual_machine" "web" {
name = "web-server"
# Use the image ID from HCP Packer
custom_image_id = data.hcp_packer_artifact.azure_web_server.id
# Additional configuration...
}
在 HCP Terraform 中配置运行任务
请按照 教程 中的说明将 HCP Packer 与 HCP Terraform 集成。
我们建议以 全局 方式启用此集成。
与任何运行任务一样,我们建议先在非生产工作区中测试运行任务,然后再在生产环境中启用它。我们进一步建议采用分阶段方法,首先全局启用运行任务作为建议性强制执行,然后再将其启用为强制性强制执行。
配置 Sentinel
这是一个可选但推荐的步骤。我们建议使用 Sentinel 来强制执行镜像使用策略,除了运行任务集成之外。推荐的策略包括以下内容。
- 一项策略,用于检查并确保 Terraform 运行中使用的所有镜像均来自 HCP Packer。
- 一项策略,用于强制仅在 Terraform 运行中使用生产通道中的镜像。以下是示例策略。
import "tfe"
// Define the required channel for HCP Packer images
required_channel = "Production"
// Fetch the image metadata from workspace variables
image_metadata = tfe.workspace.variables["hcp_packer_image_metadata"].value
// Main rule to enforce the channel requirement
main = rule {
required_channel in image_metadata
}
如果不启用上述 Sentinel 策略,则存在使用不合规镜像的风险。这可能导致安全漏洞和合规性问题。
与任何 Sentinel 策略一样,我们建议先在非生产工作区中以建议性强制执行方式测试该策略,然后再在生产环境中启用它。
确保漂移检测和通知已启用
确保在所有工作区或用于配置镜像的工作区上启用漂移检测。这将确保任何不合规情况都会被检测到并在 HCP Terraform 的工作区资源管理器中报告。
我们建议也启用工作区通知。这将确保应用程序团队在镜像被撤销或有新镜像可用时收到警报。
测试关键工作流程
测试工作流程部分中详细介绍的关键工作流程。确保黄金镜像工作流程、应用程序镜像工作流程和基础设施撤销工作流程按预期工作。
结论
在本指南中,您学习了如何将 HCP Packer 与 HCP Terraform 集成。您还学习了如何使用 HCP 数据源在 Terraform 中引用 HCP Packer 镜像。