Skip to main content

Terraform으로 카카오클라우드 VM 생성

카카오클라우드에서 Terraform을 이용하면 다양한 클라우드 인프라 자원을 관리할 수 있습니다. 이번 튜토리얼에서는 Terraform을 이용하여 카카오클라우드 Virtual Machine 인스턴스를 생성, 수정, 마지막으로 삭제하는 과정을 안내합니다.

안내
  • 예상 소요 시간: 15분
  • 사용자 환경
    • 권장 운영 체제: MacOS, Ubuntu
    • Region: kr-central-2
    • Terraform 버전: 1.6.3

Step 1. Terraform 설치하기

Terraform 설치와 관련한 자세한 내용은 Terraform 공식 가이드 문서를 참고하시기 바랍니다.

  1. Homebrew 패키지 매니저를 이용하거나, Terraform 공식 사이트의 설치 가이드를 참고하여 Terraform을 설치합니다.

    Terraform 설치
    brew install terraform
  2. 설치가 정상적으로 되었는지 아래 명령어를 통해 확인합니다.

    Terraform 설치 확인
    terraform -version
    # Terraform v1.3.2 ## ... -> 정상 설치 시 이와 같은 버전 정보를 확인할 수 있습니다.

Step 2. Terraform 변수 파일 작성하기

Terraform에서 정의하는 변수에 값을 입력하기 위해 terraform.tfvars 파일을 생성합니다.
인증 단계에서는 카카오클라우드 액세스 키 ID 및 보안 액세스 키(Credentia)가 필요하므로 반드시 따로 보관해 둡니다.

  1. 사용자 로컬 환경에 작업을 진행할 디렉터리를 생성합니다.

    작업 디렉터리 생성
    mkdir -p ~/Downloads/kc-hands-on-terraform/simple
    cd ~/Downloads/kc-hands-on-terraform/simple
  2. 카카오클라우드에 자원 생성을 요청하기 위해서는 자원을 생성할 리전 및 인증키 등의 추가적인 정보가 필요합니다. 아래 예제를 참고하여 terraform.tfvars 파일에 값을 추가합니다. {Subnet CIDR}은 IP CIDR 블록이며, 카카오클라우드 콘솔 > VPC > Subnet에서 사용할 수 있는 Subnet을 확인할 수 있습니다.

    cat << EOF > ~/Downloads/kc-hands-on-terraform/simple/terraform.tfvars

    kc_region = "kr-central-2"
    kc_availability_zone = "${AVAILABILITY_ZONE}"
    kc_auth_url = "https://iam.kakaocloud.com/identity/v3"
    kc_application_credential_id = "${ACCESS_KEY}"
    kc_application_credential_secret = "${SECRET_ACCESS_KEY}"

    # 아래 vm_network_cidr은 인스턴스를 생성할 Subnet의 CIDR 값을 입력합니다.
    vm_network_cidr = "${SUBNET_CIDR}"
    instance_name = "${INSTANCE_NAME}"
    instance_flavor = "${INSTANCE_TYPE}"
    instance_count = "${INSTANCE_QUANTITY}"
    vm_image = "${INSTANCE_IMAGE}"
    instance_keypair = "${INSTANCE_KEYPAIR}"
    EOF
    환경변수설명
    AVAILABILITY_ZONE🖌가용영역 이름 #예시: kr-central-2-a
    ACCESS_KEY🖌사용자 액세스 키
    SECRET_ACCESS_KEY🖌사용자 보안 키
    SUBNET_CIDR🖌서브넷의 CIDR 정보 #예시: 10.0.0.0/20
    INSTANCE_NAME🖌사용할 인스턴스 이름 #예시: handson-instance
    INSTANCE_TYPE🖌사용할 인스턴스 타입 #예시: m2a.large
    INSTANCE_QUANTITY🖌생성할 인스턴스 갯수 #예시: 1
    INSTANCE_IMAGE🖌 사용할 인스턴스 이미지 #예시: Ubuntu 20.04 - 5.4.0-173
    INSTANCE_KEYPAIR🖌 인스턴스에 사용할 키페어 이름 #예시: kc-keypair

Step 3. 생성할 클라우드 리소스 정의하기

카카오클라우드의 IaaS 리소스를 정의 및 작성하기 위해 OpenStack Provider 사양을 참고합니다.

  1. Terraform을 이용하여 OpenStack Provider IaaS 리소스를 관리하기 위한 정보를 require.tf 파일에 작성합니다. Terraform의 버전 및 필요한 공급자로 OpenStack을 설정하고, 환경 설정에 필요한 다양한 변수를 정의합니다.

    필요 정보 작성
    cat << EOF > ~/Downloads/kc-hands-on-terraform/simple/require.tf

    terraform {
    required_version = ">= 1.0"
    required_providers {
    openstack = {
    source = "terraform-provider-openstack/openstack"
    version = ">= 1.40.0"
    }
    }
    }

    variable "kc_region" {}
    variable "kc_availability_zone" {}
    variable "kc_auth_url" {}
    variable "kc_application_credential_id" {}
    variable "kc_application_credential_secret" {}

    # provider 설정
    provider "openstack" {
    auth_url = var.kc_auth_url
    application_credential_id = var.kc_application_credential_id
    application_credential_secret = var.kc_application_credential_secret
    region = var.kc_region
    }

    EOF
  2. 리소스 생성에 필요한 변수를 정의하기 위해 variables.tf 파일을 작성합니다.

    변수 정의
    cat << EOF > ~/Downloads/kc-hands-on-terraform/simple/variables.tf

    #terraform.tfvars
    variable "vm_image" {
    type = string
    }

    variable "vm_network_cidr" {
    type = string
    }

    #terraform.tfvars
    variable "instance_name" {
    type = string
    }

    #terraform.tfvars
    variable "instance_count" {
    type = number
    }

    #terraform.tfvars
    variable "instance_flavor" {
    type = string
    }

    variable "instance_keypair" {
    type = string
    }

    EOF
  3. 필요한 클라우드 데이터를 내용에 맞게 data.tf 파일에 작성합니다. 작성한 정보는 클라우드 데이터를 참조하여 반영합니다.

    데이터 작성
    cat << EOF > ~/Downloads/kc-hands-on-terraform/simple/data.tf

    ## Instance Image ##
    data "openstack_images_image_v2" "vm_image" {
    name = var.vm_image
    most_recent = true
    }

    ## Network ##
    data "openstack_networking_network_v2" "vm_network" {
    matching_subnet_cidr = data.openstack_networking_subnet_v2.vm_subnet.cidr
    }

    data "openstack_networking_subnet_v2" "vm_subnet" {
    cidr = var.vm_network_cidr
    }

    data "openstack_networking_network_v2" "floating_network" {
    external = true
    }

    EOF
  4. 미리 정의한 변수 및 데이터 정보에 맞게 리소스를 설정하고 생성할 수 있도록 resources.tf을 작성합니다.

    리소스 작성
    cat << EOF > ~/Downloads/kc-hands-on-terraform/simple/resources.tf

    ## Port ##
    resource "openstack_networking_port_v2" "instance" {
    count = var.instance_count
    name = var.instance_name
    network_id = data.openstack_networking_network_v2.vm_network.id
    admin_state_up = true
    security_group_ids = [openstack_networking_secgroup_v2.instance.id]
    }

    resource "openstack_networking_floatingip_v2" "instance_fip" {
    count = var.instance_count
    pool = data.openstack_networking_network_v2.floating_network.name
    }

    resource "openstack_networking_floatingip_associate_v2" "instance_fip_associate" {
    count = var.instance_count
    floating_ip = openstack_networking_floatingip_v2.instance_fip[count.index].address
    port_id = openstack_networking_port_v2.instance[count.index].id
    }

    ## Security Group ##
    resource "openstack_networking_secgroup_v2" "instance" {
    name = var.instance_name
    description = "description"
    }

    resource "openstack_networking_secgroup_rule_v2" "instance_ingress_rules" {
    direction = "ingress"
    ethertype = "IPv4"
    protocol = "tcp"
    port_range_min = 22
    port_range_max = 22
    security_group_id = openstack_networking_secgroup_v2.instance.id
    }

    EOF

  5. 생성할 인스턴스의 정보를 instance.tf 파일에 작성합니다.

    정보 설정
    cat << EOF > ~/Downloads/kc-hands-on-terraform/simple/instance.tf

    resource "openstack_compute_instance_v2" "instance" {
    count = var.instance_count
    name = var.instance_name
    flavor_name = var.instance_flavor
    availability_zone = var.kc_availability_zone
    key_pair = var.instance_keypair

    block_device {
    uuid = data.openstack_images_image_v2.vm_image.id
    source_type = "image"
    volume_size = 50
    boot_index = 0
    destination_type = "volume"
    delete_on_termination = true
    }

    network {
    port = openstack_networking_port_v2.instance[count.index].id
    }
    }

    EOF
  6. 작업 디렉터리에서 작성한 코드 파일이 모두 포함되어 있는지 확인합니다.

    코드 확인
    ls ~/Downloads/kc-hands-on-terraform/simple
    ## data.tf instance.tf require.tf resources.tf terraform.tfvars variables.tf

Step 4. Terraform 활용하기

Terraform를 활용해 실행 계획을 클라우드에 적용하는 방법은 다음과 같습니다.

  1. 현재 작업 디렉터리를 초기 설정합니다.

    디렉터리 초기 설정
    terraform init
  2. 아래 명령어를 통해 실행 계획을 만듭니다. 인프라에 적용할 변경 사항을 미리 확인할 수 있습니다.

    실행 계획 작성
    terraform plan
  3. 실행 계획을 클라우드에 적용합니다.

    클라우드에 적용
    terraform apply

Step 5. 콘솔에서 생성된 리소스 확인하기

  1. 카카오클라우드 콘솔 > Virtual Machine을 선택합니다.

  2. 인스턴스가 잘 생성되었다면 Instance > 인스턴스 목록에서 확인할 수 있습니다.

  3. 실습 후에는 아래 명령어를 이용하여 생성된 리소스를 제거합니다.

    리소스 제거
    terraform destroy