TheKoguryo's 기술 블로그

Version 2019.06.03

14.2.5 다중 환경을 위한 workspace 사용하기

OCI는 여러 Region을 제공하고 있습니다. 필요에 따라 동일 자원을 여러 Region에 한꺼번에 만들어야 하는 경우가 있습니다. 하지만 앞서 실습에서 잠깐 보았겠지만, terraform 설정이 실행되면 기본으로 해당 폴더에 terraform.tfstate로 상태를 관리하게되어 동일 Terraform 설정을 그대로 사용할 경우 상태파일이 충돌나서 원하는 데로 동작하지 않게 됩니다. Terraform 설정 폴더 자체를 통채로 복사해서 대상 Region 별로 사용해도 되지만, 관리가 번거롭게 됩니다. 그래서 Terraform에서는 workspace만 개념을 제공하고, 기본적으로 default workspace를 사용하게 됩니다.

Terraform Configuration 파일

이전 실습에서 사용한 vcn 만들기 설정을 그대로 사용합니다.

Workspace 만들기

  • terraform workspace 구문
    • terraform workspace list : workspace 조회하기
    • terraform workspace new {이름} : 새로운 workspace 만들기
    • terraform workspace delete {이름} : 해당 worksapce 삭제하기
    • terraform workspace select {이름} : 현재 workspace를 전환하기
  • 새로운 workspace를 만듭니다.
D:\example_vcn_workspace>terraform workspace list
* default


D:\example_vcn_workspace>terraform workspace new thekoguryo_us-phoenix-1
Created and switched to workspace "thekoguryo_us-phoenix-1"!

You're now on a new, empty workspace. Workspaces isolate their state,
so if you run "terraform plan" Terraform will not see any existing state
for this configuration.

D:\example_vcn_workspace>terraform workspace new thekoguryo_eu-frankfurt-1
Created and switched to workspace "thekoguryo_eu-frankfurt-1"!

You're now on a new, empty workspace. Workspaces isolate their state,
so if you run "terraform plan" Terraform will not see any existing state
for this configuration.

D:\example_vcn_workspace>terraform workspace list
default
* thekoguryo_eu-frankfurt-1
thekoguryo_us-phoenix-1


D:\example_vcn_workspace>terraform workspace select thekoguryo_us-phoenix-1
Switched to workspace "thekoguryo_us-phoenix-1".

D:\example_vcn_workspace>

1번째 workspace: thekoguryo_us-phoenix-1에서 terraform 실행하기

  1. workspace를 먼저 전환하고 vcn을 만드는 terraform을 실행합니다.

    D:\example_vcn_workspace>terraform workspace select thekoguryo_us-phoenix-1
    Switched to workspace "thekoguryo_us-phoenix-1".
    
    D:\example_vcn_workspace>terraform apply -var="region=us-phoenix-1"
    
    An execution plan has been generated and is shown below.
    Resource actions are indicated with the following symbols:
    +create
    
    Terraform will perform the following actions:
    
    +oci_core_virtual_network.vcn1
        id:                       <computed>
        cidr_block:               "10.0.0.0/16"
        compartment_id:           "ocid1.compartment.oc1..aaaaaaaatz24wcxhliq6egof4odfayzysfbj3yksdmhcava7ambc2w2dcshq"
        default_dhcp_options_id:  <computed>
        default_route_table_id:   <computed>
        default_security_list_id: <computed>
        display_name:             "vcn1"
        dns_label:                "vcn1"
        freeform_tags.%:          <computed>
        state:                    <computed>
        time_created:             <computed>
        vcn_domain_name:          <computed>
    
    
    Plan: 1 to add, 0 to change, 0 to destroy.
    
    Do you want to perform these actions in workspace "thekoguryo_us-phoenix-1"?
    Terraform will perform the actions described above.
    Only 'yes' will be accepted to approve.
    
    Enter a value: yes
    
    oci_core_virtual_network.vcn1: Creating...
    cidr_block:               "" => "10.0.0.0/16"
    compartment_id:           "" => "ocid1.compartment.oc1..aaaaaaaatz24wcxhliq6egof4odfayzysfbj3yksdmhcava7ambc2w2dcshq"
    default_dhcp_options_id:  "" => "<computed>"
    default_route_table_id:   "" => "<computed>"
    default_security_list_id: "" => "<computed>"
    display_name:             "" => "vcn1"
    dns_label:                "" => "vcn1"
    freeform_tags.%:          "" => "<computed>"
    state:                    "" => "<computed>"
    time_created:             "" => "<computed>"
    vcn_domain_name:          "" => "<computed>"
    oci_core_virtual_network.vcn1: Creation complete after 2s (ID: ocid1.vcn.oc1.phx.aaaaaaaa5ysdjaugi2xs7blhs4hfyg5hpy4udgpfqlyvb4meuzfuyxzhfkuq)
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
    
    Outputs:
    
    vcn1_ocid = [
        ocid1.vcn.oc1.phx.aaaaaaaa5ysdjaugi2xs7blhs4hfyg5hpy4udgpfqlyvb4meuzfuyxzhfkuq
    ]
    
    D:\example_vcn_workspace>    
  2. 결과 확인
    OCI 콘솔에서 us-pheonix-1 Region으로 변경하면 VCN이 생성된 것을 확인할 수 있습니다.
    그림

2번째 workspace: thekoguryo_eu-frankfrut-1에서 terraform 실행하기

  1. 동일한 위치에서 workspace를 먼저 전환하고 vcn을 만드는 terraform을 동일하게 실행합니다.

    D:\example_vcn_workspace>terraform workspace select thekoguryo_eu-frankfurt-1
    Switched to workspace "thekoguryo_eu-frankfurt-1".
    
    D:\example_vcn_workspace>terraform apply -var="region=eu-frankfurt-1"
    
    An execution plan has been generated and is shown below.
    Resource actions are indicated with the following symbols:
    +create
    
    Terraform will perform the following actions:
    
    +oci_core_virtual_network.vcn1
        id:                       <computed>
        cidr_block:               "10.0.0.0/16"
        compartment_id:           "ocid1.compartment.oc1..aaaaaaaatz24wcxhliq6egof4odfayzysfbj3yksdmhcava7ambc2w2dcshq"
        default_dhcp_options_id:  <computed>
        default_route_table_id:   <computed>
        default_security_list_id: <computed>
        display_name:             "vcn1"
        dns_label:                "vcn1"
        freeform_tags.%:          <computed>
        state:                    <computed>
        time_created:             <computed>
        vcn_domain_name:          <computed>
    
    
    Plan: 1 to add, 0 to change, 0 to destroy.
    
    Do you want to perform these actions in workspace "thekoguryo_eu-frankfurt-1"?
    Terraform will perform the actions described above.
    Only 'yes' will be accepted to approve.
    
    Enter a value: yes
    
    oci_core_virtual_network.vcn1: Creating...
    cidr_block:               "" => "10.0.0.0/16"
    compartment_id:           "" => "ocid1.compartment.oc1..aaaaaaaatz24wcxhliq6egof4odfayzysfbj3yksdmhcava7ambc2w2dcshq"
    default_dhcp_options_id:  "" => "<computed>"
    default_route_table_id:   "" => "<computed>"
    default_security_list_id: "" => "<computed>"
    display_name:             "" => "vcn1"
    dns_label:                "" => "vcn1"
    freeform_tags.%:          "" => "<computed>"
    state:                    "" => "<computed>"
    time_created:             "" => "<computed>"
    vcn_domain_name:          "" => "<computed>"
    oci_core_virtual_network.vcn1: Creation complete after 2s (ID: ocid1.vcn.oc1.eu-frankfurt-1.aaaaaaaaxe...fp43m72x6ueq5bbabfyegoo4zepfqn736werla)
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
    
    Outputs:
    
    vcn1_ocid = [
        ocid1.vcn.oc1.eu-frankfurt-1.aaaaaaaaxekgw5b62aml3qfp43m72x6ueq5bbabfyegoo4zepfqn736werla
    ]
    
    D:\example_vcn_workspace>
  2. 결과 확인
    OCI 콘솔에서 eu-frankfurt-1 Region으로 변경하면 VCN이 생성된 것을 확인할 수 있습니다.
    그림

  3. Terraform State 확인
    workspace를 사용하는 경우 아래와 같이 terraform.tfstate.d 폴더 밑에 workspace 별 폴더 밑에 terrafrom.tfstate 파일이 생성되어 workspace 별로 상태를 관리하는 것을 알 수 있습니다.

    D:\example_vcn_workspace>dir terraform.tfstate.d /s
    D 드라이브의 볼륨: MyData
    볼륨 일련 번호: D045-88C8
    
    D:\example_vcn_workspace\terraform.tfstate.d 디렉터리
    2019-04-01  오후 03:13    <DIR>          .
    2019-04-01  오후 03:13    <DIR>          ..
    2019-04-01  오후 03:15    <DIR>          thekoguryo_eu-frankfurt-1
    2019-04-01  오후 03:02    <DIR>          thekoguryo_us-phoenix-1
                0개 파일                   0 바이트
    
    D:\example_vcn_workspace\terraform.tfstate.d\thekoguryo_eu-frankfurt-1 디렉터리
    2019-04-01  오후 03:15    <DIR>          .
    2019-04-01  오후 03:15    <DIR>          ..
    2019-04-01  오후 03:15             2,686 terraform.tfstate
                1개 파일               2,686 바이트
    
    D:\example_vcn_workspace\terraform.tfstate.d\thekoguryo_us-phoenix-1 디렉터리
    2019-04-01  오후 03:02    <DIR>          .
    2019-04-01  오후 03:02    <DIR>          ..
    2019-04-01  오후 03:02             2,620 terraform.tfstate
                1개 파일               2,620 바이트
    
        전체 파일:
                2개 파일               5,306 바이트
                8개 디렉터리  711,275,831,296 바이트 남음
    
    D:\example_vcn_workspace>


** 이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다. **
Last updated on 1 Apr 2019