일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- Algorithm
- ARM
- DART
- FastAPI
- system hacking
- Stream
- ML
- MATLAB
- Widget
- pytorch
- Got
- Image Processing
- MDP
- bloc
- Computer Architecture
- study book
- PCA
- fastapi를 사용한 파이썬 웹 개발
- BAEKJOON
- rao
- C++
- 영상처리
- Flutter
- BFS
- BOF
- Dreamhack
- 백준
- llm을 활용 단어장 앱 개발일지
- 파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습
- Kaggle
- Today
- Total
Bull
[CI/CD] 오라클 클라우드(OCI) 프리티어 계정 생성 / 서버 구축 / 배포하기 본문
오라클 프리티어(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 찍고 모바일 기기 등록하면 됩니다.
인스턴스 생성
모든 계정 생성을 마쳤습니다. 이제 인스턴스를 생성해줄게요. 사진의 빨간 박스를 누릅니다.
들어오면 Instances 창에는 두드러지게 설정할 수 있는 창이 안보입니다. 사진과 같이 Compartment 선택을 해주지 않았기 때문입니다. 빨간 박스를 체크하면 클라우드 이름(root) 로 선택창이 나옵니다.
그러면 위 사진처럼 Create instance 버튼이 나옵니다. 이걸 클릭해줍니다.
잘 보면 프리티어 라벨을 붙어있습니다.
Image를 바꿔보겠습니다. 기본 설정은 Oracle Linux 8 로 설정되어 있는데 저는 Ubutu 가 편하기 때문에 바꿔보도록 하겠습니다.
사진과 같이 20.04 를 선택했습니다. 특별한 이유는 없고 그냥 했습니다.
Shape 부분에 AMD 아키텍쳐로 프리티어를 사용하고 있습니다. 걱정하지 않고 넘어가줍니다.
SSH 키를 통해서 OCI의 VM에 접근할 겁니다. 꼭 다운받으세요.
디스크는 50GB로 설정하겠습니다. 이유는 적당해서 입니다. 이제 Create를 통해서 인스턴스를 생성해줍니다.
저는 처음에 인스턴스를 잘못생성했기 때문에 제가 만들던 과정의 인스턴스 이름이랑 다릅니다. 큰 차이는 없으니 넘어가도 좋습니다.
username 은 ubuntu로 설정되었습니다. Public IPv4 address는 실제 접근할 수 있는 IP 주소입니다. 두 부분은 ssh 접속할 때 필요하니 인지하고 있어야 합니다.
VCN 설정
메인 대시보드(get started) 페이지로 와서 vcn 설정 창을 들어가줍니다.
인스턴스를 생성할 때 자동으로 생성되었습니다. vcn을 편집해주겠습니다.
들어가면 서브넷 설정이 나오는데 Create 서브넷으로 착각할 수 있습니다. 바로 빨간 박스로 들어가줍니다.
Add Rules를 해줍니다. 간단하게만 설명하면 외부에서 들어오는 포트에 대해서 인바운드/아웃바운드를 설정해줍니다. 포트포워딩 한다고 말할 수 있습니다. 그 외 설정도 있겠지만 넘어갑니다.
CIDR는 클래스 없는 도메인 간 라우팅 기법으로 1993년 도입되기 시작한, 최신의 IP 주소 할당 방법입니다. Source CIDR은 외부 접속 IP 에 대한 대역을 설정해줍니다. 0.0.0.0/0은 모든 IP가 들어올 수 있도록 허용합니다.
Source Port는 외부에서 들어오는 IP는 반드시 포트를 통해서 나오는데 이 부분을 모두 허용해주겠다는 소리입니다. 제 컴퓨터에서 외부 서비스에 접속할 때 제가 외부통신을 위해 패킷을 내보내는 곳은 임의의 비어있는 포트로 나가기 때문에 모릅니다. 따라서 외부 포트는 All 허용해줍니다.
Destination Port는 우리가 서비스를 열 서버의 포트입니다. 서비스를 구축하면 이 포트 번호로만 들어갈 수 있습니다.
Description은 Rule을 구분할 수 있도록 적어줍니다.
SSH 접속
이 위치는 어디여도 상관없지만 제가 ssh를 wsl로 복사하기 위해 사용하는 명령어의 절대 경로는 D:\ssh입니다.
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가 사용자 이름으로 지정됩니다.
다음과 같이 프롬프트가 변경됨을 확인할 수 있습니다.
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 에디터로 붙여넣기할 때 공백이 망가질 수 있습니다. 파이썬은 붙여넣기 할 때 공백이 한 치라도 오차가 나면 오류가 발생하니 제대로 확인하기 바랍니다.
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 명령어로 접근해도 되지만 브라우저를 통해 요청해보았습니다. 제대로 출력이 잘 되네요.
다른 디렉토리에 접근해도 제대로 출력되는 것을 확인할 수 있습니다.