Terraform Import
การใช้งาน terraform import นั้นจะเป็นกับการทำงาน ณ ปัจจุบันมากๆ เพราะคนส่วนใหญ่ไม่ได้เริ่มต้นทำงานกับ cloud services ด้วย terraform แต่เราทำงานผ่าน ui ของ cloud service provider เป็นหลัก ดังนั้น หลายคนก็เริ่มหัดใช้งาน terraform แล้วก็รู้สึกว่านี่แหละ เครื่องมือที่จะช่วยตอบโจทย์การทำงานของเราได้ แต่ตอนนี้เรามี resource อยู่บน cloud เต็มไปหมดเลย อยากย้อนกลับไปสร้าง resource ต่างๆใหม่ด้วย terraform ก็กลัวว่าจะไม่เหมือนเดิม terraform import เป็น command ที่จะช่วยตอบโจทย์นี้
การทำงานของ terraform import จะมีอยู่ 2 mode คือ
- Import command run terraform import เพื่อ import resource ที่ต้องการทีละตัว
- Import block เขียน terraform plan เพื่อ generate terraform configuration file
ตอนนี้ความสามารถของ terraform import จะยังไม่สามารถเข้าไป scan หา resources ทั้งหมดที่มีอยู่ใน cloud ของเราได้ เราต้องระบุ resource ต่างๆเข้าไปเอง
Terraform import command
ลักษณะของการ import ด้วย terraform import มีดังนี้
- เราสามารถแก้ไข state data ได้
- import ได้แค่ทีละ resource เท่านั้น
- ต้องสร้าง configuration เอง
เราจะ run terraform import โดยระบุ parameters ต่่างๆ ดังนี้
terraform import aws_vpc.main vpc-123456789
ในตัวอย่างนี้เราจะ import aws vpc ชื่อว่า main ออกมา โดยผลลัพธ์ที่ได้จะไม่ใช่ terraform configuration(.tf) แต่จะได้ผลลัพธ์ออกมาเป็น tfstate ซึ่งจะมีรูปแบบ ดังนี้
{
resources:[
"mode": "managed",
"type": "aws_vpc",
"name": "main",
"instances":[
"id": "vpc-123456789"
]
]
}
หลังจากนั้นเราต้องนำไปแปลงเป็น terraform configuration เองแบบนี้
resource "aws_vpc" "main"{
cidr_block = "10.0.1.0/16"
enable_dns_support = true
tags = {
name = "main"
}
}
หลังจากนั้นเราจะทดสอบว่าสิ่งที่ import ออกมานั้นถูกต้องหรือไม่ด้วยคำสั่ง
terraform plan
ถ้าผลลัพธ์ขึ้นมาเป็น No Change นั้นถือว่าถูกต้อง ซึ่งในรูปแบบนี้จะค่อนข้างใช้มือทำค่อนข้างเยอะ ไม่ได้แตกต่างจากการสร้าง terraform configuration ขึ้นมาเองเท่าไหร่ แต่ก็เหมาะกับโจทย์ที่ต้องการสร้าง terraform configuration และ review configuration ใน resources ต่างๆไปด้วย
ข้อควรระวัง import command คือถ้าเราใช้ terraform import แล้วเกิด run terraform apply ต่อเลย โดยที่ไม่ได้สร้าง terraform configuration resource ที่ import เข้ามานั้นจะถูกลบทิ้งทันที
Terraform import block
รูปแบบนี้เราจะเขียน import แบบ declarative โดยที่เราต้องสร้าง terraform configuration ขึ้นมาก่อนเช่นในตัวอย่างนี้ผมจะสร้างไฟล์ import.tf ขึ้นมา ซึ่งจะมีเนื้อหาแบบนี้
# เหมือน parameters ที่เราใส่ใน terraform import เลย
import {
to = aws_vpc.main
id = "vpc-123456789"
}
เราสามารถเขียน import กี่ block ก็ได้ตามที่เราต้องการ หลังจากนั้นเราก็จะ generate configuration ออกมาด้วยคำสั่ง
terraform plan --generate-config-out=generated.tf
ในตัวอย่างนี้ terraform จะสร้าง file ที่ชื่อว่า generated.tf ขึ้นมา โดยที่เนื้อหาในไฟล์นั้นจะมีดังนี้
# __generated__ by Terraform from ...
resource "aws_vpc" "main"{
cidr_block = "10.0.1.0/16"
enable_dns_support = true
tags = {
name = "main"
}
}
หลังจากนั้นเราก็จะนำเนื้อหาใน generated.tf เข้าไปใส่ไว้ในไฟล์ main.tf เนื่องจาก generated.tf นั้นจะถูก generate ซ้ำทุกครั้งที่ run terraform plan ซึ่งอาจทำให้ resource block ของเราหายได้
import {
to = aws_vpc.main
id = "vpc-123456789"
}
resource "aws_vpc" "main"{
cidr_block = "10.0.1.0/16"
enable_dns_support = true
tags = {
name = "main"
}
}
หลังจากนั้นให้ทดสอบว่า configuration ที่ได้่นั้นถูกต้องหรือไม่ ด้วยคำสั่ง
terraform plan
...
Plan: 1 to import, 0 to add, 0 to change, 0 to destroy
และ ถ้าเราต้องการ apply configuration ใหม่เข้าไป(ในกรณีที่ต้องการแก้ไข) เราจะใช้คำสั่ง
terraform apply
หลังจากนี้เราสามารถเลือกใช้ command terraform import เพื่อสร้าง terraform configuration เอง หรือเขียน import block ไว้ในไฟล์ .tf เพื่อ import ทีละหลายๆ resources ก็ได้