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-80 | H100 80GB SXM × 1 | 단일 GPU |
G-NHHS-640 | H100 80GB SXM × 8 | 단일 노드 최대 |
G-NAHP-80 | A100 80GB PCIe × 1 | |
G-NAHP-320 | A100 80GB PCIe × 4 | |
G-NBTHS-180 | B200 180GB SXM × 1 | |
G-NBTHS-1440 | B200 180GB SXM × 8 | |
C-2–C-32 | CPU vCore (2/4/8/16/32) | 메모리 vCore × 2 |
M-2–M-16 | 메모리집약형 (2/4/8/16 vCore) | 메모리 vCore × 4 |
NPU(Rebellions ATOM·Furiosa) 코드명은 영업·지원팀 안내. 전체 목록은 포털 인프라 > 인스턴스 유형 또는 인스턴스 타입 가이드.
자주 발생하는 실수
| 증상 | 원인 / 해결 |
|---|---|
Provider produced inconsistent result | terraform refresh 후 재시도. 포털에서 외부 변경이 있었는지 확인 |
스팟 가상머신 생성 시 SPOT_ALWAYS_ON_NOT_ALLOWED | always_on = false로 변경 |
스팟 가상머신 생성 시 SPOT_DR_NOT_ALLOWED | dr = false로 변경 |
| 가상머신 삭제 시 NI 에러 | NI·블록 스토리지를 먼저 destroy 대상에 포함하거나 depends_on 의존 방향 확인 |
| 토큰 만료 | 포털 관리 > 사용자 액세스 토큰에서 재발급 후 환경 변수 갱신 |
| CIDR이 허용 대역 밖 | 172.16.0.0/14 또는 192.168.0.0/16 안에서만 지정 |