Oracle Cloud의 무료 ARM 인스턴스를 macOS 환경에서 자동으로 생성하는 과정을 상세히 안내해 드리겠습니다. 이 가이드는 Free Tier 계정 사용자들이 겪을 수 있는 리소스 제한 문제를 극복하고, 원하는 인스턴스를 효율적으로 생성할 수 있도록 도와줍니다.
배경
Free Tier 계정을 만들 당시, 한국 서울(중부) 리전의 리소스 부족 경고를 받았습니다. 춘천 리전만이 선택 가능했고, 이를 중부와 다른 지역으로 오해했습니다. 그러나 실제로 인스턴스를 생성하려 할 때, 다음과 같은 오류에 직면했습니다:
이는 현재 무료 계정의 홈 리전에 ARM 기반 인스턴스 자원이 부족하다는 것을 의미합니다. 하지만 4 vCPU와 24GB 메모리를 무료로 사용할 수 있는 기회를 놓치고 싶지 않아, 자원이 가용해질 때까지 지속적으로 시도할 수 있는 방법을 모색하게 되었습니다.
저는 맥북을 사용하기에, Mac OS에서 OCI CLI을 설치하고 환경 구성을 하고 난 다음 아래 방법을 적용하게 되었습니다. Mac OS에서 OCI CLI을 설치하는 포스팅은 여기를 참고하세요.
1. 사전 준비
1.1 필요한 정보 수집
Oracle Cloud 콘솔에서 다음 정보를 수집합니다:
•
User OCID
•
Tenancy OCID
•
Region
•
Subnet ID
•
Image ID
•
SSH 공개키
oci compute image list --compartment-id <your-compartment-id> --output table --query "data[*].{\"OCID\":id,\"Name\":\"display-name\"}"
Bash
복사
2. Oracle Cloud CLI 설정
2.1 설정 확인
다음 명령으로 OCI CLI 설정을 확인합니다:
oci iam compartment list -c [tenancy_ocid] --all
Shell
복사
정상적으로 접속되면 다음과 같은 결과가 표시됩니다:
3. 스크립트 준비
3.1 설정 파일 생성
/Users/jaejoonmoon/.oci 디렉토리에 다음 JSON 파일들을 생성합니다:
a.
availabilityConfig.json:
{
"recoveryAction": "RESTORE_INSTANCE"
}
JSON
복사
b.
instanceOptions.json:
{
"areLegacyImdsEndpointsDisabled": false
}
JSON
복사
c.
shapeConfig.json:
{
"ocpus": 4,
"memoryInGBs": 24
}
JSON
복사
3.2 OpenSSH 형식의 공개키 준비
다음 명령어로 OpenSSH 형식의 공개키를 생성합니다:
ssh-keygen -f /Users/jaejoonmoon/.oci/oci_api_key_public.pem -i -mPKCS8 > /Users/jaejoonmoon/.oci/oci_api_key_openssh.pub
chmod 600 oci_api_key_openssh.pub
Shell
복사
3.3 명령어 검증
OCI CLI 명령어를 직접 실행하여 정상 작동하는지 확인합니다. "Out of host capacity" 등의 메시지가 포함되면 명령어 실행은 성공적입니다.
4. 스크립트 자동화 구현
4.1 스크립트 작성
인스턴스 생성을 자동화하는 스크립트를 작성합니다. 이 스크립트는 기존 ARM 인스턴스를 확인하고, 없다면 생성을 시도합니다.
#!/bin/bash
source ~/.zshrc
LOCKFILE="/tmp/wordpress_instance_creation.lock"
LOGFILE="/Users/jaejoonmoon/wordpressinstancecreationlogfile.log"
MAX_RUNTIME=1800 # 30분 (초 단위)
# 로그 함수
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOGFILE"
}
# ARM 인스턴스 확인 함수
check_arm_instances() {
arm_instances=$(oci compute instance list \
--compartment-id "ocid1.compartment.oc1..aaaaaaaaiexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaa" \
--query "data[?starts_with(shape,'VM.Standard.A')].{id:id}" \
--output table)
if [ -n "$arm_instances" ]; then
log "ARM instance(s) already exist. Exiting."
return 0
else
log "No ARM instances found. Proceeding with instance creation."
return 1
fi
}
# 락 파일 확인 및 프로세스 검증 함수
check_lock() {
if [ -f "$LOCKFILE" ]; then
pid=$(cat "$LOCKFILE")
if ps -p $pid > /dev/null 2>&1; then
runtime=$(($(date +%s) - $(stat -f %m "$LOCKFILE")))
if [ $runtime -gt $MAX_RUNTIME ]; then
log "Process $pid has been running for too long. Killing it."
kill -9 $pid
rm -f "$LOCKFILE"
else
log "Process is already running."
return 1
fi
else
log "Stale lock file found. Removing it."
rm -f "$LOCKFILE"
fi
fi
return 0
}
# 인스턴스 생성 함수
create_instance() {
oci compute instance launch \
--availability-domain "RBOe:AP-CHUNCHEON-1-AD-1" \
--compartment-id "ocid1.compartment.oc1..aaaaaaaaiexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaa" \
--subnet-id "ocid1.subnet.oc1.ap-chuncheon-1.aaaaaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxd2u6t3a" \
--boot-volume-size-in-gbs 50 \
--shape VM.Standard.A1.Flex \
--image-id ocid1.image.oc1.ap-chuncheon-1.aaaaaaaajtfzm5fvmzacn2xyt6p2orsbm7oqpkrf6fx3pg2sufow5hkjgh7a \
--display-name "WordPress-Server" \
--assign-public-ip true \
--assign-private-dns-record true \
--availability-config file:///Users/jaejoonmoon/.oci/availabilityConfig.json \
--instance-options file:///Users/jaejoonmoon/.oci/instanceOptions.json \
--shape-config file:///Users/jaejoonmoon/.oci/shapeConfig.json \
--ssh-authorized-keys-file /Users/jaejoonmoon/.oci/oci_api_key_openssh.pub
}
# 메인 로직
main() {
log "Script started"
if check_arm_instances; then
exit 0
fi
if check_lock; then
echo $$ > "$LOCKFILE"
log "Lock acquired, proceeding with instance creation"
create_instance
if [ $? -eq 0 ]; then
log "Instance created successfully"
else
log "Failed to create instance"
fi
rm -f "$LOCKFILE"
log "Lock released"
else
log "Another instance of this script is already running"
exit 1
fi
}
# 스크립트 실행
main
# 스크립트 종료 시 락파일 제거
trap 'rm -f "$LOCKFILE"; log "Script interrupted, lock file removed"; exit' INT TERM EXIT
Bash
복사
•
wordpress-server-arm-instance-creation.sh 라는 이름으로 저장 합니다.
4.2 Crontab 설정
crontab을 편집하여 스크립트를 주기적으로 실행하도록 설정합니다:
crontab -e
Bash
복사
다음 라인을 추가합니다:
*/5 * * * * /Users/jaejoonmoon/wordpress-server-arm-instance-creation.sh >> /Users/jaejoonmoon/wordpressinstancecreationlogfile.log 2>&1
Bash
복사
이 설정은 5분마다 스크립트를 실행하며, flock을 사용하여 중복 실행을 방지합니다.
이 가이드를 따라 설정하면, Oracle Cloud의 ARM 인스턴스 생성을 자동화할 수 있습니다. 자원이 가용해질 때까지 지속적으로 시도하므로, 원하는 인스턴스를 효율적으로 확보할 수 있습니다.
마지막 실행 로그를 보면, 아직 호스트 용량이 부족한 상태임을 알 수 있습니다. 하지만 이 자동화 스크립트를 통해, 자원이 가용해지는 순간 즉시 인스턴스를 생성할 수 있을 것입니다.
"OCI Free Tier 자원을 사용해 WordPress 구축하기" 프로젝트는 인스턴스 생성에 성공하면 재개하도록 하겠습니다. 끈기를 가지고 계속 시도해 보겠습니다!
2024-10-20 16:10:00 - Script started
2024-10-20 16:10:02 - No ARM instances found. Proceeding with instance creation.
2024-10-20 16:10:02 - Lock acquired, proceeding with instance creation
ServiceError:
{
"client_version": "Oracle-PythonSDK/2.136.0, Oracle-PythonCLI/3.49.2",
"code": "InternalError",
"logging_tips": "Please run the OCI CLI command using --debug flag to find more debug information.",
"message": "Out of host capacity.",
"opc-request-id": "3678EFA9DB1045AA886E4023D0A12461/A7AEF1E7031C4DC29738786FF84FB4DD/F09B6B83637BE353511245BAC0AE7005",
"operation_name": "launch_instance",
"request_endpoint": "POST https://iaas.ap-chuncheon-1.oraclecloud.com/20160918/instances",
"status": 500,
"target_service": "compute",
"timestamp": "2024-10-20T07:11:42.498186+00:00",
"troubleshooting_tips": "See [https://docs.oracle.com/iaas/Content/API/References/apierrors.htm] for more information about resolving this error. If you are unable to resolve this issue, run this CLI command with --debug option and contact Oracle support and provide them the full error message."
}
2024-10-20 16:11:43 - Failed to create instance
2024-10-20 16:11:43 - Lock released
2024-10-20 16:11:43 - Script interrupted, lock file removed
Plain Text
복사






