OCI 무료 A1 인스턴스, "Out of host capacity" 우회하여 자동 생성하기

들어가며

Oracle Cloud Infrastructure(OCI)는 Always Free Tier로 ARM 기반 A1 인스턴스를 무료로 제공합니다. 4 OCPU, 24GB RAM이라는 파격적인 사양이지만, 문제는 인스턴스를 만들려고 하면 높은 확률로 이런 에러를 만나게 된다는 것입니다.

Out of host capacity

무료 리소스를 사용하려는 사람이 너무 많아서, 해당 리전에 여유 자원이 없다는 뜻입니다. 수동으로 반복 시도할 수도 있지만, 언제 자리가 날지 알 수 없기 때문에 현실적이지 않습니다.

이 글에서는 1분마다 자동으로 인스턴스 생성을 시도하는 스크립트를 설정하여, 자리가 나는 즉시 인스턴스를 확보하는 방법을 소개합니다. 실제로 이 방법으로 춘천 리전에서 A1 인스턴스를 성공적으로 생성했습니다.

참고 스크립트: https://github.com/nahyeongjin1/oci-instance-creator


준비물


Step 1: OCI 콘솔에서 필요한 정보 수집

OCI 콘솔(https://cloud.oracle.com/)에 로그인하여 다음 6가지 정보를 수집합니다.

1-1. API Key 생성

OCI 콘솔 → 우측 상단 프로필 아이콘 → User SettingsAPI keysAdd API keyGenerate API key pairDownload private key (.pem 파일 저장) → Add

추가 완료 후 표시되는 Configuration file preview의 내용을 복사해둡니다.

[DEFAULT]
user=ocid1.user.oc1..xxxxxxxxxx
fingerprint=aa:bb:cc:dd:ee:ff:...
tenancy=ocid1.tenancy.oc1..xxxxxxxxxx
region=ap-chuncheon-1
key_file=<path to your private keyfile>

1-2. Subnet OCID

Networking → Virtual Cloud Networks → VCN 선택 → Subnets → Public Subnet 클릭 → OCID 복사

VCN이 없는 경우 Start VCN Wizard로 생성하면 Public Subnet이 자동으로 만들어집니다.

1-3. Availability Domain

Compute → Instances → Create instance 클릭 → Placement 섹션에 표시되는 AD 이름을 확인합니다. 예: tMfv:AP-CHUNCHEON-1-AD-1

1-4. Image OCID

설치할 OS의 이미지 OCID는 Oracle 공식 문서에서 확인합니다.

해당 페이지에서 본인 리전의 OCID를 복사합니다.

수집 정보 체크리스트

항목 예시
User OCID ocid1.user.oc1..xxxxx
Fingerprint 0d:6b:d5:b6:...
Tenancy OCID ocid1.tenancy.oc1..xxxxx
Region ap-chuncheon-1
Subnet OCID ocid1.subnet.oc1.ap-chuncheon-1..xxxxx
Availability Domain tMfv:AP-CHUNCHEON-1-AD-1
Image OCID ocid1.image.oc1.ap-chuncheon-1..xxxxx
Private Key 파일 다운로드한 .pem 파일

Step 2: 작업 환경 준비 (Windows의 경우)

Windows에서는 WSL(Windows Subsystem for Linux)을 사용합니다.

PowerShell을 관리자 권한으로 실행:

wsl --install -d Ubuntu

설치 후 PC를 재부팅하고, 시작 메뉴에서 Ubuntu를 실행하여 사용자 이름과 비밀번호를 설정합니다.

Mac이나 Linux를 사용하는 경우 이 단계를 건너뛰고 터미널을 바로 사용하면 됩니다.


Step 3: OCI CLI 설치

Ubuntu 터미널에서:

bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)" -- --accept-all-defaults
source ~/.bashrc
oci --version

버전 번호가 출력되면 설치 성공입니다.


Step 4: OCI 인증 설정

config 파일 생성

mkdir -p ~/.oci

cat > ~/.oci/config << 'EOF'
[DEFAULT]
user=ocid1.user.oc1..본인USER_OCID
fingerprint=본인_FINGERPRINT
tenancy=ocid1.tenancy.oc1..본인TENANCY_OCID
region=ap-chuncheon-1
key_file=~/.oci/key.pem
EOF

Private Key 배치

다운로드한 .pem 파일을 복사합니다. Windows에서 다운로드했다면:

cp "/mnt/c/Users/본인계정/Downloads/다운로드한파일.pem" ~/.oci/key.pem

권한 설정 및 테스트

chmod 600 ~/.oci/config ~/.oci/key.pem
oci iam region list --output table

리전 테이블이 출력되면 인증 설정이 완료된 것입니다.


Step 5: SSH 키 생성

인스턴스에 접속할 때 사용할 SSH 키를 생성합니다.

ssh-keygen -t rsa -b 4096 -f ~/.ssh/oci_key -N ""

~/.ssh/oci_key(개인키)와 ~/.ssh/oci_key.pub(공개키)가 생성됩니다.


Step 6: 자동 생성 스크립트 작성

아래 내용을 ~/oci-create.sh로 저장합니다.

#!/bin/bash

LOG_FILE="$HOME/oci-instance.log"
SUCCESS_FLAG="$HOME/.oci-instance-created"

# 텔레그램 알림 (선택사항 - 사용하지 않으면 빈칸)
TELEGRAM_TOKEN=""
TELEGRAM_CHAT_ID=""

# === 본인 환경에 맞게 수정 ===
COMPARTMENT_ID="ocid1.tenancy.oc1..본인TENANCY_OCID"
AVAILABILITY_DOMAIN="tMfv:AP-CHUNCHEON-1-AD-1"
SUBNET_ID="ocid1.subnet.oc1..본인SUBNET_OCID"
IMAGE_ID="ocid1.image.oc1..본인IMAGE_OCID"
INSTANCE_NAME="my-instance"
SSH_KEY_FILE="$HOME/.ssh/oci_key.pub"
# ============================

# 이미 성공했으면 종료
if [ -f "$SUCCESS_FLAG" ]; then
    exit 0
fi

echo "$(date): Attempting to create instance..." >> "$LOG_FILE"

RESULT=$(oci compute instance launch \
    --compartment-id "$COMPARTMENT_ID" \
    --availability-domain "$AVAILABILITY_DOMAIN" \
    --shape "VM.Standard.A1.Flex" \
    --shape-config '{"ocpus": 4, "memoryInGBs": 24}' \
    --subnet-id "$SUBNET_ID" \
    --source-details "{\"sourceType\":\"image\",\"imageId\":\"$IMAGE_ID\",\"bootVolumeSizeInGBs\":100}" \
    --assign-public-ip true \
    --ssh-authorized-keys-file "$SSH_KEY_FILE" \
    --display-name "$INSTANCE_NAME" \
    2>&1)

EXIT_CODE=$?

if [ $EXIT_CODE -eq 0 ] && echo "$RESULT" | grep -q "ocid1.instance"; then
    echo "$(date): SUCCESS!" >> "$LOG_FILE"
    echo "$RESULT" >> "$LOG_FILE"
    touch "$SUCCESS_FLAG"

    # 텔레그램 알림 발송
    if [ -n "$TELEGRAM_TOKEN" ] && [ -n "$TELEGRAM_CHAT_ID" ]; then
        PUBLIC_IP=$(echo "$RESULT" | grep -o '"public-ip": "[^"]*"' | head -1 | cut -d'"' -f4)
        MSG="OCI 인스턴스 생성 성공! IP: ${PUBLIC_IP:-확인필요} ($(date))"
        curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" \
            -d chat_id="$TELEGRAM_CHAT_ID" \
            -d text="$MSG" > /dev/null
    fi
else
    echo "$(date): Failed (exit code: $EXIT_CODE)" >> "$LOG_FILE"
    echo "$RESULT" >> "$LOG_FILE"
    echo "---" >> "$LOG_FILE"
fi

실행 권한 부여:

chmod +x ~/oci-create.sh

Step 7: 수동 테스트

~/oci-create.sh
cat ~/oci-instance.log

로그에 Out of host capacity가 나오면 설정은 정상이고 리전에 자리가 없는 상태입니다. 401 NotAuthenticated가 나오면 Step 4의 인증 설정을 다시 확인하세요.


Step 8: 크론잡 등록 (1분마다 자동 실행)

crontab -e

편집기가 열리면 맨 아래에 추가:

* * * * * PATH=$HOME/bin:$PATH $HOME/oci-create.sh

저장 후 확인:

crontab -l

이제 1분마다 자동으로 인스턴스 생성을 시도합니다.


Step 9: 모니터링

로그 실시간 확인

tail -f ~/oci-instance.log

성공 여부 확인

ls ~/.oci-instance-created && echo "성공!" || echo "아직 시도 중..."

시도 횟수 확인

grep "Attempting" ~/oci-instance.log | wc -l

성공 후 정리

인스턴스가 생성되면 스크립트가 ~/.oci-instance-created 파일을 생성하므로 이후 실행 시 자동으로 종료됩니다. 크론잡을 삭제하려면:

crontab -r

생성된 인스턴스에 접속:

ssh -i ~/.ssh/oci_key ubuntu@생성된_Public_IP

(선택) 텔레그램 알림 설정

성공 시 텔레그램으로 알림을 받으려면 다음과 같이 설정합니다.

봇 생성

  1. 텔레그램에서 @BotFather 검색 → /newbot → 봇 이름과 username 입력
  2. 발급받은 HTTP API Token을 복사

Chat ID 확인

  1. 생성된 봇에게 아무 메시지 전송
  2. 브라우저에서 https://api.telegram.org/bot본인토큰/getUpdates 접속
  3. 응답에서 "chat":{"id":숫자} 부분의 숫자가 Chat ID

스크립트에 적용

~/oci-create.sh의 상단 변수를 수정:

TELEGRAM_TOKEN="발급받은_봇_토큰"
TELEGRAM_CHAT_ID="확인한_Chat_ID"

주의사항

WSL 사용 시: WSL 터미널을 닫거나 PC를 재부팅하면 크론 서비스가 중지됩니다. 재부팅 후 Ubuntu를 실행하고 sudo service cron start를 입력해야 합니다.

무료 계정 한도: A1 인스턴스는 합산 4 OCPU, 24GB RAM까지 무료입니다. 이 스크립트는 한 번에 전체 한도를 사용하는 인스턴스를 생성합니다. 여러 개로 나누려면 --shape-config의 ocpus와 memoryInGBs 값을 조정하세요.

소요 시간: 리전과 시간대에 따라 다르지만, 수 시간에서 며칠까지 걸릴 수 있습니다. 새벽 시간대에 성공 확률이 높은 경향이 있습니다.

리전 선택: 춘천(ap-chuncheon-1) 외에 서울(ap-seoul-1) 등 다른 리전을 시도해볼 수도 있습니다. 계정 생성 시 선택한 Home Region에서 시도하는 것이 기본입니다.


실제 사용 후기

이 방법으로 춘천 리전에서 A1 인스턴스(4 OCPU, 24GB RAM, 100GB 디스크)를 성공적으로 확보했습니다. Out of host capacity 에러가 반복되다가, 크론잡 등록 후 약간의 시간이 지나 자동으로 생성이 완료되었습니다. 이후 HestiaCP를 설치하여 웹 호스팅 서버로 활용하고 있습니다.

무료로 이 정도 사양의 클라우드 서버를 사용할 수 있다는 것은 개인 프로젝트나 소규모 서비스에 매우 유용합니다. 초기 인스턴스 생성의 번거로움만 이 스크립트로 해결하면, 그 이후로는 안정적으로 운영할 수 있습니다.