วิธีการ Import Terraform State ใน Terraform Cloud
Terraform v1.5.2
ปัญหา
เวลาเราใช้งาน Terraform Cloud มันจะมีประเด็นอยู่คือ Terraform ไม่ให้เรา Import Resource ใหม่ถ้าเราใช้ Variable ที่เป็น Secret ที่อยู่บน Terraform Cloud
วิธีแก้เบื้องต้น
-
รันคำสั่ง เพื่อดึง State ที่อยู่บน Cloud ลงมาที่ local ก่อน
terraform state pull > terraform.tfstate
-
ลบโฟลเดอร์
.terraform
เพราะว่าเรามีการเชื่อมต่อกับ Terraform Cloud ไว้แล้ว (หมายถึงเก็บ Terraform State ที่ Terraform Cloud)rm -rf .terraform
-
ให้ comment ส่วนของ block
cloud
ไว้ก่อน (Remote State) ยกตัวอย่าง Code ข้างล่างผมใช้ provide azurermterraform { required_version = ">= 1.5.2" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 3.58" } } # cloud { # organization = "your-organization" # workspaces { # name = "my-terraform" # } # } } provider "azurerm" { features {} }
-
สั่ง
terraform init
เพื่อเริ่มต้นติดตั้ง module ใหม่ทั้งหมด พอไม่มี blockcloud
terraform จะไปใช้งาน local state ซึ่งนั้่นก็คือไฟล์terraform.tfstate
ที่เราดาวน์โหลดลงมาในข้อ 1.terraform init
-
สั่ง
terraform state list
เพื่อดูว่ามี State อยู่ที่ Local จริงๆ นะterraform state list
-
จากนั้นให้เริ่ม import resource ตามที่เราต้องการ เช่น ผมจะ import resource ที่ชื่อ azurerm_linux_web_app ก็สามารถใช้ Syntax import ได้ตามปกติ
terraform import azurerm_linux_web_app.example /subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Web/sites/site1
-
จากนั้นสั่ง
terraform state list
เพื่อดูว่าที่ import เข้ามาอยู่ใน State แล้วหรือยังterraform state list
-
ให้เอา comment ออกในส่วนของ
cloud
(Remote State)terraform { required_version = ">= 1.5.2" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 3.58" } } cloud { organization = "your-organization" workspaces { name = "my-terraform" } } } provider "azurerm" { features {} }
-
ลบโฟลเดอร์
.terraform
เพราะว่าเรามีการเชื่อมต่อใช้ Terraform State อยู่ใน Local ไว้อยู่rm -rf .terraform
-
สั่ง
terraform init
เพื่อเริ่มต้นติดตั้ง module ใหม่ทั้งหมด พอมี blockcloud
(Remote State) มันก็จะต่อไปที่ Terraform Cloud อีกครั้งterraform init
ซึ่งในขั้นตอนนี้ Terraform จะข้อความมายาวๆ เพื่อถามว่าจะให้ Terraform State บน Local ไปทับ State บน Cloud มั้ย (แนะนำให้ Backup local state ไว้ก่อนทุกครั้ง) จากนั้นให้กด Yes เพื่อเริ่มทำงาน
Ref: https://github.com/hashicorp/terraform/issues/26494
แอบเหนื่อยนิดนึง แต่ก็แก้ปัญหาได้นะ ใครมี Solution ดีๆ มา share กันได้นะ