Coding Gun

Terraform Import

การใช้งาน terraform import นั้นจะเป็นกับการทำงาน ณ ปัจจุบันมากๆ เพราะคนส่วนใหญ่ไม่ได้เริ่มต้นทำงานกับ cloud services ด้วย terraform แต่เราทำงานผ่าน ui ของ cloud service provider เป็นหลัก ดังนั้น หลายคนก็เริ่มหัดใช้งาน terraform แล้วก็รู้สึกว่านี่แหละ เครื่องมือที่จะช่วยตอบโจทย์การทำงานของเราได้ แต่ตอนนี้เรามี resource อยู่บน cloud เต็มไปหมดเลย อยากย้อนกลับไปสร้าง resource ต่างๆใหม่ด้วย terraform ก็กลัวว่าจะไม่เหมือนเดิม terraform import เป็น command ที่จะช่วยตอบโจทย์นี้

การทำงานของ terraform import จะมีอยู่ 2 mode คือ

ตอนนี้ความสามารถของ terraform import จะยังไม่สามารถเข้าไป scan หา resources ทั้งหมดที่มีอยู่ใน cloud ของเราได้ เราต้องระบุ resource ต่างๆเข้าไปเอง

Terraform import command

ลักษณะของการ import ด้วย terraform import มีดังนี้

  1. เราสามารถแก้ไข state data ได้
  2. import ได้แค่ทีละ resource เท่านั้น
  3. ต้องสร้าง 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 ก็ได้

อ่านต่อเพิ่มเติมได้ที่

Phanupong Permpimol
Follow me

Software Engineer ที่เชื่อในเรื่องของ Process เพราะเมื่อ Process ดี Product ก็จะดีตาม ปัจจุบันเป็นอาจารย์และที่ปรึกษาด้านการออกแบบและพัฒนา Software และ Web Security