django app 공개 운영을 위해 [Django] 장고 앱 공개 운영 포스트 Fig 1의 nginx, mysql, django app을 하나의 ec2 인스턴스에 각각 도커 컨테이너로 실행 하려고 계획을 하고 서버를 실행했지만 이 방식에 큰 단점이 있어 아키텍쳐를 변경하기로 했다.
이 포스팅은 aws RDS 인스턴스를 생성해 ec2 인스턴스와 연동하는 방법에 대해 정리한다.
목표
Fig 1. (a)는 처음 계획한 운영 아키텍쳐로 ec2 instance 하나에 nginx, django app, mysql 3개를 각각 도커 컨테이너로 실행하는 방식이었고 Fig 1.(b)는 변경하고자 하는 아키텍쳐로 ec2 instance에는 nginx, django app만 운영하고 mysql은 aws RDS 인스턴스로 분리 운영 하는 방식이다.
기존 아키텍쳐의 문제
Fig 1.(a) 처럼 아키텍쳐를 설계하는 것에는 다음과 같은 문제 점이 있었다.
1. cpu 성능: 현재 테스트 운영에 사용하고자 하는 aws 프리티어 계정으로 만들수 있는 ec2 인스턴스는 vcpu 1개 , ram 1GB 가 한계 스펙이다. 이 성능으로 (a)와 같이 아키텍쳐를 구성한 결과 심심치 않게 cpu 사용률이 70% 이상으로 치솟는 경우가 발생했다.
2. database backup: 나는 database 전문가가 아니라 EBS를 비휘발성으로 설정해 database backup 설정을 하고 실패 없이 관리한 자신이 없었다.
위와 같은 문제를 해결하기 위해 mysql을 ec2에 설치해 운영 하지 않고 Fig 1. (b) 처럼 별도 RDS인스턴스로 분리하기로 결정했다.
Fig 1. (a) 처럼 운영하는 것도 장점은 있다. RDS는 비용이 생각 보다 비싼데 database를 잘알고 백업 보안 schema를 잘 설정 할 수 있다면 ec2 를 이용하는 게 비용적인 측명에서 더 좋다고한다.
RDS 인스턴스 생성
RDS 인스턴스 생성을 위해서는 aws console 검색 창에 RDS 를 검색 한후 'rds console -> 데이터베이스 -> 데이터베이스 생성' 을 클릭하면 된다.
나의 경우 mysql rds 인스턴스를 생성했다. mysql의 경우 라이선스가 GNU v2.0 으로 별도 라이선스 비용이 들어가지 않는다. 아래 그림 처럼 표준 생성에서 '엔진 옵션->Mysql' 을 선택하고 버전을 기존 사용 하던 8.0.31 로 설정했다.
다음으로 아래 그림의 제일 위는 템플릿을 선택하는 과정인데 나는 당연히 월 750시간 사용이 무료인 계정이니 '프리 티어'를 선택했다. '프리 티어' 템플릿을 선택하면 '가용성 및 내구성'은 자동으로 '단일 DB 인스턴스'로 설정된다.
그 아래에서는 'DB 인스턴스 식별자'를 입력하는데 여기서 입력하는 이름이 'rds console -> 데이터베이스'에 들어가면 나오는 db 인스턴스 식별자이다. 자신의 용도에 맞게 직관적인 이름을 넣으면 된다.
자격증명은 mysql 서버에 접속 할때 사용하는 user id 와 password 이다.
인스턴스 클래스는 정보는 link에 매우 상세하게 나와있으니 정확한 정보는 링크를 통해 확인하고 여기선 간단히만 정리하자.
- 스탠다드 클래스 : 컴퓨팅, 메모리 및 네트워크 리소스의 균형을 제공하며 많은 데이터베이스 워크로드에 좋은 선택. 스탠다드 클래스는 대부분의 일반적인 데이터베이스 요구사항을 충족 할수 있는 사양이다.
- 메모리 최적화 클래스: 메모리에서 대용량 데이터 집합을 처리하는 워크로드의 성능을 가속화합니다. 높은 처리 성능이 요구되는 경우에 적합하다. 메모리를 더 많이 확보하면 더 많은 데이터를 메모리에 저장하고 이는 쿼리 시간 단축으로 이어질 확률이 높으므로..
- 버스터블 클래스: 기준 수준의 CPU 성능과 함께 기준 수준 이상으로 버스트할 수 있는 기능을 제공합니다. 여기서 버스트란 순간 확장으로 순간적으로 더많은 리소스를 필요로 하는 경우 이를 가능하게 한다는 의미 이다.
'프리 티어' 계정의 소유자인 나에게 허락된건 버스터블 클래스 이므로 이걸 선택한다. (사실 이거면 나에겐 충분하기도 하다)
스토리지는 범용 ssd로 세팅하고 프리티어에 주어진 20gb 를 할당한다. 스토리지 자동 조정은 할당한 크기 이상의 용량을 어플리케이션이 사용하고자 할때 자동으로 할당량을 조정해 주는 것이다. 즉 비용 증가로 이어질 수 있다.
이제 생성한 rds 인스턴스와 연결할 ec2 리소를 선택한다. ec2 인스턴스 에서 자신이 원하는 어플리케이션이 서버가 동작하는 ec2 인스턴스를 선택하면 된다. ec2 인스턴스를 선택하면 VPC 는 자동 할당 된다.
'퍼블릭 엑세스' 에서 '예'
를 선택하면 외부(같은 VPC에 속하지 않은 host)에서 생성할 mysql 서버에 접속할수 있다. "아니오"를 선택하면 이 DB 인스턴스와 같은 VPC 에 속한 ec2 인스턴스에서만 접속 가능하다.
이 후로도 '데이터베이스 인증' 설정이 있는데 mysql 접속시 사용할 사용자 인증 방식에 대한 설정이다.
RDS와 ec2 인스턴스 연동
RDS 인스턴스 생성시 '퍼블릭 액세스 가능' 을 선택했거나 연동 하고자 하는 ec2 instance와 같은 VPC에 속하도록 세팅 했다면 연동자체는 매우 쉽다.
퍼블릭 액세스 가능 한지 아닌지는 RDS console-> 데이터베이스 -> 인스턴스 상세 정보의 '연결 & 보안' 탭을 보면 알 수 있다.
아래 그림의 가장 오른 쪽 보안 섹션을 보면 '퍼블릭 액세스 가능' 항목에 '예' 라고 되어 있으면 localhost(본인의 workstation이나 laptop)에서 도 접속이 가능 한 상태 이다.
1. 퍼블릭 액세스 가능 선택한 경우
로컬에서 terminal을 열고 접속을 위해 사용했던 ip 대신 위 그림의 '앤드포인트' 밑의 주소를 이용 하면 된다.
위 그림의 예를 들자면 mysql -h 옵션의 값으로 '앤드포인트' 값을 사용 하고 -P 옵션으로 '포트'를 지정한다.
-u 옵션로 데이터베이스 생성시 지정한 사용자 id를 입력하면 된다.
mysql -h product.cie6ndifnblb.ap-northeast-2.rds.amazonaws.com -P 3306 -u admin -p
product.cie6ndifnblb.ap-northeast-2.rds.amazonaws.com
2. 퍼블릭 액세스 가능 의 값이 '아니오' 인 경우
퍼블릭 액세스가 불가능한 경우 접속하고자 하는 데이터베이스와 같은 vpc(vitual private cloud)에 속한 ec2 인스턴스에 연결해
'퍼블릭 액세스 가능' 한경우와 똑같이 '앤드포인트' 정보를 이용해 접속할 수 있다.
mysql -h product.cie6ndifnblb.ap-northeast-2.rds.amazonaws.com -P 3306 -u admin -p
추가 작업
나의 경우 docker-compose 로 서버를 실행 하므로 위의 rds database instance 앤드포인트 정보로 docker-compose.yml 정보를 업데이트 해줘야한다. 환경변수를 선언하는 environment의 DB_HOST_ADDRESS 값에 database 앤드포인트를 할당한다.
(django app 실행 전에 새로 만든 mysql 서버에 django app에서 사용 하는 database를 생성하고 django app에서 database 를 migrate 하는 절차를 반드시 실행해야 한다.)
version: "3.7"
services:
nginx:
container_name: web_server
restart: on-failure
image: nginx:stable
volumes:
- ${PWD}/etc/jnbdrive_nginx:/etc/nginx/sites-enabled/default
- ${PWD}/etc/nginx.conf:/etc/nginx/nginx.conf:ro
- ${PWD}/staticfiles:/home/nginx/www/static
ports:
- 80:80
environment:
DJANGO_HOST: django_app
django_app:
container_name: django_app
build: .
image: django_app:latest
ports:
- 8000:8000
restart: always
environment:
DB_PORT: 3306
DB_HOST_ADDRESS: product.cie6ndifnblb.ap-northeast-2.rds.amazonaws.com # rds instance endpoint
tty: true
networks:
- backend
volumes:
- ${PWD}:/home/docker/workspace/django_app
command: ./start_server.sh
networks:
backend:
# Use a custom driver
driver: bridge
- 끝 -
'AWS' 카테고리의 다른 글
[aws] ELB Application Load Balancer를 이용한 SSL 설정 (1) | 2023.02.03 |
---|---|
[aws]ec2 인스턴스 도메인 연결 (0) | 2023.01.26 |
[aws] ec2 상태검사 1/2개 통과 (2) | 2023.01.21 |
[aws] 인바운드 규칙 변경 (2) | 2023.01.18 |
[AWS] ec2 인스턴스 볼륨 추가 및 마운트 (0) | 2023.01.15 |