OCI Always Free VM 자동 생성 스크립트: 가입부터 CLI 설치, 재시도까지


"Out of host capacity"와의 전쟁
Oracle Cloud(OCI)의 Always Free Tier는 숫자만 보면 믿기 어렵습니다. ARM VM 4 OCPU, 24GB RAM, 200GB 스토리지가 무료.
AWS Free Tier : 1 vCPU / 1GB / 30GB → 12개월 한정 GCP Free Tier : 0.25 vCPU / 1GB / 30GB → 상시 OCI Free Tier : 4 OCPU / 24GB / 200GB → 상시 (!)
문제는 이 좋은 걸 만들 수가 없다는 겁니다. VM 생성 버튼을 누르면 높은 확률로 이 메시지를 보게 됩니다.
Out of host capacity. The host doesn't have enough capacity for the requested shape.
무료 리소스는 데이터센터에 서버 여유가 있을 때만 배정되거든요. 인기 리전일수록 자리가 없고, 있어도 금방 찹니다. 웹 콘솔에서 수동으로 반복 시도하다 포기하는 사람이 대부분이고요.
그래서 자동 재시도 스크립트를 만들었습니다. 60초마다 VM 생성을 시도하고, 성공하면 알림을 보내고 멈춥니다. 켜놓고 자면 아침에 서버가 만들어져 있는 식입니다.
Oracle Cloud 가입부터 OCI CLI 설치, 스크립트 실행까지 전 과정을 윈도우/맥 사용자 모두 따라할 수 있게 정리했습니다.
1단계: Oracle Cloud 가입
가입 전 준비물
| 항목 | 비고 |
|---|---|
| 이메일 | Gmail, 회사 메일 등 (1 계정당 1 테넌시) |
| 신용카드 | 본인 인증용, Free Tier만 쓰면 과금 없음 |
| 휴대폰 | SMS 인증 |
가입 절차
- cloud.oracle.com 접속 → Sign Up for Free 클릭
- 이메일 입력 → 인증 메일 확인
- 개인 정보 입력
- Cloud Account Name: 테넌시 이름 (영문, 나중에 변경 불가)
- Home Region: AP Chuncheon (한국 춘천) 선택 - 신용카드 등록 (본인 인증용, $1 임시 결제 후 취소됨)
- 가입 완료 → 이메일로 테넌시 활성화 알림 (보통 수 분)
Home Region 선택이 중요한 이유
┌─────────────────────────────────────────────────┐ │ Home Region = Always Free 리소스가 할당되는 곳 │ │ │ │ 가입 후 변경 불가! │ │ 서울 리전(Seoul)은 인기가 많아 capacity 부족이 심함 │ │ 춘천(Chuncheon)이 상대적으로 여유 있음 │ └─────────────────────────────────────────────────┘
한국에서 서비스할 거라면 AP Chuncheon을 추천합니다. 서울-춘천은 ~80km라 레이턴시 차이가 1-2ms 수준인데, 춘천 리전이 서울보다 VM을 잡기 훨씬 수월합니다.
주의: Home Region은 가입 후 변경이 안 됩니다. 나중에 후회하지 않게 신중하게 고르세요.
2단계: OCI CLI 설치
OCI CLI는 터미널에서 Oracle Cloud를 조작하는 도구입니다. 웹 콘솔에서도 VM을 만들 수 있긴 한데, 자동 재시도 스크립트를 돌리려면 CLI가 필요합니다.
macOS
# Homebrew로 설치 (가장 간단) brew install oci-cli # 또는 공식 설치 스크립트 bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"
설치 확인:
oci --version # 출력 예: 3.x.x
Windows
방법 1: PowerShell 설치 스크립트 (추천)
PowerShell을 관리자 권한으로 열고:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser Invoke-WebRequest https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.ps1 -OutFile install.ps1 .\install.ps1 -AcceptAllDefaults
설치가 끝나면 새 터미널을 열고 확인:
oci --version
방법 2: WSL (Windows Subsystem for Linux)
WSL을 쓰고 있다면 macOS와 같은 방법으로 설치하면 됩니다:
bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"
Windows 사용자라면: 재시도 스크립트가 bash 기반이라 WSL에서 돌리는 게 제일 편합니다. WSL이 없으면 Git Bash에서도 됩니다.
3단계: OCI CLI 초기 설정
CLI를 설치했으면 Oracle Cloud 계정과 연결해야 합니다. 아래 명령을 실행하면 필요한 값들을 하나씩 물어봅니다.
oci setup config
┌────────────────────────────────────────────────────┐ │ oci setup config 에서 물어보는 것들 │ ├─────────────────────┬──────────────────────────────┤ │ 항목 │ 어디서 찾나 │ ├─────────────────────┼──────────────────────────────┤ │ User OCID │ OCI 콘솔 → 우측상단얼굴아이콘 → 내 email 선택 │ │ Tenancy OCID │ OCI 콘솔 → 우측상단얼굴아이콘 → Tenancy:아이디 선택 │ │ Region │ ap-chuncheon-1 │ │ API Signing Key │ 자동 생성 (Enter 입력) │ └─────────────────────┴──────────────────────────────┘
User OCID 찾기
- cloud.oracle.com 로그인
- 우측 상단 프로필 아이콘 → 내 email 선택
- OCID 항목의 Copy 클릭
ocid1.user.oc1..aaaaaaaxxxxxxxxxxxxxxxxxxxxx
Tenancy OCID 찾기
- CI 콘솔 → 우측상단얼굴아이콘 → Tenancy:아이디 선택
- OCID 항목의 Copy 클릭
ocid1.tenancy.oc1..aaaaaaaxxxxxxxxxxxxxxxxxxxxx
API Key 등록
oci setup config이 끝나면 ~/.oci/oci_api_key_public.pem 파일이 생깁니다. 이 공개키를 OCI에 등록해야 합니다.
cat ~/.oci/oci_api_key_public.pem
출력된 내용을 복사하고:
- OCI 콘솔 →우측 상단 프로필 아이콘 → 내 email 선택 → Tokens and Keys 탭 선택 → API Keys → Add API Key
- Paste Public Key 선택 → 붙여넣기 → Add
설정 확인
oci iam region list --output table
리전 목록이 쭉 나오면 성공입니다. 에러가 뜨면 ~/.oci/config 파일의 값들을 하나씩 확인해보세요.
여기에서부터는 claude code같은 ai를 사용하는 방법과 수작업으로 하는 방법이 나뉩니다.
claude code를 사용하고 있다면 다음과 같이 프롬프트를 작성합니다.
oracle oci cli 도구가 설치되어 있습니다. 나는 춘천 리전을 이용하고 있습니다. 춘천 리전에서 다음과 같은 사양의 vm을 생성하도록 하는 스크립트를 생성해주세요. 1분마다 재시도를 합니다. 서버가 생성이 완료되면 종료됩니다. OCI A1.Flex VM 생성 자동 재시도 스크립트 (Always Free Tier) - 4 OCPU / 24GB RAM / 200GB Boot Volume (무료)
이와 같이 명령을 하면 opus 4.6 의 경우 약간의 시간이 지난 후 스크립트를 자동으로 생성해줍니다. 만약 claude code같은 ai도구를 사용하지 않는다면 다음 단계를 거치면서 직접 스크립트를 생성해야 합니다.
4단계: VM 생성에 필요한 정보 수집
스크립트를 실행하려면 OCI 콘솔에서 몇 가지 ID를 모아야 합니다. 좀 번거롭지만 한 번만 하면 됩니다.
4-1. VCN(가상 네트워크) 생성
VM이 들어갈 네트워크가 먼저 있어야 합니다.
- OCI 콘솔 → Networking → Virtual Cloud Networks
- Start VCN Wizard → Create VCN with Internet Connectivity
- VCN 이름 입력 (예:
my-vcn) → Next → Create
생성된 VCN 안에 public subnet이 자동으로 만들어집니다.
4-2. Subnet OCID 확인
- 생성된 VCN 클릭 → Subnets 목록
- Public Subnet 클릭 → OCID 복사
ocid1.subnet.oc1.ap-chuncheon-1.aaaaaaa...
4-3. Image OCID 확인
VM에 깔 OS 이미지 ID를 찾아야 합니다.
- Compute → Instances → Create Instance
- Image and shape 섹션 → Change image
- Ubuntu → Canonical Ubuntu 24.04 (aarch64) 선택
- 이미지 OCID 복사 (또는 CLI로 조회)
CLI로 찾는 방법:
oci compute image list \ --compartment-id <TENANCY_OCID> \ --operating-system "Canonical Ubuntu" \ --shape "VM.Standard.A1.Flex" \ --sort-by TIMECREATED \ --sort-order DESC \ --output table \ --query "data[?contains(\"display-name\", '24.04')].[\"display-name\",id]"
4-4. Availability Domain 확인
oci iam availability-domain list --output table
출력 예: +---+-----------------------------------+ | # | name | +---+-----------------------------------+ | 1 | mToc:AP-CHUNCHEON-1-AD-1 | +---+-----------------------------------+
4-5. SSH 키 준비
VM에 접속할 SSH 키가 없으면 생성합니다.
# macOS / Linux / WSL ssh-keygen -t ed25519 -f ~/.ssh/oci_vm -C "oci-vm"
# Windows (PowerShell) ssh-keygen -t ed25519 -f $HOME\.ssh\oci_vm -C "oci-vm"
수집한 정보 정리
┌─────────────────────┬────────────────────────────────┐ │ 항목 │ 값 (예시) │ ├─────────────────────┼────────────────────────────────┤ │ TENANCY_OCID │ ocid1.tenancy.oc1..aaaa... │ │ SUBNET_ID │ ocid1.subnet.oc1.ap-chun... │ │ IMAGE_ID │ ocid1.image.oc1.ap-chun... │ │ AD │ mToc:AP-CHUNCHEON-1-AD-1 │ │ SSH_KEY_FILE │ ~/.ssh/oci_vm.pub │ └─────────────────────┴────────────────────────────────┘
5단계: 자동 재시도 스크립트
여기까지 했으면 준비 끝입니다. 스크립트를 봅시다.
스크립트 전문
#!/bin/bash # OCI A1.Flex VM 생성 자동 재시도 스크립트 (Always Free Tier) # - 4 OCPU / 24GB RAM / 200GB Boot Volume (무료) # 사용법: ./oci-create-vm-free-retry.sh # 중지: Ctrl+C 또는 kill $(cat /tmp/oci-free-retry.pid) TENANCY_OCID="여기에_테넌시_OCID" AD="mToc:AP-CHUNCHEON-1-AD-1" SUBNET_ID="여기에_서브넷_OCID" IMAGE_ID="여기에_이미지_OCID" SSH_KEY_FILE="$HOME/.ssh/oci_vm.pub" INTERVAL=60 # 재시도 간격 (초) LOG_FILE="/tmp/oci-free-retry.log" PID_FILE="/tmp/oci-free-retry.pid" echo $$ > "$PID_FILE" echo "=== OCI VM 생성 재시도 시작 (Free Tier: 4 OCPU / 24GB) ===" echo "PID: $$" echo "로그: $LOG_FILE" echo "중지: Ctrl+C 또는 kill \$(cat $PID_FILE)" echo "" attempt=0 while true; do attempt=$((attempt + 1)) timestamp=$(date '+%Y-%m-%d %H:%M:%S') echo "[$timestamp] 시도 #$attempt ..." | tee -a "$LOG_FILE" result=$(oci compute instance launch \ --compartment-id "$TENANCY_OCID" \ --availability-domain "$AD" \ --display-name "my-free-vm" \ --shape "VM.Standard.A1.Flex" \ --shape-config '{"ocpus":4,"memoryInGBs":24}' \ --image-id "$IMAGE_ID" \ --subnet-id "$SUBNET_ID" \ --assign-public-ip true \ --ssh-authorized-keys-file "$SSH_KEY_FILE" \ --boot-volume-size-in-gbs 200 \ --output json 2>&1) if echo "$result" | grep -q '"lifecycle-state"'; then echo "" | tee -a "$LOG_FILE" echo "============================================" | tee -a "$LOG_FILE" echo "[$timestamp] VM 생성 성공! (Free Tier)" | tee -a "$LOG_FILE" echo "============================================" | tee -a "$LOG_FILE" echo "$result" | tee -a "$LOG_FILE" # macOS 알림 osascript -e 'display notification "OCI Free Tier VM 생성 성공!" with title "OCI VM" sound name "Glass"' 2>/dev/null # 터미널 벨 echo -e '\a' rm -f "$PID_FILE" exit 0 else echo "[$timestamp] 실패: Out of host capacity. ${INTERVAL}초 후 재시도..." | tee -a "$LOG_FILE" fi sleep "$INTERVAL" done
스크립트 동작 흐름
시작 │ ▼ 60초마다 oci compute instance launch 실행 │ ├── 성공 (lifecycle-state 존재) │ │ │ ├── 로그에 기록 │ ├── macOS 알림 (맥 사용자) │ ├── 터미널 벨 소리 │ └── 스크립트 종료 │ └── 실패 (Out of host capacity) │ └── 60초 대기 → 다시 시도
핵심 파라미터 설명
| 파라미터 | 값 | 설명 |
|---|---|---|
--shape | VM.Standard.A1.Flex | ARM 기반 유연한 VM |
--shape-config | ocpus:4, memoryInGBs:24 | Free Tier 최대치 |
--boot-volume-size-in-gbs | 200 | Free Tier 스토리지 한도 |
--assign-public-ip | true | 외부 접속용 공인 IP |
INTERVAL | 60 | 재시도 간격 (초) |
Free Tier 한도: 4 OCPU + 24GB RAM + 200GB Boot Volume. 이 수치를 넘기면 과금되니 주의하세요. 스크립트는 딱 이 한도에 맞춰져 있습니다.
6단계: 실행하기
macOS / Linux
# 1. 스크립트 생성 vi oci-create-vm-free-retry.sh # (위 스크립트 내용을 붙여넣고 OCID 값들을 교체) # 2. 실행 권한 부여 chmod +x oci-create-vm-free-retry.sh # 3. 실행 ./oci-create-vm-free-retry.sh
백그라운드로 돌리고 싶다면:
# 백그라운드 실행 (터미널 닫아도 계속 돌아감) nohup ./oci-create-vm-free-retry.sh & # 로그 실시간 확인 tail -f /tmp/oci-free-retry.log # 중지 kill $(cat /tmp/oci-free-retry.pid)
Windows (WSL / Git Bash)
# WSL 또는 Git Bash에서 동일하게 실행 chmod +x oci-create-vm-free-retry.sh ./oci-create-vm-free-retry.sh
Windows (PowerShell 네이티브)
WSL도 Git Bash도 없는 환경이라면, PowerShell로도 같은 일을 할 수 있습니다.
# oci-create-vm-free-retry.ps1 $TENANCY_OCID = "여기에_테넌시_OCID" $AD = "mToc:AP-CHUNCHEON-1-AD-1" $SUBNET_ID = "여기에_서브넷_OCID" $IMAGE_ID = "여기에_이미지_OCID" $SSH_KEY_FILE = "$HOME\.ssh\oci_vm.pub" $INTERVAL = 60 $attempt = 0 Write-Host "=== OCI VM 생성 재시도 시작 (Free Tier: 4 OCPU / 24GB) ===" Write-Host "중지: Ctrl+C" while ($true) { $attempt++ $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" Write-Host "[$timestamp] 시도 #$attempt ..." $result = oci compute instance launch ` --compartment-id $TENANCY_OCID ` --availability-domain $AD ` --display-name "my-free-vm" ` --shape "VM.Standard.A1.Flex" ` --shape-config '{\"ocpus\":4,\"memoryInGBs\":24}' ` --image-id $IMAGE_ID ` --subnet-id $SUBNET_ID ` --assign-public-ip true ` --ssh-authorized-keys-file $SSH_KEY_FILE ` --boot-volume-size-in-gbs 200 ` --output json 2>&1 if ($result -match "lifecycle-state") { Write-Host "" Write-Host "============================================" Write-Host "[$timestamp] VM 생성 성공!" Write-Host "============================================" Write-Host $result # Windows 알림 [System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') | Out-Null [System.Windows.Forms.MessageBox]::Show('OCI Free Tier VM 생성 성공!', 'OCI VM') break } else { Write-Host "[$timestamp] 실패: Out of host capacity. ${INTERVAL}초 후 재시도..." } Start-Sleep -Seconds $INTERVAL }
# 실행 .\oci-create-vm-free-retry.ps1
성공 후 확인
스크립트가 성공하면 JSON 결과가 쏟아져 나옵니다. 여기서 공인 IP를 꺼내야 합니다.
# 공인 IP 확인 oci compute instance list-vnics \ --instance-id <출력된_INSTANCE_ID> \ --query 'data[0]."public-ip"' \ --raw-output
SSH 접속:
ssh -i ~/.ssh/oci_vm ubuntu@<공인IP>
접속되면 진짜 4 OCPU / 24GB가 맞는지 확인해봅시다.
# CPU 확인 (4 OCPU = 4코어) nproc # 출력: 4 # 메모리 확인 (24GB) free -h # 출력: Mem: 23Gi # 디스크 확인 (200GB) df -h / # 출력: /dev/sda1 194G
트러블슈팅
자주 만나는 에러들
| 에러 | 원인 | 해결 |
|---|---|---|
Out of host capacity | 서버 자리 없음 | 스크립트가 알아서 재시도. 시간대를 바꿔보세요 (새벽/오전이 유리) |
NotAuthorizedOrNotFound | OCID가 잘못됨 | Tenancy, Subnet, Image OCID 재확인 |
LimitExceeded | Free Tier 한도 초과 | 기존 VM이 있는지 확인. Free Tier는 4 OCPU 총합 |
InvalidParameter: shape-config | JSON 형식 에러 | Windows에서 따옴표 이스케이프 확인 |
oci: command not found | CLI 미설치 or PATH 미등록 | 터미널 재시작 or PATH에 oci 경로 추가 |
"몇 시간째 안 되는데요"
정상입니다. 놀라지 마세요. 인기 리전에서는 며칠이 걸리기도 합니다. 한달동안 안된 분도 있었습니다. 그런데, 전 PAYG로 전환신청을 한 후 (PAYG도 바로 전환되는게 아닙니다. 며칠이 걸릴 수도 있어요) 전환되는 기간동안 돌리자 하고 돌렸는데 생성되었어요.
성공 확률을 높이는 팁: ┌──────────────────────────────────────────────┐ │ 1. 시간대: 한국 기준 새벽~오전이 유리 │ │ 2. 간격: INTERVAL을 30초로 줄여보기 │ │ 3. 리전: 춘천이 서울보다 여유 있음 │ │ 4. 웹 콘솔 병행: CLI와 웹 콘솔 동시 시도 │ │ 5. 인내: 1~3일 돌려두면 대부분 성공 │ └──────────────────────────────────────────────┘
PAYG로 전환하면 더 쉬워지나?
네, 많이 다릅니다. Pay As You Go로 업그레이드하면 capacity 부족이 확 줄어듭니다. 무료 할당분(4 OCPU/24GB)은 그대로 무료이고, 넘는 분만 과금되고요. PAYG 전환 자체에는 비용이 없습니다.
Free Tier: 생성 성공까지 수 시간~수 일 PAYG 전환 후: 대부분 즉시 또는 몇 번 안에 성공
단, PAYG로 전환한 뒤에도 Free Tier 한도(4 OCPU/24GB/200GB) 안에서만 쓰면 과금은 $0입니다.
마무리
여기까지의 전체 흐름입니다.
Oracle Cloud 가입 (Home Region: 춘천) │ ▼ OCI CLI 설치 (brew / PowerShell / WSL) │ ▼ oci setup config (API Key 등록) │ ▼ VCN + Subnet 생성 → OCID 수집 │ ▼ 스크립트에 OCID 값 입력 │ ▼ ./oci-create-vm-free-retry.sh 실행 │ ▼ (60초마다 재시도... 커피 마시며 대기) │ ▼ VM 생성 성공! → SSH 접속 → 서버 세팅 시작
이 스크립트를 만든 건 GCP에서 OCI로 서버를 이전할 때였습니다. "Out of host capacity" 때문에 웹 콘솔에서 수십 번 수동 클릭을 하다가, "이걸 왜 손으로 하고 있지?" 싶어서 자동화했습니다.
CLI 스크립트의 좋은 점은 재현이 된다는 겁니다. OCID를 한 번 채워두면 VM을 날려도 같은 스펙으로 바로 다시 만들 수 있습니다. Infrastructure as Code의 가장 단순한 형태라고 할 수 있겠죠.
4 OCPU ARM VM이 무료라는 건 사이드 프로젝트 입장에서는 거절할 이유가 없는 조건입니다. Docker 컨테이너 4-5개를 돌려도 메모리가 남아돌거든요. 처음 만드는 과정만 좀 번거로울 뿐, 한 번 성공하면 그 뒤로는 편합니다.






댓글
댓글을 작성하려면 이 필요합니다.