导入环境信息到本地状态文件
方案一: 小批量逐个导入
核心逻辑是在配置文件中先声明一个空的资源块,
然后通过命令将远程资源的状态关联进来, 最后再根据实际属性补齐配置
适合导入单个资源
1
2
3
# 注意: 括号内先留空, 不写任何参数
resource "alicloud_vpc" "pro-vpc" {}
resource "alicloud_instance" "app-2" {}
执行导入
1
2
3
# 命令格式: terraform import resource_type.resource_name 线上实际的资源ID
terraform import alicloud_vpc.pro-vpc vpc-abc12345
terraform import alicloud_instance.app-2 i-2ze0kcfjzxynv4545yuz
补齐代码
1
2
3
4
5
6
7
8
9
# 查看当前状态文件内的资源的属性, 并将属性信息选择性拷贝到代码中
terraform show
terraform state show alicloud_vpc.pro-vpc
terraform state show alicloud_instance.app-2
# 补齐代码内的内容, 剔除只读参数(如 id, creation_time 等)
# 直到运行显示 "No changes" 为止
terraform plan
方案二: 小批量逐个导入 - 模块方式导入
1
2
3
4
5
6
7
8
9
10
11
12
13
module "testmodule" {
source = "../modules/instance"
environment = "xxx"
vswitch_info = "xxxx"
vpc_id = "xxxx"
instance_type = "xxxx"
security_groups = "xxxx"
service = "xxxx"
instance_count = "xxxxx"
system_disk_size = "xxxxx"
system_disk_category = "xxxxx"
alicloud_availability_zones = "xxxxx"
}
1
2
3
4
terraform import module.testmodule.alicloud_instance.instance i-xxxxxxxxxxxxxx
# 如果该服务有多个实例,则要指定下标
terraform import module.testlistmodule.alicloud_instance."instance[0]" i-xxxxxxxxxxxxxx
方案三: import 代码块导入
优点是导入这个动作被记录在了代码中
1
2
3
4
import {
to = alicloud_vpc.vpc1 # 本地新的资源名称
id = "vpc-2zekv3mnatn04rognc9sy" # 真实线上资源ID
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 生成指定的资源配置文件 tf
# Terraform 会读取远程 VPC 的属性, 并自动生成一个包含完整参数定义的 generated_vpc.tf 文件
# 注意, 这里并不会更改状态文件; 只是生成了代码
# 这里这个代码文件不一定完全合适, 可能还需要手工调整一下
terraform plan -generate-config-out= generated_vpc.tf
# 检查生成的配置文件内容, 确认无误后
# 将真实资源关联到状态文件 - 即写入状态文件
terraform import alicloud_vpc.vpc1 vpc-2zekv3mnatn04rognc9sy
# 验证 - 此时应该是 No changes
terraform plan
terraform state list
1
2
3
https://github.com/GoogleCloudPlatform/terraformer
terraformer-alicloud-linux-amd64
1
2
3
4
5
6
7
8
import # 将当前状态导入 Terraform configuration; 默认输出在 generated 目录下
plan # 预览导入
--resources # 指定要导入的资源集合
--regions # 指定资源所在地域
--path-pattern # 生成的目录模式
--path-output # 目录文件路径
--compact # 将资源都输出到 resources.tf 一个文件中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
terraformer-alicloud-linux-amd64 plan alicloud list
# 扫描阿里云北京区域的所有 ECS 实例
# 会在本地生成一个包含 terraform.tfstate 和 *.tf 文件的文件夹
terraformer import alicloud --resources= ecs --regions= cn-beijing
# 指定安全组
terraformer import alicloud --resources= sg --ids= sg-abc12345
# 区域的全部安全组
terraformer import alicloud --resources= sg --regions= cn-beijing
# 导入多种资源
terraformer import alicloud --resources= vpc,sg --regions= cn-beijing
aws
1
2
3
4
5
6
terraformer import aws -r sg,vpc \
--filter Type = sg; Name = vpc_id; Value = VPC_ID --filter Type = vpc; Name = id; Value = VPC_ID
terraformer import aws --resources= vpc,subnet --filter= vpc = myvpcid --regions= eu-west-1
terraformer import aws --resources= s3 --filter= "Name=tags.Abc" --regions= eu-west-1
1
terraformer plan google --resources= networks,firewall --projects= my-project --regions= europe-west1-d
是 Terraformer 的阿里云版本
1
2
3
https://help.aliyun.com/zh/terraform/import-resources-into-terraform
wget https://terraform-share.oss-cn-hangzhou.aliyuncs.com/aliterraformer/aliterraformer_linux_amd64.zip
配置供应商
1
2
3
4
5
6
7
8
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "~>1.272.1"
}
}
}
cli
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 若本地的 Terraform 版本 >=0.13.0,需要执行以下命令来对状态文件进行修改以适配新版本 Terraform
terraform state replace-provider -auto-approve "registry.terraform.io/-/alicloud" "aliyun/alicloud"
# 查看当前版本支持导入的产品列表
aliterraformer products
# 查看当前版本某一产品下支持导入的资源列表
aliterraformer resources -p <productName>
# 查看导入参数
aliterraformer import alicloud -h
# 导入 vpc、vswitch、ECS 实例
aliterraformer import alicloud -r= vpc,vswitch,instance
# 导入 ACK、ALB 产品下所有资源
aliterraformer import alicloud --products= ACK,ALB
# 导入 ACK、ECS 产品下所有资源以及所有 vpc、vswitch
aliterraformer import alicloud --products= ACK,ECS -r= vpc,vswitch
# 导入 ACK 下除 alicloud_cs_kubernetes 外所有资源
aliterraformer import alicloud --products= ACK --excludes= cs_kubernetes
# products 输入 ALL 代表所有的产品
aliterraformer import alicloud --products= ALL
# 导入除 VPNGateway,WAF 外的所有产品
aliterraformer import alicloud --products= ALL --excludes-products= VPNGateway,WAF
# 导入除 VPNGateway,WAF 外的所有产品,排除 alicloud_cs_kubernetes 资源
aliterraformer import alicloud --products= ALL --excludes-products= VPNGateway,WAF --excludes= cs_kubernetes
实践
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
export ALICLOUD_REGION = cn-beijing
# 查看 ack 模块可以导入的资源
aliterraformer resources -p ACK
# 多个资源 导入 - 有失败的
aliterraformer import alicloud --products= ACK,ALB,AutoScaling,VPC,EIP,ECS,NATGateway,OSS,CDN,RAM,Alidns,SLS
# 按模块单独导入
aliterraformer resources -p VPC
aliterraformer import alicloud --products= VPC --excludes= vpc_ha_vip
aliterraformer import alicloud --products= ALB --excludes= alb_listener_additional_certificate_attachment
aliterraformer resources -p ECS
aliterraformer import alicloud --products= ECS
aliterraformer resources -p EIP
aliterraformer resources -p NATGateway
aliterraformer import alicloud --products= EIP,NATGateway
aliterraformer resources -p OSS
aliterraformer import alicloud --products= OSS
aliterraformer resources -p Alidns
aliterraformer import alicloud --products= Alidns
aliterraformer resources -p CDN
aliterraformer import alicloud --products= CDN
Licensed under CC BY-NC-SA 4.0 转载或引用本文时请遵守许可协议,知会作者并注明出处 不得用于商业用途!
最后更新于 2025-09-20 00:00 UTC