跳至内容
Terraform导入元数据

Terraform导入元数据

导入环境信息到本地状态文件

方案一: 小批量逐个导入

核心逻辑是在配置文件中先声明一个空的资源块, 然后通过命令将远程资源的状态关联进来, 最后再根据实际属性补齐配置

适合导入单个资源

# 注意: 括号内先留空, 不写任何参数
resource "alicloud_vpc" "pro-vpc" {}
resource "alicloud_instance" "app-2" {}

执行导入

# 命令格式: terraform import resource_type.resource_name 线上实际的资源ID
terraform import alicloud_vpc.pro-vpc vpc-abc12345
terraform import alicloud_instance.app-2 i-2ze0kcfjzxynv4545yuz

补齐代码

# 查看当前状态文件内的资源的属性, 并将属性信息选择性拷贝到代码中
terraform show
terraform state show alicloud_vpc.pro-vpc
terraform state show alicloud_instance.app-2

# 补齐代码内的内容, 剔除只读参数(如 id, creation_time 等)

# 直到运行显示 "No changes" 为止
terraform plan

方案二: 小批量逐个导入 - 模块方式导入

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"
}
terraform import module.testmodule.alicloud_instance.instance i-xxxxxxxxxxxxxx

# 如果该服务有多个实例,则要指定下标
terraform import module.testlistmodule.alicloud_instance."instance[0]" i-xxxxxxxxxxxxxx

方案三: import 代码块导入

优点是导入这个动作被记录在了代码中

import {
  to = alicloud_vpc.vpc1                # 本地新的资源名称
  id = "vpc-2zekv3mnatn04rognc9sy"      # 真实线上资源ID
}
# 生成指定的资源配置文件 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

方案四: Terraformer

https://github.com/GoogleCloudPlatform/terraformer

terraformer-alicloud-linux-amd64
import  # 将当前状态导入 Terraform configuration; 默认输出在 generated 目录下
plan    # 预览导入

--resources         # 指定要导入的资源集合
--regions           # 指定资源所在地域
--path-pattern      # 生成的目录模式
--path-output       # 目录文件路径
--compact           # 将资源都输出到 resources.tf 一个文件中
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

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
terraformer plan google --resources=networks,firewall --projects=my-project --regions=europe-west1-d

方案五: aliterraformer 阿里云

是 Terraformer 的阿里云版本

https://help.aliyun.com/zh/terraform/import-resources-into-terraform

wget https://terraform-share.oss-cn-hangzhou.aliyuncs.com/aliterraformer/aliterraformer_linux_amd64.zip

配置供应商

terraform {
  required_providers {
    alicloud = {
      source  = "aliyun/alicloud"
      version = "~>1.272.1"
    }
  }
}

cli

# 若本地的 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

实践



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
最后更新于