Terraform으로 카카오클라우드 VM 생성
카카오클라우드에서 Terraform을 이용하면 다양한 클라우드 인프라 자원을 관리할 수 있습니다. 이번 튜토리얼에서는 Terraform을 이용하여 카카오클라우드 Virtual Machine 인스턴스를 생성, 수정, 마지막으로 삭제하는 과정을 안내합니다.
- 예상 소요 시간: 15분
- 사용자 환경
- 권장 운영 체제: MacOS, Ubuntu
- Region: kr-central-2
- Terraform 버전: 1.6.3
- 권장 운영 체제: MacOS, Ubuntu
Step 1. Terraform 설치하기
Terraform 설치와 관련한 자세한 내용은 Terraform 공식 가이드 문서를 참고하시기 바랍니다.
- Mac
- Linux(Ubuntu)
-
Homebrew 패키지 매니저를 이용하거나, Terraform 공식 사이트의 설치 가이드를 참고하여 Terraform을 설치합니다.
Terraform 설치brew install terraform
-
설치가 정상적으로 되었는지 아래 명령어를 통해 확인합니다.
Terraform 설치 확인terraform -version
# Terraform v1.3.2 ## ... -> 정상 설치 시 이와 같은 버전 정보를 확인할 수 있습니다.
-
아래 명령어를 이용하거나, Terraform 공식 사이트의 설치 가이드를 참고하여 Terraform을 설치합니다.
Terraform 설치apt-get update
apt-get install terraform -
설치가 정상적으로 되었는지 아래 명령어를 통해 확인합니다.
Terraform 설치 확인terraform -version
# Terraform v1.3.3 ## ... -> 정상 설치 시 이와 같은 버전 정보를 확인할 수 있습니다.
Step 2. Terraform 변수 파일 작성하기
Terraform에서 정의하는 변수에 값을 입력하기 위해 terraform.tfvars
파일을 생성합니다.
인증 단계에서는 카카오클라우드 액세스 키 ID 및 보안 액세스 키(Credentia)가 필요하므로 반드시 따로 보관해 둡니다.
-
사용자 로컬 환경에 작업을 진행할 디렉터리를 생성합니다.
작업 디렉터리 생성mkdir -p ~/Downloads/kc-hands-on-terraform/simple
cd ~/Downloads/kc-hands-on-terraform/simple -
카카오클라우드에 자원 생성을 요청하기 위해서는 자원을 생성할 리전 및 인증키 등의 추가적인 정보가 필요합니다. 아래 예제를 참고하여
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 사양을 참고합니다.
-
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 -
리소스 생성에 필요한 변수를 정의하기 위해
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 -
필요한 클라우드 데이터를 내용에 맞게
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 -
미리 정의한 변수 및 데이터 정보에 맞게 리소스를 설정하고 생성할 수 있도록
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 -
생성할 인스턴스의 정보를
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 -
작업 디렉터리에서 작성한 코드 파일이 모두 포함되어 있는지 확인합니다.
코드 확인ls ~/Downloads/kc-hands-on-terraform/simple
## data.tf instance.tf require.tf resources.tf terraform.tfvars variables.tf
Step 4. Terraform 활용하기
Terraform를 활용해 실행 계획을 클라우드에 적용하는 방법은 다음과 같습니다.
-
현재 작업 디렉터리를 초기 설정합니다.
디렉터리 초기 설정terraform init
-
아래 명령어를 통해 실행 계획을 만듭니다. 인프라에 적용할 변경 사항을 미리 확인할 수 있습니다.
실행 계획 작성terraform plan
-
실행 계획을 클라우드에 적용합니다.
클라우드에 적용terraform apply
Step 5. 콘솔에서 생성된 리소스 확인하기
-
카카오클라우드 콘솔 > Virtual Machine을 선택합니다.
-
인스턴스가 잘 생성되었다면 Instance > 인스턴스 목록에서 확인할 수 있습니다.
-
실습 후에는 아래 명령어를 이용하여 생성된 리소스를 제거합니다.
리소스 제거terraform destroy