

→ 제품 : 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()
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)에서 가져오는게 더 효율이 높음.

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 는 로그를 저장하고, 데이터화를 할수있게 해주는 데이터베이스 서비스