# Terraform 资源导入 & Terraformer 工具集使用指南
> 适用场景:本项目「阿里云轻量应用服务器 / 腾讯云 Lighthouse(Windows 轻量实例)」的 IaC 接管。
> 整理自实操踩坑(2026-11-01)。
—
## 0. 结论速览(先读这节)
1. **terraformer 用不了你的资源类型**:它不支持腾讯云 Lighthouse,也不支持阿里云轻量应用服务器(Simple Application Server)。你这个项目 100% 是轻量服务器 → **terraformer 不是正确工具,别再在它上面花时间**。
2. **本项目真正可行的导入路径**:
– 单台已知 ID → 经典 `terraform import`(项目 `.tf` 注释里已写好命令)。
– 不想手抄 ID / 批量 → **data 源 `for_each` + `import` 块**(本文第 1.2 节,推荐)。
3. **terraformer 在 Windows 上实测三大坑**(已逐一踩过):缺 `~/.aliyun/config.json`、`HOME` 未设导致 `\.terraform.d` 路径崩、`terraform` 不在 PATH 导致 `exec: no command`。
—
## 1. Terraform 导入的三种方式
### 1.1 方式 A:经典 CLI 导入(单台、已知 ID)
“`bash
terraform init
terraform import <资源类型>.<名称> <资源ID>
“`
– 腾讯云(已在 `TencentCloud/main.tf` 注释里):
“`bash
terraform import tencentcloud_lighthouse_instance.this lhins-13o6vhmr
terraform import tencentcloud_lighthouse_firewall_rule.this lhins-13o6vhmr
“`
– 阿里云(已在 `Aliyun/main.tf` 注释里):
“`bash
terraform import alicloud_simple_application_server_instance.this <实例ID>
“`
– **前提**:对应的 `resource` 块必须先存在于 `.tf` 中。
– **缺点**:要手抄资源 ID;防火墙等嵌套资源要逐个 import。
### 1.2 方式 B:`import` 块 + `for_each`(TF ≥ 1.5,for_each 需 1.7+,推荐)
用 `data` 源按地域/名称把资源**列出来**,`for_each` 把每个 ID 喂给 `import` 块,**完全不用手抄 ID**;还能配合 `terraform plan -generate-config-out` 自动生成 `.tf`。
**腾讯云 Lighthouse(自动发现 ID):**
“`hcl
# 列出该地域全部 Lighthouse 实例(可按 instance_name 过滤)
data “tencentcloud_lighthouse_instances” “all” {}
import {
for_each = {
for i in data.tencentcloud_lighthouse_instances.all.instance_list :
i.instance_id => i.instance_id
}
to = tencentcloud_lighthouse_instance.this[each.key]
id = each.value
}
resource “tencentcloud_lighthouse_instance” “this” {
for_each = data.tencentcloud_lighthouse_instances.all.instance_list
# 以下沿用原 main.tf 的字段;首次跑完用 -generate-config-out 自动补全
bundle_id = var.bundle_id
blueprint_id = var.blueprint_id
instance_name = var.instance_name
zone = var.zone
period = var.period
renew_flag = var.renew_flag
lifecycle {
ignore_changes = [period, bundle_id, blueprint_id, zone]
}
}
“`
“`bash
terraform plan -generate-config-out=generated.tf # 自动写出真实属性
“`
**阿里云轻量应用服务器(自动发现 ID):**
“`hcl
data “alicloud_simple_application_server_instances” “all” {
# name_regex / status 过滤,或留空列出全部
}
import {
for_each = {
for id in data.alicloud_simple_application_server_instances.all.ids :
id => id
}
to = alicloud_simple_application_server_instance.this[each.key]
id = each.value
}
resource “alicloud_simple_application_server_instance” “this” {
for_each = data.alicloud_simple_application_server_instances.all.ids
payment_type = “Subscription”
plan_id = data.alicloud_simple_application_server_plans.default.plans.0.id
image_id = data.alicloud_simple_application_server_images.default.images.0.id
instance_name = var.instance_name
# … 其余沿用原 main.tf
}
“`
**注意**:
– `resource` 块**也必须用 `for_each`**,且 key 与 `import` 块一致(上面示例已对齐)。
– 具体 data 源属性名(如 `instance_list` / `ids`)以对应 provider 文档为准。
– 防火墙规则是独立资源,要单独加一个 `import` 块(见 `TencentCloud/firewall.tf`)。
### 1.3 方式 C:`data.external` + tccli 反查(本项目已预留)
`TencentCloud/lookup.tf` 已用 `data.external` 调用 `tccli` 按实例名反查 ID,适用于「不把实例纳入 resource 管理、只想引用其 ID/IP」的场景。已 `import` 的实例直接用 `resource.id` 即可,此文件可忽略。
—
## 2. Terraformer 工具集
### 2.1 是什么
Google 开源的「反向 Terraform」:扫描你的云账号,**把已有资源逆向生成 `.tf` + `terraform.tfstate`**。适合一次性批量接管大量异构资源。
### 2.2 安装(Windows)
release 页(GoogleCloudPlatform/terraformer)按 provider 拆包:
– 阿里云:`terraformer-alicloud-windows-amd64.exe`
– 腾讯云:`terraformer-tencentcloud-windows-amd64.exe`
– 或全集:`terraformer-all-windows-amd64.exe`
把 exe 路径加入 PATH 即可。
### 2.3 凭证
– **阿里云**:需要 `~/.aliyun/config.json`(用 `aliyun configure` 生成,或手动建,含 `access_key_id` / `access_key_secret` / `region_id`)。
– **腾讯云**:环境变量 `TENCENTCLOUD_SECRET_ID` / `TENCENTCLOUD_SECRET_KEY`(STS 临时密钥再加 `TENCENTCLOUD_SECURITY_TOKEN`)。
### 2.4 运行命令
“`bash
# 阿里云:多地域逗号分隔,* = 该 provider 支持的全部资源
terraformer import alicloud –regions=cn-beijing,cn-hangzhou –resources=”*”
# 腾讯云:列出支持的服务名(cvm,vpc,cbs,clb,cos,mysql,redis,…),* 导入全部
terraformer import tencentcloud –resources=cvm,vpc –regions=ap-guangzhou,ap-shanghai
“`
输出默认在 `./generated/
### 2.5 Windows 三大坑(实测,按顺序排)
| 报错 | 原因 | 修复 |
|—|—|—|
| `CreateFile C:\Users\xxx/.aliyun/config.json: The system cannot find the path specified` + panic | 阿里云 provider 读不到 CLI 配置 | 先 `aliyun configure` 生成 `~/.aliyun/config.json` |
| `open \.terraform.d/plugins/windows_amd64: The system cannot find the path specified` | terraformer 用 `HOME` 拼插件目录,Windows 上 `HOME` 为空 | 跑前设 `$env:HOME = $env:USERPROFILE` |
| `exec: no command` | `terraform` 不在 PATH,terraformer 无法调用它下载 provider | 安装 Terraform 并加入 PATH,验证 `terraform version` |
> 设好 `HOME` 且 `terraform` 在 PATH 后,首次运行会自动把对应 provider 二进制下载到 `~\.terraform.d\plugins\windows_amd64\`。
### 2.6 局限(关键)
– **腾讯云支持列表里没有 `lighthouse`**;阿里云轻量应用服务器(swas)也不在常规支持范围 → **本项目用 terraformer 导入不了轻量服务器**。
– 生成的是硬编码「死配置」,无变量/无 module,需重构。
– 敏感字段(密码/密钥)不会导出,需自行补。
– 全量 `*` 扫大账号会触发大量 API 调用、生成海量文件,建议用服务名缩小范围。
—
## 3. 本项目实操建议
目标:把 `lhins-13o6vhmr` 等轻量实例纳入 IaC 管理。
– **首选方式 B(for_each 自动导入)**:不用手抄 ID,且能自动生成配置。需把 `main.tf` 里的单实例 `resource` 改成 `for_each` 版(本文 1.2 节已给完整代码)。
– **或方式 A(已知 ID 直接 import)**:`main.tf` 注释里命令现成,适合单台、ID 已知。
– **防火墙规则**:`tencentcloud_lighthouse_firewall_rule` 是独立资源,务必单独 import(`TencentCloud/firewall.tf` 已说明)。
– **阿里云预付费注意**:轻量服务器 `destroy` 不退订,只用 `terraform state rm` 解除管理即可。
—
## 4. 怎么选(决策树)
– 资源多、能用名称/标签过滤 → **方式 B(for_each)**,还能自动出配置。
– 就一两台、ID 已知 → **方式 A(手动 import)** 最简单。
– 想整账号一键接管(且资源类型受支持)→ **terraformer**。
– 资源是轻量服务器(本项目)→ **terraformer 不可行**,走方式 A 或 B。