Docker를 사용한 aws배포하기3

HyeonSeok·2022년 3월 13일
0

Docker Publish

목록 보기
3/4
post-thumbnail

Intro

[주제] 클라우드에 어플리케이션 배포

CI도구를 통해서 도커 빌드 까지 성공적으로 하였습니다. 이번에는 AWS RDS를 클라우드 구성하고 코드에 DB와 연동되는 로직을 추가 하여 서비스를 클라우드 위에서 구성 해보세요

1) 클라우드에 Database를 생성 및 Table 구성
2) Database에 간단히 읽고 쓸 수 있도록 웹어플리케이션 추가 기능 개발
3) EC2 인스턴스 혹은 ECS에 컨테이너를 구성해보고 DB와 연동

RDS와 Fargate

Amazon Relational Database Service(RDS)

클라우드에서 관계형 데이터베이스를 더욱 쉽게 설정, 운영 및 확장할 수 있도록 지원하는 웹 서비스이다.
이 서비스는 산업 표준 관계형 데이터베이스를 위한 경제적이고 크기 조절이 가능한 용량을 제공하고 공통 데이터베이스 관리 작업을 관리한다.
즉, 필자는 RDS란 클라우드상에서 관계형 데이터베이스를 독립적으로 관리할 수 있게 해주는 서비스라고 이해했습니다.

  • DB 인스턴스
    RDS의 기본 빌딩 블록은 DB 인스턴스이다.

  • 보안그룹
    RDS는 보안그룹을 활용하여 접근을 제한시킬 수 있다. 보안그룹에 미리 등록한 사람만 접근 하도록 만들어서 보안상으로 안전성을 높인다.

Fargate

EC2처럼 기본인프라 관리없이 컨테이너를 배포하고 관리할 수 있는 기능이다.

EC2와의 차이는 무엇인가? EC2는 말그대로 가상서버를 제공하는 것으로 EC2에서도 가상서버로써 프로그램을 실행시킬 수 있다. 하지만 EC2는 ‘인스턴스’라는 가상컴퓨팅 환경을 설정해줘야하는데 이는 매우 복잡하고 시간이 걸리는 작업이다.
Fargate는 EC2처럼 가상환경을 제공하지만 단순히 가상환경이 아닌 ‘컨테이너’를 실행할 수 있는 가상환경을 제공한다. 심지어 컴퓨터 사용량을 알아서 할당하기 때문에 EC2처럼 인스턴스를 복잡하게 설정할 필요가 없으며, Docker를 사용할 경우 Docker로 만들어진 image만 올리면 바로 실행할 수 있기 때문에 컨테이너 단위로 프로그램을 올릴 경우 EC2보아 훨씬 간편하게 실행할 수 있다.

RDS 생성 및 관리

RDS 생성

선택 순서

  1. 손쉬운 생성 방식
  2. MySQL
  3. 프리티어 선택
  4. 이후 DB이름 결정
  5. 마스터 이름과 비밀번호 설정

  1. VPC 보안그룹 클릭
  2. 밑에 인바운드 규칙 추가한다.
    -> 포트를 3306으로 소스는 상관없으므로 IPv4, v6을 선택하여 생성한다.

RDS와 EC2 연동

  • 인스턴스 시작 클릭
  • 생성 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 연결&보안에서 확인 가능

Database 생성

database 생성

create database flask_db;
use flask_db;

table 생성

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;

data 삽입

insert into test values(1,‘hyeon’, ‘email’,’1234’);
insert into test values(1,‘hyeon’, ‘google@gmail.com’,’1234’);

docker image 배포

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접속하여 동작을 확인한다.

db연동 웹어플리케이션

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

최종 Test

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

profile
즐겁게 사는 개발자가 됩시다

0개의 댓글