OpenTofu 迁移:如何在不破坏生产的情况下打破供应商锁定

发布: (2026年3月10日 GMT+8 20:01)
5 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的正文内容,我将为您翻译成简体中文并保持原有的格式、Markdown 语法以及技术术语不变。

Why the Shift to OpenTofu

OpenTofu 分支恢复了 Terraform 二进制在 HashiCorp 转向商业源代码许可证(BSL)时失去的自由。核心命令如 import 实际上被设置了付费墙,生态系统(Registry)也成为了供应商锁定的点。OpenTofu 在不包含仅限 SaaS 的功能的情况下提供相同的功能,让您重新掌控基础设施即代码(IaC)资产。

准备您的代码库

扫描硬编码的注册表引用

#!/bin/bash
# Find hardcoded upstream registry references
grep -r "registry.terraform.io" . --include="*.tf" | while read -r line ; do
    echo "[ALERT] Hardcoded upstream registry found: $line"
    echo "       Refactor to use implicit provider lookup or local mirrors."
done

备份状态

状态文件是唯一的真实来源。损坏它后,您将不得不重新导入成千上万的资源。

  1. 在本地拉取当前状态

    terraform state pull > pre_migration_backup.tfstate
  2. 初始化 OpenTofu

    tofu init -upgrade
  3. 干运行(必需)

    tofu plan

如果 tofu plan 返回 “No changes”,则说明没有问题。更常见的情况是会看到 “Provider hash mismatch”。这是预期的,因为锁文件是由旧的二进制文件签名的。

修复提供者锁不匹配

rm .terraform.lock.hcl && tofu init

启用本机状态加密

OpenTofu 提供本机客户端侧状态加密(自 v1.7 起免费)。在配置中添加以下块(如果愿意,可将现有的 terraform 块替换为 tofu 块):

terraform {
  encryption {
    key_provider "pbkdf2" "my_passphrase" {
      passphrase = var.state_passphrase  # Never hard‑code — inject via CI
    }

    method "aes_gcm" "my_method" {
      keys = key_provider.pbkdf2.my_passphrase
    }

    state {
      method   = method.aes_gcm.my_method
      enforced = true
    }
  }
}

现在状态在静止和传输过程中均已加密。即使有人访问你的 S3 存储桶,他们也只能看到不可读的字节。

CI/CD 流水线调整

在本地笔记本上迁移相对容易;而 CI/CD 流水线是大多数迁移卡住的地方。请将 HashiCorp 维护的 Terraform Action 替换为 OpenTofu 的等价实现。

# Legacy (risk)
- uses: hashicorp/setup-terraform@v3
  with:
    terraform_version: 1.6.0

# Current (safe)
- uses: opentofu/setup-opentofu@v1
  with:
    tofu_version: 1.7.0

即使按每小时 200 美元的计费标准,重构成本通常也能在下一个 Terraform 商业套餐账单之前收回。

比较:专有 Terraform 与 OpenTofu

特性专有 TerraformOpenTofu
状态加密仅企业/云版免费 / 原生
注册表原始(供应商托管)镜像(自托管)
支持官方供应商(Tier 1)社区 / Spacelift / env0
测试terraform testtofu test(功能上相同)
许可证BSL(部分功能付费墙)Apache 2.0(完全开源)

指导原则

  • Registry Rule: 如果工具需要特定的 URL 才能工作,它就是一种服务,而不是工具。尽可能对所有内容进行代理或镜像。
  • Encryption Standard: 明文状态文件在任何审计中都会失败。使用默认加密状态的工具。
  • Divergence Threshold: 监控 Terraform Feature Lag Tracker。当专有工具引入仅对其 SaaS 产品有利的破坏性更改时,立即进行分叉。

相关文章

  • 第 1 部分 – 决策框架:状态文件风险、提供商平价差距、CNCF 成熟度以及运营模型评估。
  • 第 3 部分 – 凤凰计划:一个 1,200 资源的企业迁移案例研究(后端从 HCP 撤离到主权 S3,审计协议,故障排除指南)。

最初发布于

0 浏览
Back to Blog

相关文章

阅读更多 »