주:

Oracle Cloud Infrastructure 리소스를 Terraform 상태 파일로 임포트

소개

Terraform을 사용하여 Oracle Cloud Infrastructure(OCI) 리소스를 관리하면 많은 이점이 있습니다. 그 중 하나는 인프라 구축에 일관성과 재현성을 제공한다는 점입니다. 또 다른 점은 프로젝트 전반에서 Terraform 구성을 모듈화 및 재사용할 수 있어 인프라 구성을 쉽게 관리하고 확장할 수 있다는 것입니다. 또한 Terraform을 사용하면 인프라 프로비저닝 및 관리를 자동화하여 일관되고 반복 가능한 배포가 가능합니다. 또 다른 중요한 측면은 Terraform이 인프라의 현재 상태를 추적하는 상태 파일을 유지한다는 것입니다. 이 상태 파일은 변경 사항을 계획하고 적용하는 데 사용되므로 Terraform에서 원하는 상태를 얻기 위해 변경해야 할 사항을 결정할 수 있습니다.

그러나 Oracle Cloud Infrastructure(OCI)의 일부 리소스가 Terraform에서 관리되지 않는 상황이 있습니다. 이 문제는 일반적으로 상태 파일에 있는 Terraform을 사용하여 리소스를 프로비저닝한 다음 다른 사용자가 다른 리소스를 수동으로 생성하는 경우에 발생합니다. 나중에 Terraform에서 관리하려면 수동으로 생성된 리소스가 필요하다는 것을 알 수 있습니다.

다음 사항을 고려하십시오.

이미 있는 Terraform 구성 및 상태 파일을 사용하여 새로 추가된 컴퓨트를 관리하려는 경우 Terraform 임포트 명령을 사용할 수 있지만 따라야 할 단계가 더 있으며 Terraform 구성 파일을 업데이트해야 합니다.

Terraform v1.5.0 이상에서는 블록 임포트가 지원됩니다. 이 접근 방식을 사용하면 현재 사용 중인 Terraform 코드는 변경되지 않습니다. 기존 Terraform 구성 파일에 통합하도록 선택할 수 있지만 반드시 필요한 것은 아닙니다. 목표는 OCI 리소스를 Terraform에서 관리되지 않는 Terraform 상태 파일로 가져오는 것입니다.

한 가지 중요한 측면은 가져오기 블록이 CI/CD 파이프라인에서 작동한다는 것입니다. 또한 상태를 수정하기 전에 가져오기 작업을 미리 볼 수 있습니다. 결국 모든 것은 당신과 사용 사례의 복잡성에 달려 있습니다.

목표

필요 조건

작업 1: Terraform으로 생성된 기존 인프라 확인

  1. terraform state list 명령을 실행하여 Terraform 구성 파일로 관리되는 OCI 리소스를 확인합니다.

    terraform state list
    module.network.data.oci_core_services.all_oci_services
    module.network.oci_core_internet_gateway.igw["igw"]
    module.network.oci_core_nat_gateway.ngw["ngw"]
    module.network.oci_core_route_table.route_table["rt_priv"]
    module.network.oci_core_route_table.route_table["rt_pub"]
    module.network.oci_core_security_list.sl["sl_priv"]
    module.network.oci_core_security_list.sl["sl_public"]
    module.network.oci_core_service_gateway.this["sgw"]
    module.network.oci_core_subnet.subnets["sn1_priv"]
    module.network.oci_core_subnet.subnets["sn1_pub"]
    module.network.oci_core_subnet.subnets["sn2_priv"]
    module.network.oci_core_subnet.subnets["sn3_priv"]
    module.network.oci_core_virtual_network.vcn["vcn1"]
    

    보시다시피 VCN, 서브넷, 보안 목록 및 라우팅 테이블이 있습니다.

  2. 내 Terraform 구성 파일은 다음과 같습니다.

    ~/workORCL/_MY_OCI_INFRA/oci-vcn> ls -l
    total 120
    -rwxr-xr-x@ 1 fvass  staff    849 Jul 10  2023 main.tf
    drwxr-xr-x@ 3 fvass  staff     96 May 25  2023 modules
    -rwxr-xr-x@ 1 fvass  staff    387 May 25  2023 output.tf
    -rw-r--r--  1 fvass  staff    379 Apr  3 09:18 provider.auto.tfvars
    -rw-r--r--  1 fvass  staff  29040 Apr  3 11:00 terraform.tfstate
    -rw-r--r--  1 fvass  staff    182 Apr  3 11:00 terraform.tfstate.backup
    -rwxr-xr-x@ 1 fvass  staff   6007 Apr  3 10:59 terraform.tfvars
    -rwxr-xr-x@ 1 fvass  staff   2869 May 25  2023 variables.tf
    

작업 2: OCI 콘솔을 사용하여 OCI 컴퓨트 VM 생성

작업 1에서 다른 OCI 리소스가 생성되는 동일한 지역에 OCI 컴퓨트 VM을 생성합니다. 이 자습서에서는 작업 1(해당 서브넷 중 하나에 있을 필요는 없음)에 있는 서브넷 중 하나에 해당 서브넷을 만듭니다. 생성 후 추가 작업에서 필요한 컴퓨트 OCID(Oracle Cloud 식별자)를 가져옵니다.

주: 이 VM은 현재 Terraform에서 관리되지 않습니다.

작업 3: import_block.tf 파일 생성

Terraform 코드가 있는 동일한 폴더에 import_block.tf이라는 파일을 생성합니다(다른 이름을 지정할 수 있음).

oci_core_instance 유형을 사용하여 컴퓨트 리소스를 임포트합니다. 리소스 이름은 demo_inst_1입니다. terraform plan 명령을 실행하면 Terraform은 이 파일을 읽고 새 리소스를 기존 상태 파일로 가져와야 함을 인식합니다.

작업 4: terraform plan 명령 실행

다음 명령을 실행합니다. 이 인수 generate-config-out는 작업 2에서 생성된 컴퓨트에 대한 Terraform 구성이 포함된 파일을 생성합니다.

terraform plan --generate-config-out=compute.tf

출력은 다음과 같습니다.

Plan: 1 to import, 0 to add, 0 to change, 0 to destroy.
╷
│ Warning: Config generation is experimental
│
│ Generating configuration during import is currently experimental, and the generated configuration format may change in future versions.
╵

─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Terraform has generated configuration and written it to compute.tf. Please review the configuration and edit it as necessary before adding it to version control.

이제 compute.tf 파일이 있습니다.

~/workORCL/_MY_OCI_INFRA/oci-vcn> ls -ltr
total 144
-rwxr-xr-x@ 1 fvass  staff    387 May 25  2023 output.tf
drwxr-xr-x@ 3 fvass  staff     96 May 25  2023 modules
-rwxr-xr-x@ 1 fvass  staff   2869 May 25  2023 variables.tf
-rw-r--r--  1 fvass  staff    379 Apr  3 09:18 provider.auto.tfvars
-rwxr-xr-x@ 1 fvass  staff   6007 Apr  3 10:59 terraform.tfvars
-rw-r--r--  1 fvass  staff    182 Apr  3 11:00 terraform.tfstate.backup
-rw-r--r--  1 fvass  staff  29040 Apr  3 11:00 terraform.tfstate
-rwxr-xr-x@ 1 fvass  staff    855 Apr  3 11:12 main.tf
-rw-r--r--  1 fvass  staff    142 Apr  3 11:12 import_block.tf
-rw-r--r--  1 fvass  staff   4421 Apr  3 11:17 compute.tf

작업 5: terraform apply 명령 실행

다음 명령을 실행하여 Terraform 상태 파일에 컴퓨트를 추가합니다.

terraform apply

출력은 다음과 같습니다.

Plan: 1 to import, 0 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.

이제 구성을 적용합니다.

작업 6: 상태 파일 확인

terraform state list 명령을 실행하고 oci_core_instance.demo_inst_1가 있는지 확인합니다.

~/workORCL/_MY_OCI_INFRA/oci-vcn> terraform state list
oci_core_instance.demo_inst_1
module.network.data.oci_core_services.all_oci_services
module.network.oci_core_internet_gateway.igw["igw"]
module.network.oci_core_nat_gateway.ngw["ngw"]
module.network.oci_core_route_table.route_table["rt_priv"]
module.network.oci_core_route_table.route_table["rt_pub"]
module.network.oci_core_security_list.sl["sl_priv"]
module.network.oci_core_security_list.sl["sl_public"]
module.network.oci_core_service_gateway.this["sgw"]
module.network.oci_core_subnet.subnets["sn1_priv"]
module.network.oci_core_subnet.subnets["sn1_pub"]
module.network.oci_core_subnet.subnets["sn2_priv"]
module.network.oci_core_subnet.subnets["sn3_priv"]
module.network.oci_core_virtual_network.vcn["vcn1"]

작업 7: import_block.tf 파일 제거

이 시점에서 import_block.tf 파일을 안전하게 제거할 수 있습니다. Terraform에서는 무시됩니다.

작업 8: 컴퓨트 테스트

컴퓨트 구성을 변경할 수 있습니다. compute.tf에서 memory_in_gbsshape_config에서 변경하고 terraform plan를 실행하여 변경사항을 확인합니다.

출력은 다음과 같습니다.

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # oci_core_instance.demo_inst_1 will be updated in-place
  ~ resource "oci_core_instance" "demo_inst_1" {
        id                  = "ocid1.instance.oc1.iad.anuwcljswe.........."
        # (20 unchanged attributes hidden)

      ~ shape_config {
          ~ memory_in_gbs                 = 16 -> 32
            # (8 unchanged attributes hidden)
        }

        # (7 unchanged blocks hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

확인

추가 학습 자원

docs.oracle.com/learn에서 다른 실습을 살펴보거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하십시오. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer가 되십시오.

제품 설명서는 Oracle Help Center를 참조하십시오.