วิธีย้าย terraform state ข้าม project
การใช้ terraform บริหารจัดการ resource ใน project ถ้าหากไม่ได้วางแผนไว้ล่วงหน้าเราอาจจะเอา resource ทุกอย่างอยู่รวมกันใน project เดียว ยกตัวอย่าง terraform resource เช่น ECS cluster, RDS cluster, RDS proxy, ELB, ECS service และECS task definition เป็นต้น
พอ project มีขนาดใหญ่ขึ้น เกิด microservices หลายๆตัวที่ต้องมา share ใช้ infrastructure เหล่านี้ร่วมกัน การวาง resource ที่เป็น shared infrastructure ไว้ใน project ของ application น่าจะไม่ค่อยเหมาะสมนัก จึงจำเป็นต้องแยก shared infrastructure เช่น เช่น ECS cluster, RDS cluster, RDS proxy, ELB ออกมาไว้ในอีก project
สิ่งที่เราต้องทำคือย้าย state และ code ของ terraform resource ที่ต้องการออกมา
สมมุติมี directory ของ project มีโครงสร้างดังนี้
application -> myapp
infrastructure -> myinfra
|
- myapp
|
- myinfra
เช่นต้องการย้าย resource ชื่อ module.rds_proxy จาก myapp ไปอยู่ที่ myinfra โดยใช้ชื่อ resource module.rds_proxy เหมือนเดิมสามารถทำได้ดังนี้
cd myinfra
terraform state pull > ../myinfra.tfstate
cd ../myapp
terraform state pull > ../myapp.tfstate
terraform state mv -state=../myapp.tfstate -state-out=../myinfra.tfstate module.rds_proxy module.rds_proxy
terraform state push ../myapp.tfstate
# verify ว่า state ของ rds_proxy ถูกย้ายไปแล้ว
terraform state list | grep rds_proxy
cd ../myinfra
# ย้าย code ส่วนของ module.rds_proxy เข้ามาอยู่ใน directory
terraform state push ../myinfra.tfstate
# verify ว่า state ของ rds_proxy ถูกย้ายเข้ามาแล้ว
terraform state list | grep rds_proxy
ลอง terraform plan ดู ต้องไม่มีเปลี่ยนแปลงของ resource ใน project
อ้างอิง stackoverflow