TheKoguryo's 기술 블로그

 Version 2024.04.01

14.3.2 Terraform Configurations 작성하기

Terraform을 쓰려면 Terraform 설정 파일(.tf)에 HashiCorp Configuration Language(HCL) 형식으로 OCI 인프라 자원을 표현해야 합니다. JSON 형식도 지원하지만, 여기서는 HCL 포맷을 사용하겠습니다.

아래 내용은 Terraform에서 가장 기초적인 일부 내용으로 전체 정보는 Terraform 및 Terraform OCI Provider 문서를 참조하기 바랍니다.

OCI 콘솔에서 처음 VCN을 만든 것처럼 Terraform을 통해 VCN을 만드는 것으로 테스트 해 봅니다. 물론 콘솔에서 Wizard로 만드는 것과는 달리 정말 VCN만 만드는 예제입니다.

OCI Provider 정의

Terraform 설정 파일에서 표현하는 자원들은 제공업체(Provider)에 따라 그 종류와 특정이 달라집니다. 다양한 업체들이 Terraform Provider로써 자신들의 자원을 정의하여 제공하고 있습니다. OCI로 Provider는 다음과 같이 설정하여 사용할 수 있습니다.

  • provider.tf

    variable "tenancy_ocid" {}
    variable "user_ocid" {}
    variable "fingerprint" {}
    variable "private_key_path" {}
    variable "region" {}
    
    provider "oci" {
      tenancy_ocid     = "${var.tenancy_ocid}"
      user_ocid        = "${var.user_ocid}"
      fingerprint      = "${var.fingerprint}"
      private_key_path = "${var.private_key_path}"
      region           = "${var.region}"
    }
    

Variable 정의

Provider 정의에서 보듯이 Variable은 Terraform 모듈을 위해 필요한 파라미터 정의를 위해 사용합니다. variable "tenancy_ocid" {}와 같이 정의하고 ${var.tenancy_ocid} 처럼 필요한 곳에서 사용할 수 있습니다. 선언은 variable "변수명" {} 형식으로 선언하여 아래 예시와 같이 추가 설정을 할 수 있습니다.

  • type (옵션): 변수 타있을 정의합니다

    • string, list, map 중 하나
    • 표시하지 않으면 default에 사용된 값 형식에 기초로 함
    • 표시하지 않고 default도 없는 경우는 string으로 가정
  • default (옵션): 디폴트 값 정의, 디폴트 값이 없으면, 호출할 때 환경변수 설정 등을 통해서 전달해야 합니다.

  • description (옵션): 변수 설명을 입력합니다.

  • 예시

    variable "tenancy_ocid" {}
    variable "user_ocid" {}
    variable "fingerprint" {}
    variable "private_key_path" {}
    variable "region" {}
    
    variable "AD" {
      default     = "1"
      description = "Availability Domain"
    }
    
    variable "CPUCoreCount" {
      type    = "string"
      default = "2"
    }
    

Variable 값 설정

  1. Terraform 실행하기 전에 아래 처럼 TF_VAR_변수명 형식으로 환경변수에 지정하여 변수 값을 지정할 수 있습니다.

    export TF_VAR_tenancy_ocid="<tenancy OCID>"
    
  2. terraform CLI 실행시 -var 옵션으로 할 수도 있습니다.

  3. 별도 변수 파일(terraform.tfvars) 생성해도 됩니다.

    • 환경에 따라 변수를 달리하기 위해 파일명이 다른 경우는 terraform 실행시 -var-file 옵션으로 파일명 지정 가능합니다.

    • 예시

      ## terraform.tfvars file
      tenancy_ocid="<tenancy OCID>"
      

Resource 설정

Resource는 생성할 OCI 자원을 나타냅니다. 아래와 같이 resource를 설정하고 terraform을 실행하면, OCI에 해당 자원이 실제로 생성됩니다. Terraform을 지원하는 OCI 자원 목록은 Terraform OCI Provider 문서에서 확인할 수 있습니다.

  • 예시

    variable "compartment_ocid" {}
    
    resource "oci_core_vcn" "example_vcn1" {
      cidr_block     = "10.0.0.0/16"
      dns_label      = "vcn1"
      compartment_id = "${var.compartment_ocid}"
      display_name   = "vcn1"
    }
    

Data Source 설정

Data 소스는 조회할 OCI 자원을 나타냅니다. Resource와는 달리 조회 용도로만 사용됩니다. Terraform을 지원하는 OCI Data 소스는 Terraform OCI Provider 문서에서 확인할 수 있습니다.

  • 예시, oci_identity_availability_domains

    # Gets a list of Availability Domains
    data "oci_identity_availability_domains" "ADs" {
      #Required
      compartment_id = "${var.tenancy_ocid}"
    }
    

Output 설정

Output 변수는 많은 데이터 중에서 쿼리를 통해 특정 값을 조회하는 용도로 terraform 실행시 로그로 출력되며, terraform output 변수명 명령으로 조회도 됩니다.

  • 생성된 example_vcn1의 id 예시

    output "vcn1_ocid" {
      value = ["${oci_core_vcn.example_vcn1.id}"]
    }
    

Terraform Configurations 예시

  • provider.tf

    variable "tenancy_ocid" {}
    variable "user_ocid" {}
    variable "fingerprint" {}
    variable "private_key_path" {}
    variable "region" {}
    
    provider "oci" {
      tenancy_ocid     = "${var.tenancy_ocid}"
      user_ocid        = "${var.user_ocid}"
      fingerprint      = "${var.fingerprint}"
      private_key_path = "${var.private_key_path}"
      region           = "${var.region}"
    }
    
  • vcn.tf

    variable "compartment_ocid" {}
    
    resource "oci_core_vcn" "vcn1" {
      cidr_block     = "10.0.0.0/16"
      dns_label      = "vcn1"
      compartment_id = "${var.compartment_ocid}"
      display_name   = "vcn1"
    }
    
    output "vcn1_ocid" {
      value = ["${oci_core_vcn.vcn1.id}"]
    }
    


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

Last updated on 29 Mar 2019