AWS 클라우드 배포환경 기초 - 스파르타 3주차

AWS

목록 보기
2/16
  • RDBMS (Relation DataBase Management System):
    관계형 데이터베이스, 서비스의 메인 데이터베이스 - 정형화, 픽스된 회원정보
    → 제품: Oracle, MySql 등
    → RDBMS는 엑셀과 같은 표의 형태로 데이터가 저장됨.
  • NoSql : 비정형화된 데이터, 관리하는데 퍼포먼스가 더 난다.

→ 제품 : MongoDB 등
→ NoSql은 json 형태로 저장. column이 정형화 되어있지 않아서 추가할 때 flexible하다.


  • RDS : AWS에서 managed 되는 관계형 데이터베이스 서비스 & 비용은 비싸지만, 개발에만 집중하게 해줌.

    → aws 에서 Mysql 프리티어 권한으로 생성. Mysql의 기본 포트는 3306.

# pycharm에서 mysql 이용하는 법
pycharm 에서 오른쪽의 database 에 들어가서 mysql을 하나 생성.

schema 를 하나 만들고(생성 시, 새로만든 rds의 엔드포인트를 집어넣음)  그 안에 file을 만듦. file의  column하나를 file_name 으로 설정.

실행하고 싶은 곳에 커서를 두고, cmd + enter 누르면 실행시킬 수 있음.

< 백엔드 app.py 코드 > - RDS 와 연동됨

import boto3
from flask import Flask, render_template, request, jsonify
from flask_cors import CORS
import os
from flaskext.mysql import MySQL

application = Flask(__name__)

# cors
cors = CORS(application, resources={r"/*": {"origins": "*"}})

# mysql
mysql = MySQL()
application.config['MYSQL_DATABASE_USER'] = os.environ["MYSQL_DATABASE_USER"]
application.config['MYSQL_DATABASE_PASSWORD'] = os.environ["MYSQL_DATABASE_PASSWORD"]
application.config['MYSQL_DATABASE_DB'] = os.environ["MYSQL_DATABASE_DB"]
application.config['MYSQL_DATABASE_HOST'] = os.environ["MYSQL_DATABASE_HOST"]
mysql.init_app(application)


@application.route('/')
def main():
    return "핵심 쏙쏙 AWS"

@application.route('/fileupload', methods=['POST'])
def file_upload():
    file = request.files['file']
    s3 = boto3.client('s3',
                      aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
                      aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"]
                      )
    s3.put_object(
        ACL="public-read",
        Bucket=os.environ["BUCKET_NAME"],
        Body=file,
        Key=file.filename,
        ContentType=file.content_type
    )

    conn = mysql.connect()
    cursor = conn.cursor()
    cursor.execute("insert into file(file_name) value('" + file.filename + "')")
    conn.commit()
    conn.close()

    return jsonify({'result': 'success'})

@application.route('/files', methods=['GET'])
def files():
    conn = mysql.connect()
    cursor = conn.cursor()
    cursor.execute("SELECT file_name from file")
    data = cursor.fetchall()
    conn.close()

    return jsonify({'result': 'success', 'files':data})


if __name__ == '__main__':
    application.debug = True
    application.run()
  • 결과물 : 설정은 RDS를 통해, 접속은 cloudfront의 도메인을 통해.

  • Redis : 인메모리 DB.
    → 아주 많이 쓰임. 오픈소스, 업그레이드가 잘돼서 성능이 좋음.

  • RDBMS(Mysql) : 파일에 데이터 저장 vs 인메모리 디비(Redis)
    → 메모리에 데이터 저장. 속도가 더 빠름.
    → RDBMS의 부하를 줄여주기 위해서 Redis를 같이 씀.

  • RDS → MySQL 매니지드 해줌.

  • ElastiCache → Redis 매니지드 해줌. (Memchached 도, 2가지)


  • aws 에서 RDS를 생성할 때 보안그룹을 같이 생성했는데, Redis는 보안그룹을 미리 만들어둬야함.

  • Redis의 기본포트는 6379, 소스는 0.0.0.0/0 으로 설정해도 외부에서 접속이 안됨. aws 내에서만 접속가능.

  • EB에 배포해서 확인가능.

# redis
db = redis.Redis(os.environ["REDIS_HOST"], decode_responses=True)  // redis를 선언

s3.put_object(
        ACL="public-read",
        Bucket=os.environ["BUCKET_NAME"],
        Body=file,
        Key=file.filename,
        ContentType=file.content_type 
    )     //파일 s3에 업로드

    conn = mysql.connect()
    cursor = conn.cursor()
    cursor.execute("insert into file(file_name) value('" + file.filename + "')")
    conn.commit()
  // 데이터 베이스에 저장

    cursor.execute("SELECT count(*) from file") // 데이터베이스 파일의 테이블에 저장된 데이터의 개수를 select문으로 읽어옴 
    data = cursor.fetchone()
    conn.close()
    db.set("fileCount", data[0])  //redis db안에 fileCount라는 키값으로 데이터의 개수가 몇개인지 저장

    return jsonify({'result': 'success'})



@application.route('/file/count', methods=['GET'])
def file_count(): 
    return jsonify({'result': 'success', 'count':db.get("fileCount")})

→ redis의 데이터베이스에 저장되어 있는 key값인 fileCount를 가져와서 뿌려줌

파일 갯수를 가져올 때는 MySQL에서 가져오는 것 보다 Redis(ElastiCache)에서 가져오는게 더 효율이 높음.


  • Elasticsearch : 검색엔진 오픈소스 (무료)
    요즘에는 많은 분야에서 Elasticsearch를 ELK라는 스택으로 변화시켜서
    로그분석, 비정형화된 데이터를 분석하는 용도로 많이 사용함.
  • ELK 스택 : ELK에서 로그중앙화 해서 kibana에서 검색하면 볼수있는 형태가 된 것이 ELK 스택.
    E: Elasticsearch
    L: Logstash → logstash는 ElasticSearch 서비스에서 제공해주지 않음.
    K: Kibana (지금은 aws 상에서 kibana = OpenSearch 대시보드 url로 변경됨)

logstash 설치하기

# 우분투 접속 
ssh -i <키페어> ubuntu@<ec2퍼블릭ip4주소>

# java 설치
sudo apt-get update  // 패키지 업데이트
sudo apt-get install openjdk-8-jdk  //설치

# logstash 설치

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - //다운로드

sudo apt-get install apt-transport-https // 패키지 설치

echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list // 패키지 repository 설치

sudo apt-get update && sudo apt-get install logstash // 패키지 업데이트 & 설치

# logstash 실행

sudo vi /etc/logstash/conf.d/logstash-python.conf // 설정파일 생성

# 설정파일 밑에 코드 
# hosts : elasticsearch 도메인 endpoint , user : es설치시에 본인이 설정한 이름 , password 도 설정한 것.

input {
  tcp {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["<es 엔드포인트 도메인 주소>:443"]  // 꺽쇠는 제거
    index => "flask-logs-%{+YYYY.MM.dd}"
    user => "admin"
    password => "Aa12345!"
    ssl => true
    ilm_enabled => false
  }
}

# 실행
sudo systemctl start logstash.service

# logstash 정상적으로 실행됐는지 확인
netstat -tnlp


<정리>

  • 클라우드를 사용하는 이유 : DevOps(Development Operation)를 같이할 수 있는 환경
  • RDS 는 RDBMS를 쉽게 운영하여 개발에 집중하게 해주는 서비스
  • ElastiCache 는 Redis를 쉽게 다루도록 하여 RDBMS + Cache 를 사용하여 서비스를 좀 더 안정적으로 운영하게 해주는 서비스
  • Elasticsearch Service 는 로그를 저장하고, 데이터화를 할수있게 해주는 데이터베이스 서비스
profile
백엔드를 공부하고 있습니다.

0개의 댓글