관리 메뉴

Bull

[CI/CD] 오라클 클라우드(OCI) 프리티어 계정 생성 / 서버 구축 / 배포하기 본문

DevOps/CIㆍCD

[CI/CD] 오라클 클라우드(OCI) 프리티어 계정 생성 / 서버 구축 / 배포하기

Bull_ 2024. 8. 17. 03:38

오라클 프리티어(OCI) 소개

오라클 클라우드 프리티어

오라클 클라우드는 aws에서 ec2 처럼 VM을 상시 가동시키고 VCN을 통해 서버구축이 가능합니다. 여기서 눈여겨 봐야할 부분은 VM OPCU의 1/8개, 메모리 1GB 스펙을 무료로 사용할 수 있습니다. 2번째인 Arm 기반 Ampere A1 코어 ~~도 제한된 스펙에 상시 무료인 거 같아서 사용할 수 있는 것 같은데 인터넷 대부분은 1GB 짜리 인스턴스만 사용하는 것으로 보아 일단 넘어 가겠습니다. (저도 잘 모르니까요) 하지만 대부분 1GB를 고른 이유는 웹 서버 호스팅용은 큰 스펙이 필요하지 않아 그런 것 같습니다. 

 

용량은 총 200GB 까지 지원이 되네요. 로컬 컴퓨터로 생각하면 1GB짜리 VMware에서 가상 리눅스하나 킨다고 생각해도 되겠네요. 여기서 VCN을 통해서 가상 네트워크를 통해 최대 2개 까지 IP를 받을 수 있습니다. 그럼 계정을 만들어보고 실제로 간단한 Python의 FastAPI를 Docker를 통해 구축해서 외부에서 서버에 접근하는 행위까지 해보겠습니다.

계정 생성

회원가입

계정이 없다면 계정을 만듭니다. 칸에 넣을 거 넣으면 금방되지만 확신을 위해 과정을 담아보았습니다.

이메일 인증

입력한 이메일로 도착한 내용을 확인해서 인증해줍니다.

입력칸을 채우고 Individual을 선택 후 진행을 따라와줍니다. 

주소 정보

주소 정보와 핸드폰 번호를 넣습니다. 여기서 서울시가 주소라면 "도" 입력 칸에 경기도라고 넣어줍니다.

결제 정보 추가
카드 정보 입력

카드 정보를 등록합니다.

체험판 시작

등록이 완료되면 계약에 체크표시를 하고 체험판 시작하기를 누릅니다.

계정 설정 중

계정 생성까지 조금 기다려야합니다.

로그인

로그인이 두 번 뜨는 데 첫 번째는 사진과 같은 내용을 넣어줍니다. 우리가 가입할 때 전자 메일, 대체 이름, 클라우드 계정 이름이 있었습니다. 잘 확인하시길 바랍니다.

계정 입력

대체이름(사용자 이름)과 비밀번호를 적어줍니다.

보안 인증용
어플 다운 받기 후 인증

모바일 앱을 통해 보안 인증을 강화하는 절차입니다. 핸드폰 앱 받으셔서 QR 찍고 모바일 기기 등록하면 됩니다.

인스턴스 생성

대시보드에서 인스턴스 생성

모든 계정 생성을 마쳤습니다. 이제 인스턴스를 생성해줄게요. 사진의 빨간 박스를 누릅니다.

Compartment 선택

들어오면 Instances 창에는 두드러지게 설정할 수 있는 창이 안보입니다. 사진과 같이 Compartment 선택을 해주지 않았기 때문입니다. 빨간 박스를 체크하면 클라우드 이름(root) 로 선택창이 나옵니다.

인스턴스 생성

그러면 위 사진처럼 Create instance 버튼이 나옵니다. 이걸 클릭해줍니다.

프리티어 확인과 Image 설정

잘 보면 프리티어 라벨을 붙어있습니다.

Image를 바꿔보겠습니다. 기본 설정은 Oracle Linux 8 로 설정되어 있는데 저는 Ubutu 가 편하기 때문에 바꿔보도록 하겠습니다.

Ubutu 선택

사진과 같이 20.04 를 선택했습니다. 특별한 이유는 없고 그냥 했습니다.

Image 설정 완료

Shape 부분에 AMD 아키텍쳐로 프리티어를 사용하고 있습니다. 걱정하지 않고 넘어가줍니다.

ssh key 다운 받기

SSH 키를 통해서 OCI의 VM에 접근할 겁니다. 꼭 다운받으세요.

volume 설정

디스크는 50GB로 설정하겠습니다. 이유는 적당해서 입니다. 이제 Create를 통해서 인스턴스를 생성해줍니다.

인스턴스 정보 확인

저는 처음에 인스턴스를 잘못생성했기 때문에 제가 만들던 과정의 인스턴스 이름이랑 다릅니다. 큰 차이는 없으니 넘어가도 좋습니다. 

username 은 ubuntu로 설정되었습니다. Public IPv4 address는 실제 접근할 수 있는 IP 주소입니다. 두 부분은 ssh 접속할 때 필요하니 인지하고 있어야 합니다.

VCN 설정

vcn 확인

메인 대시보드(get started) 페이지로 와서 vcn 설정 창을 들어가줍니다.

vcn 편집

인스턴스를 생성할 때 자동으로 생성되었습니다. vcn을 편집해주겠습니다.

서브넷 설정

들어가면 서브넷 설정이 나오는데 Create 서브넷으로 착각할 수 있습니다. 바로 빨간 박스로 들어가줍니다.

Rules 설정 (포트포워딩)

Add Rules를 해줍니다. 간단하게만 설명하면 외부에서 들어오는 포트에 대해서 인바운드/아웃바운드를 설정해줍니다. 포트포워딩 한다고 말할 수 있습니다. 그 외 설정도 있겠지만 넘어갑니다.

Rule 설정

CIDR는 클래스 없는 도메인 간 라우팅 기법으로 1993년 도입되기 시작한, 최신의 IP 주소 할당 방법입니다. Source CIDR은 외부 접속 IP 에 대한 대역을 설정해줍니다. 0.0.0.0/0은 모든 IP가 들어올 수 있도록 허용합니다.



Source Port는 외부에서 들어오는 IP는 반드시 포트를 통해서 나오는데 이 부분을 모두 허용해주겠다는 소리입니다. 제 컴퓨터에서 외부 서비스에 접속할 때 제가 외부통신을 위해 패킷을 내보내는 곳은 임의의 비어있는 포트로 나가기 때문에 모릅니다. 따라서 외부 포트는 All 허용해줍니다.



Destination Port는 우리가 서비스를 열 서버의 포트입니다. 서비스를 구축하면 이 포트 번호로만 들어갈 수 있습니다.



Description은 Rule을 구분할 수 있도록 적어줍니다.

Rules 확인

SSH 접속

ssh 경로 확인

이 위치는 어디여도 상관없지만 제가 ssh를 wsl로 복사하기 위해 사용하는 명령어의 절대 경로는 D:\ssh입니다.

wsl

WSL 입니다. wsl은 윈도우에서 VMware 없이 간편하게 리눅스 셸에 접속할 수 있습니다. wsl에 대한 설치 과정은 설명하지 않겠습니다.

1. SSH 키 파일 준비

mkdir -p ~/.ssh

ssh 파일을 저장할 디렉터리를 만들어줍니다.

2. SSH 키 파일 복사

 cp /mnt/d/ssh/ssh-key-2024-08-16.key ~/.ssh/

wsl은 /mnt에서 윈도우 파일에 접근할 수 있기 때문에 다음과 같은 절대경로로 ssh를 복사해줍니다.

3. SSH 키 파일의 권한 설정

chmod 600 ~/.ssh/ssh-key-2024-08-16.key

ssh를 사용할 수 있게 권한 상승을 해줍니다.

4. SSH 명령으로 서버에 연결

ssh -i ~/.ssh/ssh-key-2024-08-16.key ubuntu@[IP주소]

아까 본 username 과 ip주소를 @로 이어 붙입니다. Image를 우분투로 했다면 ubuntu가 사용자 이름으로 지정됩니다.

ssh 접속 성공

다음과 같이 프롬프트가 변경됨을 확인할 수 있습니다.

Docker 설정

# 시스템 패키지 업데이트
sudo apt-get update
sudo apt-get upgrade -y
# 필요한 패키지들
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# 도커 공식 GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 도커 저장소 추가
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 도커 설치
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# 도커 서비스 시작 및 자동 실행
sudo systemctl start docker
sudo systemctl enable docker

ubutu의 apt-get은 기본으로 설치되어 있으므로 위와 같이 명령어를 순서대로 입력하면 됩니다. 각 명령어에 대한 설명은 주석정도로만 대체하겠습니다. 이 부분에서 오류가 많이 날 수도 있는데 GPT에게 에러 내용을 그대로 복사하여 해결해 나가는 것을 추천합니다.

FastAPI

우리는 vscode가 익숙하지만 갓 생성된 따끈따끈한 리눅스에 vscode GUI 환경은 없습니다. vi 명령어를 통해서 만들어 보겠습니다.

vi main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello, World!"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

간단하게 json을 api로 요청할 수 있는 서버를 구축하겠습니다. 제공된 코드는 vi 에디터로 붙여넣기할 때 공백이 망가질 수 있습니다. 파이썬은 붙여넣기 할 때 공백이 한 치라도 오차가 나면 오류가 발생하니 제대로 확인하기 바랍니다.

main.py

Dockerfile과 requiredments.txt도 마찬가지로 만들어줍니다.

Dockerfile

# Dockerfile
# Base image
FROM python:3.9-slim

# Set the working directory
WORKDIR /app

# Copy the requirements file to the container
COPY requirements.txt .

# Install the dependencies
RUN pip install --no-cache-dir -r requirements.txt

# Copy the FastAPI code to the container
COPY . .

# Command to run the FastAPI server
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "12345"]

 requiredments.txt

fastapi
uvicorn

다음과 같이 만들어지면 완성입니다.

ubuntu@instance-20240817-0127:~$ ls
Dockerfile  main.py  requirements.txt

Docker Bulid

sudo docker build -t myfastapi .

도커 이미지를 myfastapi로 빌드해줍니다. 

Docker run

sudo docker run -d -p 12345:8000 myfastapi

빌드된 도커 이미지를 컨테이너를 켜줍니다.

ubuntu@instance-20240817-0127:~$ sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED       STATUS                   PORTS                                           NAMES
8ef281ebd340   myfastapi      "uvicorn main:app --…"   2 hours ago   Up 2 hours               0.0.0.0:12345->12345/tcp, :::12345->12345/tcp   great_kapitsa

 위와 같은 명령어로 컨테이너가 생성되었다면 완성입니다.

구축된 서버에 요청하기

이제 직접 IP에 접근해서 api를 요청하겠습니다.

curl 명령어로 접근해도 되지만 브라우저를 통해 요청해보았습니다. 제대로 출력이 잘 되네요.

다른 디렉토리에 접근해도 제대로 출력되는 것을 확인할 수 있습니다.