[엉박사] 2.2 AWS

impala·2023년 1월 12일
0
post-thumbnail

2.2 AWS

이번 프로젝트의 배포에는 AWS환경이 사용되었다. AWS를 사용한 이유는 가장 보편화되어있는 클라우드 서비스이기도 하고, 처음 서비스를 배포하는 입장에서 참고할만한 자료가 많았기 때문에 AWS환경을 선택하게 되었다.

2.2.1 RDS

배포과정에서 가장 먼저 한 작업은 데이터베이스를 원격으로 올린 것이다. 집과 학교를 오가며 개발을 하다보니 데스크탑과 노트북에서 각각 로컬환경으로 개발을 진행하게 되었는데, 두 환경에서 로컬 데이터베이스를 사용하여 개발을 진행하다보니 데스크탑에서 노트북으로, 노트북에서 데스크탑으로 이동할 때마다 DB에 저장된 데이터가 달라 같은 작업을 여러번 하게 되어서 불편했다. 그래서 먼저 AWS를 통해 배포를 하기로 결정하고 RDS에 원격 데이터베이스를 구축하여 여러 로컬환경에서 같은 DB에 접속할 수 있도록 구성하였다.

RDS에서 원격 데이터베이스를 생성하고 이를 장고 프로젝트에 연동하기 위해서는 settings.py의 DATABASES 항목을 다음과 같이 변경해주어야 한다

# settings.py
DATABASES = {
    'default': {
        # PostgreSQL을 사용하기 위한 설정
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'PORT': '5432',

        # RDS의 정보
        'NAME': 'DR_EUNG',          # RDS에서 설정한 DB이름
        'USER': 'dr_eung',          # RDS접속시 사용할 유저의 이름
        'PASSWORD': '********',     # RDS접속시 사용할 유저의 비밀번호
        'HOST': 'dreungdb.******.ap-northeast-2.rds.amazonaws.com',   # RDS 엔드포인트 

        # 로컬환경에서 사용한 DB정보
        # 'NAME': 'Dr.Eung',
        # 'USER': 'dr-eung',
        # 'PASSWORD': '********',
        # 'HOST': '127.0.0.1',
    }
}

이 설정은 추후 코드를 EC2인스턴스에 올려 실행할 때에도 EC2와 RDS만 연결해주면 그대로 유지되기 때문에 RDS에 DB서버를 구축했다면 EC2에 웹서버를 올리는 것이 편리하다.

2.2.2 EC2

다음으로 한 작업은 EC2에 배포 환경을 구축하는 것이었는데, 서비스의 특성상 무거운 자연어처리 모델을 사용해야 하는 상황이라 AWS에서 프리티어로 제공하는 t2.micro 인스턴스로는 모델이 돌아가지 않았다. 그렇다고 GPU서버를 빌리기에는 비용이 너무 많이 들어 vCPU 2대와 8GB 메모리를 가진 t3.large인스턴스를 대여하였다.

본격적인 배포에 앞서 인스턴스를 생성할 때 위에서 만든 RDS와 연결을 해주어야 한다. 둘을 연결해주는 작업은 AWS의 보안그룹을 통해 이루어진다. 보안그룹이란 쉽게 말해서 리소스에 접근할 수 있는 IP와 PORT를 지정해둔 리스트이다. 보안그룹은 리소스에 들어오는 트래픽을 관리하는 인바운드 규칙과 인스턴스에서 나가는 트래픽을 관리하는 아웃바운드 규칙으로 나뉜다.

따라서 EC2인스턴스와 RDS를 연결하기 위해서는 EC2의 보안그룹 ID를 RDS의 보안그룹의 인바운드 규칙에 추가하는 작업이 필요하다. 하지만 최근에는 RDS가 이미 있는 경우 EC2 인스턴스를 생성할 때 연결할 RDS를 선택하기만 하면 자동으로 연결해주기 때문에 특별한 이유가 없는 이상 EC2 인스턴스를 생성하는 과정에서 어렵지 않게 RDS와 연결할 수 있다.

EC2와 RDS를 연결한 다음으로는 인스턴스에 접속하여 도커등 필요한 툴을 다운받고 깃허브를 통해 API서버의 소스코드와 리액트를 통해 개발한 정적파일들을 받아왔다.

└─docker-server
     ├─docker-compose.yml
     ├─backend
     │      Dockerfile
     │      ...
     │      config/
     │      manage.py
     ├─frontend
     │      └─build : static files(html, css, js)
     └─nginx
            nginx.conf

0개의 댓글