moved block

리팩토링 할때 꼭 필요한 기능이다.

기존에 있는코드를 모듈로 보내보자.

현재 디렉토리 구조

main.tf

module "instance_nonflex" {
  source           = "oracle-terraform-modules/compute-instance/oci"
  compartment_ocid = var.compartment_id
  # compute instance parameters
  ad_number             = var.instance_ad_number
  instance_count        = var.instance_count
  instance_display_name = var.instance_display_name
  instance_state        = var.instance_state
  shape                 = var.shape
  source_ocid           = var.source_ocid
  source_type           = var.source_type
  ssh_public_keys = var.ssh_public_keys
  public_ip            = var.public_ip
  subnet_ocids         = [local.private_subnet_id]
  primary_vnic_nsg_ids = null
  boot_volume_backup_policy  = var.boot_volume_backup_policy
  block_storage_sizes_in_gbs = var.block_storage_sizes_in_gbs
}
terraform plan
terraform apply --auto-approve
terraform state list
module.instance_nonflex.data.oci_identity_availability_domains.ad
module.instance_nonflex.oci_core_instance.instance[0]
module.instance_nonflex.oci_core_instance.instance[1]
module.instance_nonflex.oci_core_instance.instance[2]
module.instance_nonflex.oci_core_volume.volume[0]
module.instance_nonflex.oci_core_volume.volume[1]
module.instance_nonflex.oci_core_volume.volume[2]
module.instance_nonflex.oci_core_volume_attachment.volume_attachment[0]
module.instance_nonflex.oci_core_volume_attachment.volume_attachment[1]
module.instance_nonflex.oci_core_volume_attachment.volume_attachment[2]

모듈로 바꿔보자

이제 모듈로 변경해본다.

폴더를 만들고 main.tf를 만들고 코드를 이동한다.

그리고 기존 main에서 이 모듈을 사용해보자.

module "instance" {
  compartment_id = var.compartment_id
  source = "./base/instance"
  source_ocid = "ocid1.image.oc1.us-sanjose-1.ga5ohbkd3nwa"
  instance_state = "RUNNING"
  instance_count = 3
  ssh_public_keys = var.ssh_public_keys
}
terraform plan

9개를 삭제하고 다시 만든다. 이러면 문젝 된다. 실행중인 서버를 없애버리게 된다.

terraform state mv

terraform state mv module.instance_nonflex.oci_core_instance.instance[0] module.instance.oci_core_instance.instance[0]

이걸로 가능하시도 하다.

moved block

사실 코드에 넣어야 좋기는 하다.

moved {
  from = OLD
  to   = NEW
}

이걸 추가하였다.

moved {
  from = module.instance_nonflex.oci_core_instance.instance
  to =   module.instance.module.instance_nonflex.oci_core_instance.instance
}

moved {
  from = module.instance_nonflex.oci_core_volume.volume
  to =   module.instance.module.instance_nonflex.oci_core_volume.volume
}

moved {
  from = module.instance_nonflex.oci_core_volume_attachment.volume_attachment
  to =   module.instance.module.instance_nonflex.oci_core_volume_attachment.volume_attachment
}
terraform plan

0개가 바귀는것을 알수 있다.

terraform apply --auto-approve
terraform state list

remote module

리모트 모듈에서는 block이 안된다. 꼭 확인해야한다.

terraform state mv #으로 처리해야한다.

tfautomv

https://github.com/padok-team/tfautomv

자동으로 moved block을 만들어준다.

brew install padok-team/tap/tfautomv
tfautomv

moved 블락을 지우고 명령어를 실행해보자.

9개가 추가되고 9개가 삭제된다고한다. 예상하던 결과이다.

이제 명령어를 실행해보자.

tfautomv

moves.tf파일이 생성된다.

좋다.

todo

moved가 계속 잇어야하나?

terraform state mv로 처리해도 된다.

Last updated

Was this helpful?