メインコンテンツまでスキップ

Terraform 치트시트

자주 쓰는 명령어

terraform init # provider 다운로드
terraform plan # 변경 사항 미리 보기
terraform apply # 적용
terraform apply -auto-approve # 확인 없이 적용
terraform destroy # 전체 삭제
terraform show # 현재 상태 확인
terraform output # output 값 확인
terraform fmt # HCL 포맷 정리
terraform validate # 구문·타입 검증

# 특정 자원만 재생성 (가상머신 회수 후 재할당 등)
terraform apply -replace="eci_virtual_machine_allocation.run"

# 특정 자원만 삭제 (가상머신 중지: 할당만 제거)
terraform destroy -target="eci_virtual_machine_allocation.run"

# state에서 자원 제거 (실제 자원은 유지)
terraform state rm eci_virtual_machine.vm

# 기존 자원 import (포털에서 만든 자원을 코드로 가져오기)
terraform import eci_virtual_machine.vm <UUID>

Provider 설정 (필수)

terraform {
required_version = ">= 1.0"
required_providers {
eci = {
source = "elice-dev/eci"
}
}
}

provider "eci" {
api_endpoint = "https://portal.elice.cloud/api"
api_access_token = var.api_access_token # TF_VAR_api_access_token 환경 변수
zone_id = var.zone_id
}

자주 쓰는 데이터 소스

# 인스턴스 타입
data "eci_instance_type" "h100_1" { name = "G-NHHS-80" }
data "eci_instance_type" "h100_8" { name = "G-NHHS-640" }
data "eci_instance_type" "cpu_8" { name = "C-8" }
data "eci_instance_type" "mem_8" { name = "M-8" }

# 가격 정책 (이름 + pricing_type)
data "eci_pricing" "vm_ondemand" { name = "G-NHHS-80", pricing_type = "ondemand" }
data "eci_pricing" "vm_spot" { name = "G-NHHS-80", pricing_type = "spot" }
data "eci_pricing" "vm_reserved" { name = "G-NHHS-80", pricing_type = "reserved" }
data "eci_pricing" "storage" { name = "Block Storage", pricing_type = "ondemand" }
data "eci_pricing" "public_ip" { name = "Public IP", pricing_type = "ondemand" }

# OS 이미지
data "eci_block_storage_image" "ubuntu" {
name = "Ubuntu 22.04 LTS (20250116)"
}

# 영역·리전
data "eci_zone" "primary" { name = "<zone-name>" }
data "eci_region" "main" { name = "central-01" }

자주 쓰는 자원

가상 네트워크 + 서브넷

resource "eci_virtual_network" "vnet" {
name = "prod-vnet"
network_cidr = "192.168.0.0/16" # 172.16.0.0/14 또는 192.168.0.0/16 범위만 허용
tags = { env = "prod" }
}

resource "eci_subnet" "subnet" {
attached_network_id = eci_virtual_network.vnet.id
name = "prod-subnet"
purpose = "virtual_machine"
network_gw = "192.168.0.1/24"
tags = { env = "prod" }
}

가상머신 (정의 + 할당)

# 1) 가상머신 정의
resource "eci_virtual_machine" "vm" {
name = "prod-vm-01"
instance_type_id = data.eci_instance_type.h100_1.id
pricing_id = data.eci_pricing.vm_ondemand.id
username = "elice"
password = var.vm_password
on_init_script = "#!/bin/bash\nset -e\n# init"
always_on = false # 스팟이면 반드시 false
dr = false # 스팟이면 반드시 false
tags = { env = "prod" }
}

# 2) 실행 (할당)
resource "eci_virtual_machine_allocation" "run" {
machine_id = eci_virtual_machine.vm.id
tags = { env = "prod" }
depends_on = [eci_block_storage.boot, eci_network_interface.ni]
}

블록 스토리지 (부팅 디스크 / 데이터 디스크 / 스냅샷 복원)

# 부팅 디스크 (image_id 지정)
resource "eci_block_storage" "boot" {
attached_machine_id = eci_virtual_machine.vm.id
name = "prod-vm-01-boot"
size_gib = 100
pricing_id = data.eci_pricing.storage.id
image_id = data.eci_block_storage_image.ubuntu.id
dr = false
tags = { env = "prod" }
}

# 데이터 디스크 (image_id·snapshot_id 모두 없음)
resource "eci_block_storage" "data" {
attached_machine_id = eci_virtual_machine.vm.id
name = "prod-vm-01-data"
size_gib = 500
pricing_id = data.eci_pricing.storage.id
dr = false
}

# 스냅샷에서 복원
resource "eci_block_storage" "from_snapshot" {
name = "restored-disk"
size_gib = 500
pricing_id = data.eci_pricing.storage.id
snapshot_id = "<snapshot-uuid>"
dr = false
}

# 스냅샷 생성
resource "eci_block_storage_snapshot" "snap" {
block_storage_id = eci_block_storage.data.id
name = "data-snap-2026-05"
dr = false
}

네트워크 인터페이스 + 공인 IP

resource "eci_network_interface" "ni" {
attached_subnet_id = eci_subnet.subnet.id
attached_machine_id = eci_virtual_machine.vm.id
name = "prod-vm-01-ni"
dr = false
}

resource "eci_public_ip" "ip" {
attached_network_interface_id = eci_network_interface.ni.id
pricing_id = data.eci_pricing.public_ip.id
dr = false # DDoS 옵션은 provider에서 별도 필드 확인
}

인스턴스 타입 코드명 참조

코드명디바이스비고
G-NHHS-80H100 80GB SXM × 1단일 GPU
G-NHHS-640H100 80GB SXM × 8단일 노드 최대
G-NAHP-80A100 80GB PCIe × 1
G-NAHP-320A100 80GB PCIe × 4
G-NBTHS-180B200 180GB SXM × 1
G-NBTHS-1440B200 180GB SXM × 8
C-2C-32CPU vCore (2/4/8/16/32)메모리 vCore × 2
M-2M-16메모리집약형 (2/4/8/16 vCore)메모리 vCore × 4

NPU(Rebellions ATOM·Furiosa) 코드명은 영업·지원팀 안내. 전체 목록은 포털 인프라 > 인스턴스 유형 또는 인스턴스 타입 가이드.


자주 발생하는 실수

증상원인 / 해결
Provider produced inconsistent resultterraform refresh 후 재시도. 포털에서 외부 변경이 있었는지 확인
스팟 가상머신 생성 시 SPOT_ALWAYS_ON_NOT_ALLOWEDalways_on = false로 변경
스팟 가상머신 생성 시 SPOT_DR_NOT_ALLOWEDdr = false로 변경
가상머신 삭제 시 NI 에러NI·블록 스토리지를 먼저 destroy 대상에 포함하거나 depends_on 의존 방향 확인
토큰 만료포털 관리 > 사용자 액세스 토큰에서 재발급 후 환경 변수 갱신
CIDR이 허용 대역 밖172.16.0.0/14 또는 192.168.0.0/16 안에서만 지정

참고 링크