[주제] 클라우드에 어플리케이션 배포
CI도구를 통해서 도커 빌드 까지 성공적으로 하였습니다. 이번에는 AWS RDS를 클라우드 구성하고 코드에 DB와 연동되는 로직을 추가 하여 서비스를 클라우드 위에서 구성 해보세요
1) 클라우드에 Database를 생성 및 Table 구성
2) Database에 간단히 읽고 쓸 수 있도록 웹어플리케이션 추가 기능 개발
3) EC2 인스턴스 혹은 ECS에 컨테이너를 구성해보고 DB와 연동
클라우드에서 관계형 데이터베이스를 더욱 쉽게 설정, 운영 및 확장할 수 있도록 지원하는 웹 서비스이다.
이 서비스는 산업 표준 관계형 데이터베이스를 위한 경제적이고 크기 조절이 가능한 용량을 제공하고 공통 데이터베이스 관리 작업을 관리한다.
즉, 필자는 RDS란 클라우드상에서 관계형 데이터베이스를 독립적으로 관리할 수 있게 해주는 서비스라고 이해했습니다.
DB 인스턴스
RDS의 기본 빌딩 블록은 DB 인스턴스이다.
보안그룹
RDS는 보안그룹을 활용하여 접근을 제한시킬 수 있다. 보안그룹에 미리 등록한 사람만 접근 하도록 만들어서 보안상으로 안전성을 높인다.
EC2와의 차이는 무엇인가? EC2는 말그대로 가상서버를 제공하는 것으로 EC2에서도 가상서버로써 프로그램을 실행시킬 수 있다. 하지만 EC2는 ‘인스턴스’라는 가상컴퓨팅 환경을 설정해줘야하는데 이는 매우 복잡하고 시간이 걸리는 작업이다.
Fargate는 EC2처럼 가상환경을 제공하지만 단순히 가상환경이 아닌 ‘컨테이너’를 실행할 수 있는 가상환경을 제공한다. 심지어 컴퓨터 사용량을 알아서 할당하기 때문에 EC2처럼 인스턴스를 복잡하게 설정할 필요가 없으며, Docker를 사용할 경우 Docker로 만들어진 image만 올리면 바로 실행할 수 있기 때문에 컨테이너 단위로 프로그램을 올릴 경우 EC2보아 훨씬 간편하게 실행할 수 있다.
선택 순서
- 손쉬운 생성 방식
- MySQL
- 프리티어 선택
- 이후 DB이름 결정
- 마스터 이름과 비밀번호 설정
- VPC 보안그룹 클릭
- 밑에 인바운드 규칙 추가한다.
-> 포트를 3306으로 소스는 상관없으므로 IPv4, v6을 선택하여 생성한다.
- 인스턴스 시작 클릭
- 생성 3단계 : RDS와 같은 VPC 사용
생성 5단계 : key, value 지정
인스턴스 선택 후 연결 클릭
인스턴스 연결후 bash창에서 MySQL client 설치를 진행한다.$ sudo yum update -y $ sudo yum install -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm $ sudo yum install -y mysql-community-client $ mysql -u [RDS 마스터 사용자 이름] -p -h [RDS end-point]
※ RDS 마스터 사용자 이름은 RDS생성시 만들었던 것
※ RDS end-point는 RDS 연결&보안에서 확인 가능
create database flask_db;
use flask_db;
create table test (
‘user_id’ int(10) not NULL auto_increment,
‘user_name’ varchar(45) default NULL,
‘user_email’ varchar(45) default NULL,
‘user_password’ varchar(50) default NULL,
primary key (‘user_id’)
) auto_increment=1 default charset=utf8;
insert into test values(1,‘hyeon’, ‘email’,’1234’);
insert into test values(1,‘hyeon’, ‘google@gmail.com’,’1234’);
task definition 정의
- 작업 정의 이름 : flasktask
- 작업 크기 : 최소, 작업 CPU : 최소
- 이미지 : dockerhub의 이미지 이름, 태그
- 포트 매핑 : 5000
환경변수 추가
- DB_USER : [RDS 마스터 이름]
- DB_PASSWPRD : [RDS 마스터 암호]
- DB_NAME : [테이블 이름]
- DB_HOST : [RDS Endpoint]
※ key는 flask의 db config 파일에서 설정한다.
클러스터 구성
- Create Cluster
- 클러스터 템플릿 : networking only
- 구성 : 이름만 쓰고 생성
이후 클러스터를 실행 -> 새 작업 실행 클릭
- FARGATE 선택
- task definition 선택
- VPC는 RDS의 VPC 선택
- 서브넷 모두 추가
- 보안그룹 편집
포트 5000 추가
- 자동할당 퍼블릭 IP : ENABLED
- 작업실행 클릭
- 클러스터 작업 클릭 -> 네트워크 확인
{IP}:5000으로 URL접속하여 동작을 확인한다.
Dictionary tree
Project/
├── templates/
│ ├── index.html
│ └── test.html
├── app.py
├── dbModule.py
├── dockerfile
└── requirements.txt
1. 먼저 pymysql을 쓰기때문에 requirements.txt를 아래처럼 작성한다
Flask pymysq
2. 다음으로 dbModule.py을 새로 만들어서 db관련 각종 함수와 실제 RDS의 db와 연결하기 위한 파라미터를 지정한다.
import pymysql
class Database():
def __init__(self):
self.db = pymysql.connect(host='{AWS RDS의 endpoint주소}',
user='admin',
password='admin1234',
db='flask_db',
charset='utf8')
self.cursor = self.db.cursor(pymysql.cursors.DictCursor)
def execute(self, query, args={}):
self.cursor.execute(query, args)
def executeOne(self, query, args={}):
self.cursor.execute(query, args)
row = self.cursor.fetchone()
return row
def executeAll(self, query, args={}):
self.cursor.execute(query, args)
row = self.cursor.fetchall()
return row
def commit(self):
self.db.commit()
코드 출처 : https://kkamikoon.tistory.com/162
3. test용 html을 작성한다.
간단하게 실제 db의 데이터를 가져올 수 있는지만 확인하기 위해 간단히 변수값을 출력하는 형태로 만들어 준다.
<!DOCTYPE html>
<html lang="kr">
<head>
<h1> head Test </h1><br>
</head>
<body>
<div>
SELECT result : {{resultData}}<br>
</div>
</body>
</html>
4. app.py를 수정한다.
from flask import Flask, render_template
import dbModule
app = Flask(__name__)
@app.route('/select', methods=['GET'])
def select():
db_class = dbModule.Database()
sql = "SELECT * FROM flask_db.test"
row = db_class.executeAll(sql)
print(row)
return render_template('test.html', resultData=row)
@app.route('/')
def index() :
return render_template('index.html')
if __name__ == '__main__' :
app.run(debug=True)
코드 출처 : https://kkamikoon.tistory.com/162
git에 push를 하면 지난차시에 미리 만들어둔 action에 의해 docker image가 생성되어 dockerhub에 등록된다.
그리고 위에서 미리 만들어둔 ECS Fargate에서 dockerhub의 repo에서 해당 image를 가져와서 컨테이너를 생성하도록 설정해두었기에 곧바로 클러스터에서 새 작업을 실행하면 된다.
진행하면서 참고했던 사이트
RDS 설명
https://velog.io/@david419kr/AWS-S3-EC2-RDS%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
Fargate 설명
https://m.blog.naver.com/ljk041180/221967258214
RDS와 Fargate설정
https://velog.io/@jooseop/3.-AWS-ECS-Fargate-RDS-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
db웹 개발
https://kkamikoon.tistory.com/162