Terraform 执行状态和阶段关系

Terraform 每次运行都经过多个操作阶段(Pending、Plan、Cost Estimation、Policy Check、Apply 和 Completion),Terraform Cloud 将这些阶段的进度显示为运行状态。 在 Terraform Cloud 主页上的工作区列表中,每个工作区都显示了它当前正在处理的运行状态。(或者,如果没有正在进行的运行,则为最近完成的运行的状态。)

Pending #

阶段状态:

  • Pending:Terraform Cloud 尚未开始运行操作。Terraform Cloud 按照排队的顺序处理每个工作区的运行,并且运行在每次运行完成之前一直处于挂起状态。

离开状态:

  • Discarded:如果用户在开始前放弃运行,则运行不会继续。
  • Planning:如果运行在队列中排在首位,它会自动进入 Plan 阶段。

图示:

Fetching #

Terraform Cloud 可能需要在开始计划之前从 VCS 获取配置。当所有运行完成后,Terraform Cloud 会自动存档通过 VCS 创建的配置版本,然后重新获取文件以供后续运行使用。

阶段状态:

  • Fetching:如果 Terraform Cloud 尚未从 VCS 获取配置,则运行将进入此状态,直到配置可用。

离开状态:

  • Plan Errored:如果 Terraform Cloud 在从 VCS 获取配置时遇到错误,则运行不会继续。
  • 如果 Terraform 成功获取配置,则运行进入下一阶段。

图示:

Pre-plan(可选) #

创建 Run Task,并关联 Workspace,选择在 “Pre-plan” 时执行,才有 Pre-plan 阶段。在此阶段,Terraform Cloud 将有关运行的信息发送到已配置的外部系统,并等待 passed 或 failed 响应以确定运行是否可以继续。

阶段状态:

  • Pre-planning: Terraform Cloud 正在等待配置的外部系统的响应。
    • 外部系统必须首先响应确认 200 OK请求正在进行中。之后,他们有 10 分钟的时间返回状态 passed、running或 failed。如果超时到期,Terraform Cloud 假定运行任务处于状态 failed。

离开状态:

  • Plan Errored:如果任何强制性任务失败,运行将跳至完成(Plan Errored状态)。
  • Planning:如果任何咨询任务失败,运行将进入计划状态,并带有关于失败任务的可见警告。
  • Plan Errored/Planning:如果单次运行包含强制任务和建议任务的组合,Terraform 会采取最严格的操作。例如,如果有两项建议任务成功而一项强制任务失败,则运行失败。
  • Canceled:如果用户取消了运行,运行将以 Canceled 状态结束。

图示:

场景:

  • Blink:实现无代码自动化,以跨云工具和服务管理 IaC 工作流
  • Check Point:在规划阶段之前检测安全配置错误
  • Tines:帮助用户批准和记录来自 Terraform Cloud 的基础设施请求
  • Torq:为基础设施扫描、批准生命周期和使用 Jira 等票务系统进行跟踪创建自动化的无代码工作流

Plan #

根据 Terraform Cloud 是否需要从 VCS 获取配置,一次运行在计划阶段会经历不同的步骤。当所有运行完成后,Terraform Cloud 会自动存档通过 VCS 创建的配置版本,然后重新获取文件以供后续运行使用。

阶段状态:

  • Planning: Terraform Cloud 当前正在运行 terraform plan。
  • Needs Confirmation:`terraform plan 已完成。运行有时会在此状态下暂停,具体取决于工作区和组织设置。

离开状态:

  • Plan Errored:如果 terraform plan命令失败,则运行不会继续。
  • Canceled:如果用户通过按下“取消运行”按钮取消了计划,则运行不会继续。
  • Planned and Finished:如果计划成功且没有任何更改,并且既不会进行成本估算,也不会进行 Sentinel 策略检查,则 Terraform Cloud 认为运行已完成。
  • 如果计划成功并需要更改:
    • Cost Estimation:如果启用了成本估算,则运行会自动进入成本估算阶段。
    • Sentinel Policy Check:如果禁用成本估算并启用 Sentinel 策略,则运行会自动进入策略检查阶段。
    • Apply:如果没有 Sentinel 策略并且可以自动应用计划,则运行会自动进入应用阶段。如果在工作区上启用了 auto-apply ,并且计划由新的 VCS 提交或具有应用运行权限的用户排队,则可以自动应用计划。
    • 如果没有 Sentinel 策略并且 Terraform Cloud 无法自动应用该计划,则运行将暂停在 Needs Confirmation 状态,直到有权应用运行的用户采取行动。如果授权用户批准申请,则运行将进入 Apply阶段。如果授权用户拒绝申请,则运行不会继续(Discarded 状态)。

图示:

Post-plan(可选) #

创建 Run Task,并关联 Workspace,选择在 “Post-plan” 时执行,才有 Post-plan 阶段。在此阶段,Terraform Cloud 将有关运行的信息发送到已配置的外部系统,并等待 passed 或 failed 响应以确定运行是否可以继续。

阶段状态:

  • Post-planning: Terraform Cloud 正在等待配置的外部系统的响应。
    • 外部系统必须首先响应确认 200 OK请求正在进行中。之后,他们有 10 分钟的时间返回状态 passed、running或 failed。如果超时到期,Terraform Cloud 假定运行任务处于状态 failed。 离开状态:
  • Plan Errored:如果任何强制性任务失败,运行将跳至完成 Plan Errored 状态。
  • Applying:如果任何咨询任务失败,运行将进入 Applying 状态,并带有关于失败任务的可见警告。
  • Plan Errored/Applying:如果单次运行包含强制任务和建议任务的组合,Terraform 会采取最严格的操作。例如,如果有两项建议任务成功而一项强制任务失败,则运行失败。如果一项强制性任务成功而两项建议性任务失败,则运行成功并发出警告。
  • Canceled:如果用户取消了运行,运行将以 Canceled 状态结束。

图示:

场景:

用户期望在运行生命周期的各个阶段能做更多的事情,Post-plan 普遍的用例是确保团队遵守组织的安全性和合规性要求:

  • 安全性:确保您没有使用 Snyk、Bridgecrew、Tenable、Moderne、Sophos、Aqua Security、Firefly 和 Lightlytics 等工具提供会导致安全问题的错误配置
  • 成本控制:在使用 Infracost、Vantage 或 Kion 进行任何更改之前提供对基础设施成本的可见性
  • 法规遵从性:使用 Bridgecrew 或 Kion 确保遵守各种法规,例如 HIPAA、GDPR 或 PCI-DSS

OPA Policy Check(可选) #

此阶段仅在启用 开放策略代理 (OPA) 策略并在 terraform plan 成功之后和成本估算之前运行时才会发生。在此阶段,Terraform Cloud 检查计划是否符合工作空间的 OPA 策略集中的策略。

阶段状态:

  • Policy Check:Terraform Cloud 正在根据 OPA 政策集检查计划。
  • Policy Override:策略检查已完成,但强制策略失败。运行暂停,除非用户手动覆盖策略检查失败,否则 Terraform 无法执行应用。
  • Policy Checked:策略检查成功,Terraform 可以应用该计划。如果工作区未设置为自动应用运行,运行可能会在此状态下暂停。

离开状态:

如果任何强制性 Policy 失败,运行将暂停在 Policy Override 状态。运行完成以下工作流程之一:

  • Discarded:当具有应用运行权限的用户放弃运行时,运行停止并进入 Discarded 状态。
  • Policy Checked:当有权管理策略覆盖的用户覆盖失败的策略时,运行会进入 Policy Checked 状态。Policy Checked 状态意味着没有强制性策略失败或用户执行了手动覆盖。 一旦运行达到 Policy Checked 状态,运行将完成以下工作流程之一:
  • 如果 Terraform 可以自动应用计划,则运行将进入 Apply 阶段。自动应用要求在工作区启用 auto-apply。
  • 如果 Terraform 无法自动应用该计划,则运行将暂停在 Policy Checked 状态,直到有权应用运行的用户采取行动。如果用户批准申请,则运行进入 Apply 阶段。如果用户拒绝申请,则运行停止并进入 Discarded 状态。

图示:

Cost Estimation(可选) #

此阶段仅在启用成本估算时发生。成功后 terraform plan,Terraform Cloud 使用计划数据来估算计划中找到的每个资源的成本。

阶段状态:

  • Cost Estimating: Terraform Cloud 目前正在估算计划中的资源。
  • Cost Estimated:已完成成本估算。

离开状态:

  • 如果成本估算成功或出错,则运行进入下一阶段。
  • Planned and Finished:如果没有策略检查或应用,则运行不会继续。

图示:

Sentinel Policy Check(可选) #

terraform plan 执行成功后,Terraform Cloud 会检查计划是否符合策略,以确定是否可以应用。

阶段状态:

  • Policy Check:Terraform Cloud 当前正在根据组织的政策检查计划。
  • Policy Override:策略检查已完成,但软强制性策略失败,因此未经有权为组织管理策略覆盖的用户批准,应用无法继续。运行在此状态下暂停。
  • Policy Checked:策略检查成功,Sentinel 将允许申请继续进行。运行有时会在此状态下暂停,具体取决于工作区设置。

离开状态:

  • Plan Errored:如果任何硬性强制策略失败,则运行不会继续)。
  • Policy Override:如果任何软强制策略失败,运行将暂停在 Policy Override 状态。
    • Policy Checked:如果有权管理策略覆盖的用户覆盖失败的策略,则运行会进入 Policy Checked 状态。
    • Discarded:如果有权应用运行的用户放弃运行,则运行不会继续。
  • 如果运行达到 Policy Checked 状态(没有强制策略失败,或者软强制策略被覆盖):
    • 如果计划可以自动应用,则运行会自动进入应用阶段。如果在工作区上启用了 auto-apply 设置,并且计划由新的 VCS 提交或具有应用运行权限的用户排队,则可以自动应用计划。
    • 如果无法自动应用该计划,则运行将暂停在 Policy Checked 状态,直到有权应用运行的用户采取行动。如果他们批准申请,则运行会进入申请阶段,如果他们拒绝申请,则不会继续(Discarded)。

图示:

Pre-Apply(可选) #

创建 Run Task,并关联 Workspace,选择在 “Pre-apply” 时执行,才有 Pre-apply 阶段。在此阶段,Terraform Cloud 将有关运行的信息发送到已配置的外部系统,并等待 passed 或 failed 响应以确定运行是否可以继续。

阶段状态:

  • Pre-apply running:Terraform Cloud 正在等待配置的外部系统的响应。
    • 外部系统必须首先响应确认 200 OK请求正在进行中。之后,他们有 10 分钟的时间返回状态 passed、running或 failed。如果超时到期,Terraform Cloud 假定运行任务处于状态 failed。

离开状态:

  • Apply Errored:如果任何强制性任务失败,运行将跳至完成。
  • Applying:如果任何咨询任务失败,运行将进入 Applying 状态,并带有关于失败任务的可见警告。
  • Apply Errored/Applying:如果单次运行包含强制任务和建议任务的组合,Terraform 会采取最严格的操作。例如,如果有两项建议任务成功而一项强制任务失败,则运行失败。
  • Canceled:如果用户取消了运行,运行将以 Canceled 状态结束。

图示:

场景:

基础设施的日常运维中,检查 Terraform 配置是重要的一步。通常,团队会采用审查和批准流程,这通常会导致计划最初生成和应用之间出现延迟。这段时间,基础架构可以更改,可以强制执行,并且可以添加新的合规性规则,在同一个 Terraform Run 中执行。

Apply #

阶段状态:

  • Applying:Terraform Cloud 当前正在执行 terraform apply。

离开状态:

  • Applied:如果应用成功,则以 Applied 状态结束。
  • Apply Errored:如果应用失败,则以 Apply Errored 状态结束。
  • Canceled:如果用户通过按 Cancel Run 取消应用,则以 Canceled 状态结束。

图示:

Completion #

如果 Apply 完成,或者任何一步失败,或者无事可做,或者用户选择不继续,则一次运行结束。一旦运行完成,队列中的下一个运行可以进入计划阶段。

阶段状态:

  • Applied:一次运行成功应用。
  • Planned and Finished: terraform plan的输出已经与当前的基础设施状态相匹配,所以 terraform apply不需要做任何事情。
  • Apply Errored:命令 terraform apply失败,可能是由于缺少或配置错误的提供程序或对提供程序的非法操作。
  • Plan Errored:命令 terraform plan失败(通常需要修复变量或代码),或者硬性强制性 Sentinel 策略失败。无法应用运行。
  • Discarded:用户选择不继续此运行。
  • Canceled:用户使用“取消运行”按钮中断了 terraform plan或 terraform apply命令。

Reference #