Terraform 실행 환경 구성

Terraform 실행 환경에는 다중 계층 네트워크 토폴로지를 작성하는 데 필요한 폴더 및 Terraform 구성 파일의 레이아웃이 포함됩니다.

Terraform 실행 환경 정보

Terraform 실행 환경의 레이아웃은 모듈 및 미래 성장을 위해 설계되었습니다.

Terraform 구성을 포함하는 디렉토리와 파일은 실행 환경을 구성합니다. 각 하위 디렉토리는 Terraform 모듈을 나타냅니다. 또한 하위 디렉토리는 리소스의 재사용 가능 라이브러리를 구성합니다.

다음 디렉토리 구조는 이 솔루션에서 작성하는 실행 환경을 나타냅니다.

다음은 local_directory_structure.png에 대한 설명입니다.
그림 local_directory_structure.png에 대한 설명

전체 구성은 선택한 이름을 가진 루트 디렉토리 내에 있습니다. 이 디렉토리는 시작할 때 비어 있어야 합니다.

구성을 생성한 후 루트 디렉토리에는 다음 디렉토리와 파일이 포함됩니다.

  • compartments 디렉토리에는 구획에 대한 구성 매개변수가 포함됩니다.
  • iam 디렉토리에는 정책 및 그룹에 대한 구성 매개변수가 포함됩니다.
  • vcn 디렉토리에는 가상 클라우드 네트워크 및 게이트웨이에 대한 구성 매개변수가 포함됩니다.
  • 루트 디렉토리에 있는 파일:
    • datasources.tf 는 영역의 가용성 도메인 수를 결정하고 해당 이름을 가져옵니다.
    • provider.tf 는 사용할 Terraform 제공자의 매개변수를 정의합니다.
    • root.tf 는 Terraform이 실행할 모듈을 정의합니다.
    • terraform.tvars 는 Terraform에 전달하는 변수의 값을 정의합니다.
    • variables.tf 는 구성 모듈에서 사용하는 변수를 선언합니다.

루트 모듈 생성

루트 모듈에서 Terraform이 Oracle Cloud Infrastructure 에 접속하는 데 필요한 매개변수를 정의합니다. 또한 구성의 모듈에서 사용하는 데이터 및 변수를 정의합니다.

  1. Terraform을 설치한 컴퓨터에서 이 솔루션의 나머지 부분에 루트 디렉토리라고 하는 디렉토리를 생성합니다.
  2. 루트 디렉토리에 다음 하위 디렉토리를 생성합니다.
    • compartments
    • iam
    • vcn
  3. 루트 디렉토리에 variables.tf 라는 텍스트 파일을 생성하고 파일에 다음 코드를 붙여넣습니다.
    이 코드는 Terraform 구성의 모듈에서 사용하는 변수를 선언합니다. 다음 단계에서 이러한 변수의 값을 지정합니다.
    variable "tenancy_ocid" {}
    variable "user_ocid" {}
    variable "fingerprint" {}
    variable "private_key_path" {}
    variable "private_key_password" {}
    variable "app_tag" {}
    variable "environment" {}
    variable "home_region" {}
    variable "region" {}
    variable "vcn_cidr" {
      default = "10.0.0.0/16"
    }
    
  4. 루트 디렉토리에 terraform.tfvars 라는 텍스트 파일을 생성하고 파일에 다음 코드를 붙여넣습니다.
    이 코드에서 이전 단계에서 선언된 변수의 값을 정의합니다.
    # Parameters to authenticate with Oracle Cloud Infrastructure
    tenancy_ocid="EXAMPLE: ocid1.tenancy.oc1..aaaaaaaaf76usem7gyfrakr35anvky4tyowvdvbik7kbrcizlyjsgfxpdg2a"
    user_ocid="EXAMPLE: ocid1.user.oc1..aaaaaaaa5tds42w2zzbsdflkjwerkjghswdjfbvbts7imlb5yru2p10a"
    fingerprint="EXAMPLE: 9b:6a:ab:ab:32:0b:7f:d5:5b:6w:c0:fe:54:72:f1:pl"
    private_key_path="YOUR_HOME_DIRECTORY/.oci/oci_api_key.pem"
    
    # Leave empty if your private key does not have a password
    private_key_password=""
    
    # See https://docs.oracle.com/pls/topic/lookup?ctx=cloud&id=oci_general_regions
    home_region="EXAMPLE: us-ashburn-1"
    region="EXAMPLE: us-phoenix-1"
    
    # A short identifier for the application, used as a prefix for naming the compartments and other resources
    app_tag="myapp"
    
    # The environment that you're creating resources for: test, dev, prod, or staging
    environment="dev"
    
    # Base CIDR for the VCN
    vcn_cidr="10.0.0.0/16"
  5. 다음 표에 설명된 대로 terraform.tfvars 의 변수 값을 업데이트합니다.
    변수 설명
    tenancy_ocid 테넌시의 OCID (Oracle Cloud ID) 입니다.

    테넌시의 OCID를 찾으려면 서비스 메뉴에서 관리 를 선택하고 테넌시 세부정보 를 누릅니다.

    user_ocid Terraform이 Oracle Cloud Infrastructure 에서 인증하는 데 사용할 사용자의 OCID (Oracle Cloud ID) 입니다.

    사용자의 OCID를 찾으려면 서비스 메뉴에서 id 를 선택하고 사용자 를 선택합니다. 목록에서 사용자 이름을 찾아 OCID 값을 복사합니다.

    지문 업로드한 API 서명 키에 대한 지문입니다.
    private_key_path 전용 키를 포함하는 파일의 경로입니다.
    private_key_password 전용 키의 문장암호입니다. 키에 문장암호가 없는 경우 이 변수를 비워 두십시오.
    home_region 테넌시의 홈 지역입니다. 구획, 정책 및 그룹은 홈 영역에 생성됩니다.

    홈 영역을 가져오려면 서비스 메뉴에서 관리 를 선택하고 테넌시 세부정보 를 누른 다음 홈 영역 필드의 값을 복사합니다.

    영역 네트워킹, 컴퓨트 및 기타 리소스를 생성할 영역입니다. 이 영역은 홈 영역이거나 다른 Oracle Cloud Infrastructure 영역일 수 있습니다.
    app_tag 리소스 이름에 사용할 접두어로, 각 리소스가 해당되는 애플리케이션을 나타냅니다. 모범 사례는 모든 소문자를 사용하는 것입니다.
    환경 리소스 이름에 사용할 접두어로, 각 리소스가 해당되는 환경 (개발, 테스트, 스테이징 또는 운영) 을 나타냅니다. 모범 사례는 모든 소문자를 사용하는 것입니다.
    vcn_cidr CIDR 형식의 VCN의 주소 범위입니다. 이 범위를 주의 깊게 계획합니다. 나중에 변경할 수 없습니다.
  6. 루트 디렉토리에 datasources.tf 라는 텍스트 파일을 생성하고 파일에 다음 코드를 붙여넣습니다.
    datasources.tf 의 코드는 지역 내 가용성 도메인의 수와 해당 이름을 결정합니다. 이 코드는 region 변수에 지정된 영역을 사용합니다.
    data "oci_identity_availability_domains" "ad" {
      compartment_id = "${var.tenancy_ocid}"
    }
    
    data "template_file" "ad_names" {
      count    = "${length(data.oci_identity_availability_domains.ad.availability_domains)}"
      template = "${lookup(data.oci_identity_availability_domains.ad.availability_domains[count.index], "name")}"
    }
  7. 루트 디렉토리에 provider.tf 라는 텍스트 파일을 생성하고 파일에 다음 코드를 붙여넣습니다.
    provider.tf 의 코드는 Terraform에서 사용할 제공자에 대한 매개변수를 정의합니다. 제공자는 Terraform 명령을 클라우드 서비스 제공자에 특정한 API 호출로 변환합니다.
    provider "oci" {
      alias                = "home"
      region               = "${var.home_region}"
      tenancy_ocid         = "${var.tenancy_ocid}"
      user_ocid            = "${var.user_ocid}"
      fingerprint          = "${var.fingerprint}"
      private_key_path     = "${var.private_key_path}"
      private_key_password = "${var.private_key_password}"
    }
    
    provider "oci" {
      region               = "${var.region}"
      tenancy_ocid         = "${var.tenancy_ocid}"
      user_ocid            = "${var.user_ocid}"
      fingerprint          = "${var.fingerprint}"
      private_key_path     = "${var.private_key_path}"
      private_key_password = "${var.private_key_password}"
    }
    이 예에서는 두 개의 제공자를 정의합니다. 두 제공자 모두 Oracle Cloud Infrastructure 용입니다. 첫번째 제공자는 Oracle Cloud Infrastructure Identity and Access Management 리소스를 생성하는 홈 영역에 대한 것입니다. 두번째 제공자는 네트워킹, 계산 및 기타 리소스를 생성할 영역에 사용됩니다.
  8. 루트 디렉토리에 root.tf 라는 텍스트 파일을 생성하고 파일에 다음 코드를 붙여넣습니다.
    이 코드는 Terraform이 실행해야 하는 모듈을 지정합니다. 이 제공자는 compartmentsiam 모듈에 대해 명시적으로 지정됩니다. 구획, 그룹 및 정책은 홈 영역에 생성되어야 하기 때문입니다.
    module "compartments" {
      source       = "./compartments"
      tenancy_ocid = "${var.tenancy_ocid}"
      app_tag      = "${var.app_tag}"
      environment  = "${var.environment}"
    
      providers = {
        oci = "oci.home"
      }
    }
    
    module "a_vcn" {
      source           = "./vcn"
      tenancy_ocid     = "${var.tenancy_ocid}"
      compartment_ocid = "${module.compartments.networks_id}"
      app_tag          = "${var.app_tag}"
      environment      = "${var.environment}"
      vcn_cidr         = "${var.vcn_cidr}"
    }
    
    module "iam" {
      source       = "./iam"
      tenancy_ocid = "${var.tenancy_ocid}"
      app_tag      = "${var.app_tag}"
      environment  = "${var.environment}"
    
      providers = {
        oci = "oci.home"
      }
    }
    app_tagenvironment 변수는 이름 지정 체계를 적용합니다. 이름 지정 체계를 사용할 필요는 없지만 가장 좋은 방법입니다.