이번 포스팅에서는 Oracle Cloud Infrastructure (OCI) Free Tier 자원을 사용하여 ARM기반의 컴퓨트 인스턴스를 생성하는 방법에 대해 다룰거에요.
시작하기 전에 확인하세요!
필수 준비사항
•
OCI Free Tier 계정이 있어야 합니다.
•
기본적인 리눅스 명령어를 알고 계셔야 합니다.
•
전체 과정은 약 1-2시간 정도 소요됩니다.
1. Ampere A1 컴퓨트 인스턴스 만들기
인스턴스 생성 따라하기
•
•
왼쪽 메뉴에서 '컴퓨트' > '인스턴스'로 이동합니다.
•
'인스턴스 생성' 버튼을 클릭합니다.
•
이름을 'WordPress-Server'로 입력합니다.
[참고]
이름은 나중에 관리하기 쉽도록 의미 있는 이름으로 설정하는 것이 좋습니다.
운영체제 선택:
•
'플랫폼 이미지' 선택
•
'Oracle Linux 8' 선택 (최신 버전 권장) - 편의상 제가 구축하는 사이트에서는 Oracle Linux를 사용하도록 한 것이고요, 여러분에게 사용이 편한 운영체제를 선택하시면 되요.
인스턴스 형태 선택:
•
'Ampere' 탭 선택
•
'VM.Standard.A1.Flex' 선택
•
OCPU 수: 2 (시작용으로 충분합니다)
•
메모리: 12GB (OCPU * 6GB 권장)
•
OCPU와 메모리는 나중에도 조정할 수 있으니, 처음에는 적당한 크기로 시작하세요.
•
Free Tier 한도를 초과하지 않도록 주의하세요.
•
이전에 생성한 VCN 선택
•
퍼블릭 서브넷 선택
•
'공용 IP 주소 지정' 활성화
•
"Generate a key pair for me" 선택
•
"Save Private Key" 버튼을 클릭하여 개인 키 다운로드
•
"Save Public Key" 버튼을 클릭하여 공개 키 다운로드
다운로드 한 파일은 적당한 곳으로 복사해 둡니다.
[실수하기 쉬운 부분]
•
개인키는 절대로 공유하지 마세요!
•
공개키는 반드시 한 줄로 된 텍스트여야 합니다.
여러분! 그거 아세요? ARM 기반 Ampere A1 인스턴스는 장점이 굉장한 자원 이에요. 무료 티어에서 최대 4개의 ARM 코어와 24GB RAM을 평생 무료로 사용가능해요. 이는 기존 x86 인스턴스와 비교했을 때 훨씬 더 많은 리소스를 제공해 준다는 의미에요. 따라서 자원을 확보하려는 사람들이 많겠죠? Oracle Cloud 데이터 센터에 확보된 무료티어 자원은 한정되어 있기 때문에, 위에서 제시한 방법으로는 여유 자원 확보하기가 수월하지 않을수도 있어요. 그래서 아래 섹션의 내용과 같이, 매크로 방식으로 시도하는 방법도 있답니다!
아! 그리고 또하나의 Tip! 인데요, 제 경우엔 Trial 계정 상태에서 위 방법으로 시도했음에도 여유 자원을 얻기가 어려웠어요. 그래서, 계정 업그레이드도 했답니다. 계정을 유료로 전환한다고 해서 당장 과금이 되거나 하진 않으니 크게 신경 안 쓰셔도 될 것 같아요!
일반적으로 제가 사용하고 있는 컴퓨터에서 ARM 인스턴스 생성을 주기적으로 시도할 수도 있습니다만, 컴퓨터를 종료하고 난 다음에는 스크립트 실행을 할 수 없는 단점이 있어요. 무료 쓸 수 있는 아주 작은 컴퓨트 인스턴스를 하나 만들고 이를 bastion host로 활용하여 ARM 인스턴스 생성 프로세스를 자동화하게 되면, 개인 컴퓨터의 전원 상태와 관계없이 24/7 작업을 수행할 수 있겠죠?
2. AMD Shape의 Host 생성
1.
OCI 콘솔에서 "Compute" > "Instances"로 이동합니다.
2.
"Create Instance" 버튼을 클릭합니다.
3.
인스턴스 세부 정보를 입력합니다:
•
이름: AMD-Bastion-Host
•
Compartment: 이전에 생성한 compartment 선택 혹은
•
Placement: 기본값 유지
•
Image and shape:
◦
Image: Oracle Linux 8
◦
Shape: VM.Standard.E2.1.Micro (Always Free 적격)
•
Primary network:
◦
VCN: 이전에 생성한 VCN 선택
◦
Subnet: 공용 서브넷 선택
•
Add SSH keys:
◦
"Generate a key pair for me" 선택
◦
"Save Private Key" 버튼을 클릭하여 개인 키 다운로드
◦
"Save Public Key" 버튼을 클릭하여 공개 키 다운로드
다운로드 한 파일은 적당한 곳으로 복사해 둡니다.
Boot volume 섹션에서 “Use in-transit encryption”을 선택합니다.
4.
"Create" 버튼을 클릭하여 인스턴스를 생성합니다.
5.
인스턴스 생성이 완료되면 공용 IP 주소를 확인합니다.
3. Bastion Host에 SSH 접속
1.
다운로드한 개인 키 파일(.key)의 권한을 변경합니다:
chmod 400 ~/.ssh/ssh-key-2024-10-21.key
Bash
복사
2.
SSH 설정 파일에 새 호스트 정보를 추가합니다:
nano ~/.ssh/config
Bash
복사
다음 내용을 추가합니다:
Host oci-bastion
HostName <bastion-host-public-ip>
User opc
IdentityFile ~/.ssh/ssh-key-2024-10-21.key
Bash
복사
3.
설정 파일 저장 후 다음 명령어로 접속합니다:
ssh oci-bastion
Bash
복사
4. OCI CLI 설치
Bastion Host에 접속한 후, 다음 단계를 따라 OCI CLI를 설치합니다:
1.
설치 스크립트 다운로드 및 실행:
bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"
Bash
복사
2.
설치 과정에서 나오는 질문들에 대해 기본값(Enter 키)을 선택합니다.
3.
설치가 완료되면 다음 명령어로 PATH에 OCI CLI를 추가합니다:
source ~/.bashrc
HTML
복사
4.
OCI CLI 구성:
oci setup config
HTML
복사
oci setup config 명령을 실행하면 기본적으로 다음과 같은 과정이 자동으로 진행됩니다:
1.
config 파일 생성 (사용자 입력 필요):
•
User OCID
•
Tenancy OCID
•
Region
•
키 파일 저장 위치 등
2.
자동으로 키 쌍 생성:
•
private key (기본: ~/.oci/oci_api_key.pem)
•
public key (기본: ~/.oci/oci_api_key_public.pem)
그래서 별도로 키를 생성할 필요 없이, 생성된 public key를 OCI Console의 사용자 설정에 등록하면 됩니다.
만약 기존 키를 사용하고 싶다면, config 설정 시 키 파일 경로를 기존 키 위치로 지정하면 됩니다.
5.
프롬프트에 따라 필요한 정보를 입력합니다:
•
User OCID
•
Tenancy OCID
•
Region
•
키 파일 경로 (기본값 사용)
6.
공개 키 등록
생성된 공개 키를 OCI 콘솔에 등록합니다:
a.
.oci 폴더로 이동:
cd ~/.oci
Shell
복사
b.
공개 키 내용 확인:
cat oci_api_key_public.pem
Shell
복사
c.
표시된 공개 키를 복사합니다.
d.
OCI 콘솔에서 사용자 프로필로 이동하여 "API Keys" 섹션에서 "Add API Key" 클릭
7.
"Paste Public Key" 옵션 선택 후 복사한 공개 키 붙여넣기
8.
"Add" 버튼 클릭
9.
완료
10.
구성이 완료되면 다음 명령어로 정상 작동을 확인합니다:
oci iam region list
Bash
복사
5. ARM 인스턴스 생성 스크립트 작성
5.1 작업 디렉토리 생성
mkdir -p ~/oci-wordpress-project
cd ~/oci-wordpress-project
Bash
복사
5.2 필요한 정보 수집
Oracle Cloud 콘솔에서 다음 정보를 수집합니다:
•
User OCID
•
Tenancy OCID
•
Region
•
Subnet ID
•
Image ID
oci compute image list --compartment-id <your-compartment-id> --output table --query "data[*].{\"OCID\":id,\"Name\":\"display-name\"}"
Bash
복사
5.3 OpenSSH 형식의 공개키 준비
다음 명령어로 OpenSSH 형식의 공개키를 생성합니다:
cd /home/opc/.oci
ssh-keygen -f oci_api_key_public.pem -i -mPKCS8 > oci_api_key_openssh.pub
chmod 600 oci_api_key_openssh.pub
Bash
복사
5.4 명령어 검증
OCI CLI 명령어를 직접 실행하여 정상 작동하는지 확인합니다. "Out of host capacity" 등의 메시지가 포함되면 명령어 실행은 성공적입니다.
5.5 자동화 스크립트 구현
이제 자동화 스크립트 create_arm_instance.sh 파일을~/oci-wordpress-project/ 디렉토리에 생성하고 다음 내용을 입력합니다:
nano create_arm_instance.sh
Bash
복사
다음 내용을 붙여 넣습니다. “상수 정의” 섹션의 각 항목 입력값은 여러분의 것으로 반영하도록 하세요!:
#!/bin/bash
source ~/.bashrc
# 스크립트 시작 부분에 Python 경고 메시지 무시 설정 추가
export PYTHONWARNINGS="ignore::DeprecationWarning"
# 상수 정의
LOCKFILE="/tmp/wordpress_instance_creation.lock"
LOGFILE="/home/opc/oci-wordpress-project/arm_instance_creation.log"
MAX_RUNTIME=3600
COMPARTMENT_ID="ocid1.compartment.oc1..aaaaaaaaiemporixxxxxxxxxxxxxxxxxxxxx7aa"
SUBNET_ID="ocid1.subnet.oc1.ap-chuncheon-1.aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxxx3a"
IMAGE_ID="ocid1.image.oc1.ap-chuncheon-1.aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxx7a"
AVAILABILITY_DOMAIN="RBOe:AP-CHUNCHEON-1-AD-1"
SSH_KEY_FILE="/home/opc/.oci/oci_api_key_openssh.pub"
LOG_DIR="/home/opc/oci-wordpress-project"
# 로그 함수 수정
log() {
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "$timestamp - $1" >> "$LOGFILE"
}
# 초기 검증
init_check() {
# 로그 디렉토리 생성
if [ ! -d "$LOG_DIR" ]; then
mkdir -p "$LOG_DIR"
if [ $? -ne 0 ]; then
log "Failed to create log directory: $LOG_DIR"
return 1
fi
fi
# SSH 키 파일 확인
if [ ! -f "$SSH_KEY_FILE" ]; then
log "SSH key file not found: $SSH_KEY_FILE"
return 1
fi
# OCI CLI 설치 확인
if ! command -v oci >/dev/null 2>&1; then
log "OCI CLI not installed"
return 1
fi
return 0
}
# 락 파일 확인 및 프로세스 검증 함수
check_lock() {
if [ -f "$LOCKFILE" ]; then
pid=$(cat "$LOCKFILE")
if ps -p $pid > /dev/null 2>&1; then
runtime=$(($(date +%s) - $(stat -c %Y "$LOCKFILE")))
if [ $runtime -gt $MAX_RUNTIME ]; then
log "Process $pid has been running for too long. Killing it."
kill -9 $pid 2>/dev/null || true
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
}
# ARM 인스턴스 확인 함수
check_arm_instances() {
local query_result
log "Checking existing instances..."
# ARM 인스턴스 검색
query_result=$(oci compute instance list \
--compartment-id "$COMPARTMENT_ID" \
--all \
--query 'data[?shape == `VM.Standard.A1.Flex`].{Shape:shape,Name:displayName}' \
--output json 2>/dev/null)
# 결과 분석
if [ -n "$query_result" ] && [ "$query_result" != "[]" ]; then
log "Current ARM instances:"
while IFS= read -r instance; do
log "$instance"
done < <(echo "$query_result" | jq -r '.[] | "Instance: \(.Name), Shape: \(.Shape)"')
return 0
else
log "No ARM instances found. Proceeding with creation."
return 1
fi
}
# 인스턴스 생성 함수
create_instance() {
log "Creating new ARM instance..."
local result
result=$(oci compute instance launch \
--compartment-id "$COMPARTMENT_ID" \
--availability-domain "$AVAILABILITY_DOMAIN" \
--display-name "ARM-WordPress-Instance" \
--image-id "$IMAGE_ID" \
--subnet-id "$SUBNET_ID" \
--shape "VM.Standard.A1.Flex" \
--assign-public-ip true \
--assign-private-dns-record true \
--shape-config '{"ocpus":4,"memoryInGBs":24}' \
--availability-config '{"recoveryAction": "RESTORE_INSTANCE"}' \
--instance-options '{"areLegacyImdsEndpointsDisabled": false}' \
--ssh-authorized-keys-file "$SSH_KEY_FILE" 2>&1)
if [ $? -ne 0 ]; then
log "Error creating instance: $(echo "$result" | jq -r '.message // empty')"
return 1
fi
return 0
}
# 메인 로직
main() {
log "Script started"
# 초기 검증
if ! init_check; then
log "Initialization failed"
exit 1
fi
# ARM 인스턴스 확인
if check_arm_instances; then
log "Existing ARM instance found. Exiting."
exit 0
fi
# 락 확인
if ! check_lock; then
log "Lock check failed"
exit 1
fi
# 락 파일 생성
echo $$ > "$LOCKFILE"
log "Lock acquired, proceeding with instance creation"
# 인스턴스 생성
if create_instance; then
log "Instance created successfully"
else
log "Failed to create instance"
rm -f "$LOCKFILE"
exit 1
fi
# 락 파일 제거
rm -f "$LOCKFILE"
log "Lock released"
}
# 스크립트 종료 시 락파일 제거
trap 'rm -f "$LOCKFILE"; log "Script interrupted, lock file removed"; exit' INT TERM EXIT
# 스크립트 실행
main
Bash
복사
이 스크립트는 Oracle Cloud Infrastructure(OCI)에 ARM 기반 WordPress 인스턴스를 생성하는 스크립트입니다. 주요 기능별로 설명 드려 본다면:
1.
초기 설정
•
필요한 모든 상수 정의 (OCID, 도메인, 파일 경로 등)
•
로그 파일과 락 파일 경로 설정, SSH 키 경로 설정
2.
초기 검증 (init_check)
•
로그 디렉토리 존재 확인 및 생성
•
SSH 키 파일 존재 확인, OCI CLI 설치 여부 확인
3.
락 관리 (check_lock)
•
동시 실행 방지를 위한 락 파일 시스템
•
프로세스 실행 시간 검사 (1시간 초과시 강제 종료)
•
오래된 락 파일 정리
4.
ARM 인스턴스 확인 (check_arm_instances)
•
기존 ARM 인스턴스 존재 여부 확인
•
jq를 사용하여 JSON 결과 파싱
•
결과를 로그에 기록
스크립트에 실행 권한을 부여합니다:
chmod +x ~/oci-wordpress-project/create_arm_instance.sh
Bash
복사
5.6 Crontab 설정
crontab을 편집하여 스크립트를 주기적으로 실행하도록 설정합니다:
crontab -e
Bash
복사
다음 라인을 추가합니다:
*/2 * * * * /home/opc/oci-wordpress-project/create_arm_instance.sh >> /home/opc/oci-wordpress-project/arm_instance_creation.log 2>&1
Bash
복사
이 가이드를 따라 설정하면, 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
복사
6. ARM 인스턴스 생성결과
@12/11/2024 update:
여러분! 기쁜 소식이 있어요. 제가 드디어 ARM기반의 Ampere A1인스턴스를 만들었어요. 아래 그림을 한번 보실래요?
리눅스의 cron job으로 등록해서 2분 간격으로 실행되도록 설정해 놓은 다음 잊고 살았었는데, 실행 로그를 몇일 만에 확인해 보니 만들어져 있었네요! 처음 시도한 지 한달이상 걸렸네요. 제 계정은 그동안 Free Trial 상태였습니다만, 무료 체험 기간이 지나고 2024-11-28에 유료 계정으로 업그레이드를 했답니다. 그동안 무료 계정이었을 때는 만들어 지지 않다가 유료 계정으로 전환하는 시점에 ARM기반 무료 인스턴스가 만들어 졌네요. 우연인지는 모르겠으나, 참고 할 가치는 있는 것 같아요! 무료계정보다는 유료로 전환한 계정에 무료 ARM 기반 인스턴스 우선권을 주는 정책이 있었을 지도요!
다음 포스팅을 통해 이 인스턴스를 활용하여 Wordpress를 설치하고 블로그 사이트를 구성해 보도록 할께요. OCI Free Tier로 워드프레스 블로그 만들기 - (4) Wordpress 설치하기: 기본 구성편에서 이어가 보도록 할께요!
이전에 제작한 포스팅도 참고 하세요:
















