1.데이터 저장소 종류
1)RDBMS
=>Amazon, Aurora,Amazon RDS(Oracle,MySQL,Maria DB, PostgreSQL,IBM DB2), Amazon Redshift
2)key-value Database
=>Amazon DynamoDB
=>높은 트래픽의 web application에 추천
3)In -Memory DB
=>ElastiCache, Memory DB for Redis
=>Caching, 세션관리, 게임 순위표, 지리 공간 애플리케이션 등에 추천
4)Document DB
=>Amazon의 Document DB - MongoDB 호환
=>콘텐츠 관리, 카탈로그, 사용자 프로필 등 읽기 전용 애플리케이션에 추진
5)Wide Column DB
=>Amazon의 Keyspaces
=>장비 관리나 경로 최적화 등 이력에 추천
6)Graph DB
=>Amazon의 Neptune
=>부정 탐지, 소셜 네트워킹, 추천 엔진 등에 추천
7)Time Series
=>Amazon Timestream
=>IoT Application, DevOps, 산업용 텔레메트리 등에 추천
8)Ledger
=>QLDB: Amazon Ledger Database Service
=>레코드 시스템 공급망 관리, 은행 거래, 블럭 체인등에 추천
9)S3 와 같은 파일 저장소
2.Amazon RDS
1)개요
=>Amazon에서 제공하는 관계형 데이터베이스 서비스
=>Managed Service: 관리나 업데이트를 직접 할 필요가 없음
2)장점
=>Managed Service
3)단점
=>종류나 버전이 한정되어 있음
4)종류
=>MySQL: 현재까지 가장 많이 사용된 관계형 데이터베이스
=>Maria DB: MySQL 의 fork
=>Oracle: 대기업에서 많이 사용되는 가장 안정적인 RDBMS - 금융이나 대기업이 주로 사용, 라이센스 비용 추가: 사용해야 할 것 같다면 사용할 수 있는 컴퓨터에 Oracle 을 설치하고 port forwaarding을 이용해서 사용
=>MS SQL Server: 중소규모 기업에서 많이 사용하는 데이터베이스로 유료: 우리나라 게임회사들은 MSSQL Server에서 MySQL이나 MariaDB 또는 Postgre SQL로 많이 이전
=>PostgreSQL: 최근에 많이 사용 - Micro Service로 Migration할 때 많이 사용
=>IBM DB2: 예전에 금융에서 많이 사용
=>Aurora MySQL , Aurora Postgre SQL: Amazon에서 코드를 수정해서 제공하는 RDBMS, 견고하고 성능이 뛰어남
클러스터를 3개 구성
MySQL -> 데이터 전체를 복사
Aurora MySQL -> 변경 내역을 수행
MySQL + MySQL
Service + Service
5)외부에서 접속 가능한 RDS 서비스 생성
=>RDS 서비스에 접속
=>데이터베이스 생성 클릭
-사용하고자 하는 DB 선택하고 내려가기
우리가 기본으로 만들면 DB는 1개지만, 실무에서는 2개정도 만듬
-Template 에서 Free Tier 선택
production이나 Dev/Test 는 밑에를 선택할 수 있는데 이를 잘못 누르면 가격이 어마어마하게 나옴
-스토리지 선택
기본 세팅으로 해도 충분히 사용할만함.
=>인스턴스 선택
-추가 구성을 눌러서 처음 만들어지는 데이터베이스를 생성해야함
하고 데이터베이스 생성하면 됨
6)외부에서 접속
=>RDS 를 생성할 떄 퍼블릭 엑세스가 가능하도록 생성을 하면 IPv4 주소가 주어지면서 End Point가 만들어지는데 End Point 가 외부에서 접속할 수 있는 URL 이 됩니다
End Point를 이용해서 외부 접속이 가능합니다.
=>외부 접속이 되지 않는 경우
-보안 그룹에서 포트를 개방하지 않는 경우: 보안 그룹을 확인해서 인바운드 규칙을 설정
하고 dbeaver 에서 allowPublicKeyRetrival 수정하면 연결 성공!
7)MySQL 의 파라미터 수정
=>MySQL을 설치하면 설정 파일을 수정해서 MySQL의 설정을 원하는 형태로 변경합니다
=>RDS는 직접 설치한 데이터베이스가 아니라서 환경 설정 파일을 직접 수정할 수 없습니다
=>파라미터 그룹을 만들어서 수정합니다
=>수정 및 적용
- RDS에서 파라미터 그룹을 클릭
- 파라미터 그룹 생성을 클릭
- 파라미터 그룹 세부 정보 설정
데이터베이스 종류 선택
그룹 이름 과 설명을 작성
- 생성된 파라미터 그룹을 선택해서 파라미터를 수정
편집 버튼을 클릭하고 원하는 파라미터 수정
- RDS의 데이터베이스를 선택
수정 버튼을 누르고 추가 구성으로 가서 파라미터 그룹을 생성한 것으로 수정
- RDS는 파라미터를 수정하면 재부팅을 해야 적용이 됩니다.
7)활용 방법
=>EC2 인스턴스에 Database를 설치해서 사용
-거의 모든 종류의 데이터베이스를 사용하는 것이 가능
-관리를 직접해야하기 때문에 데이터베이스에 대해서 잘 알아야합니다.
-라이센스가 있는 데이터베이스(Oracle 이나 MySQL 등)를 사용하는 경우 주의해야 합니다.
=>AWS가 제공하는 관리형 데이터베이스를 이용
-데이터베이스에 제한이 있음
-관계형 데이터베이스의 경우는 Oracle, MySQL, Maria DB, Postgre SQL, MS SQL Server, IBM DB2 만 사용 가능
-Oracle 과 MS SQL Server 그리고 DB2는 라이센스 비용이 같이 청구됩니다.
=>No SQL 지원
Key - Value 데이터베이스(Redis 호환) 와 Document DB(Mongo DB 호환) 지원
Dynamo DB는 아마존이 직접 만든 데이터베이스
3.Mongo DB는 Document DB
1)클러스터 생성
2)클러스터를 클릭하면 접속 방법이 제공
=>wget 명령은 linux 명령어라서 인증서를 받아올 수 없으므로 브라우저에 url을 직접 입력
global-bundle.pem 파일을 다운로드 받습니다.
=>mongo shell에서 접속
mongosh --ssl --host docdb-2024-04-16-01-41-17.cluster-cesn3uejbkwe.ap-northeast-2.docdb.amazonaws.com:27017 --sslCAFile pem파일경로 --username 사용자계정 --password 사용자비밀번호
=>응용 프로그램에서 접속
mongodb://계정:비밀번호@docdb-2024-04-16-01-41-17.cluster-cesn3uejbkwe.ap-northeast-2.docdb.amazonaws.com:27017/?tls=true&tlsCAFile=pem파일경로&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false
- 파이썬이나 자바에서 사용하고자 하는 경우는 pem 파일의 경로가 절대로 변하면 안되기 때문에 s3 와 같은 저장소를 이용하거나 프로젝트 안에 포함시켜야 합니다.
프로젝트 안에 포함시키면 소스 코드를 다른 곳에 업로드하면 같이 업로드가 된다는 문제가 발생합니다.
4.기본적인 CQRS 구현
=>읽기 서비스 와 그 이외의 작업을 처리하는 서비스로 나눕니다.
=>각 서비스는 별도의 데이터베이스를 사용합니다.
=>읽기 서비스는 NoSQL을 그 이외의 작업을 처리하는 서비스는 RDBMS를 사용하는 것을 권장합니다.
=>2개의 데이터베이스 동기화는 Kafka 와 같은 Message Queue 프로그램을 이용해서 수행합니다.
============================================================================================
**AWS S3
1.AWS에서 백업하는 방법
1)백업의 형태
=>On-premiss 환경의 데이터를 AWS에 백업
=>AWS에 구축한 시스템을 백업
2)인프라 설계 핵심 사항
=>스토리지 게이트웨이를 이용한 자동 백업
=>S3 와 글래셔를 이용한 수명 주기 관리
S3는 파일 원본을 저장
글래셔는 압축해서 저장 - 용량을 줄이기 위해서 사용
=>데이터베이스 백업의 경우 데이터베이스를 이용해서 복사본을 저장해도 되지만 스크립트를 사용해서 S3에 저장하면 비용을 줄일 수 있습니다.
3)백업 방법
=>S3 이용
=>EC2를 이용해서 백업 시스템을 구축
=>스토리지 게이트웨이를 이용
2.S3
1)개요
=>Simple Storage Service의 약자
=>인터넷 스토리지 서비스
=>웹을 이용해서 접근하는 것이 가능
=>파일 스토리지의 역할 과 정적 Web Site(클라이언트 웹 애플리케이션)를 배포할 수 있음
2)기본 개념
=>bucket: 저장소
=>object: 객체로 파일의 경로 와 파일의 내용을 가지고 있습니다.
파일 1개의 크기는 5TB까지 가능
3)버킷을 사용할 때 외부에서 사용하고자 하면 IAM 사용자를 등록해야 합니다.
3.S3 기능을 사용할 수 있는 사용자 생성
1)IAM 서비스로 이동
2)사용자 탭에서 사용자 생성을 클릭
=>직접 정책 연결을 선택
=>s3로 검색을 해서 Amazons3FullAccess를 선택
=>권한을 확인하고 사용자 생성을 선택
3)만들어진 사용자를 클릭
=>엑세스 키 만들기를 클릭
=>Command Line Interface를 체크한 후 다음을 클릭
=>태그에 설명을 작성하고 엑세스 키 작성을 클릭
=>Access Key 와 Secret Access Key가 작성되어 있는데 이 정보를 이용해서 사용자를 이용
=>이 2개의 key는 절대로 코드에 노출되면 안됩니다.
이 2개의 key가 코드에 노출되면 AWS 계정은 중지됩니다.
GIT 에 배포할 때 이 2개의 key를 사용해야 하는 경우에는 Git Hub 의 Action에 Secret 으로 등록을 해서 사용을 해야 합니다.
4.S3 버킷 생성
1)S3 서비스에서 버킷 생성
=>S3 서비스에서 버킷 만들기를 클릭
=>버킷 이름 입력
=>외부에서 사용을 할려면 객체 소유권을 [ACL 활성화됨] 으로 선택
=>이 버킷의 퍼블릭 액세스 차단 설정을 해제해야 외부에서 업로드가 가능
2)생성한 버킷을 외부에서 사용할 수 있도록 설정을 수정
=>버킷을 클릭하고 [권한] - [Bucket 정책]에서 [편집]을 누르고 코드를 추가: 외부에서 하나의 객체를 가져갈 수 있고 목록을 가져갈 수 있고 삽입(수정) 과 삭제를 할 수 있는 권한을 설정
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicListGet",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:List*",
"s3:Get*",
"s3:Put*",
"s3:Delete*"
],
"Resource": [
"arn:aws:s3:::Bucket이름",
"arn:aws:s3:::Bucket이름/*"
]
}
]
}
=>CORS 설정으로 가서 편집을 누르고 추가
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET",
"PUT",
"POST",
"DELETE"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": ["Access-Control-Allow-Origin"]
}
]
=>SOP 와 CORS
- SOP(Same Origin Policy)
자바스크립트의 ajax(fetch api 포함)는 SOP(동일 출처 정책)가 적용됩니다.
다른 도메인에서는 데이터를 가져오지 못합니다.
도메인은 IP:Port 까지 입니다.
IP가 같아도 Port가 다르면 데이터를 가져오지 못합니다.
이런 경우 해결책은 데이터를 제공하는 서버에서 허용을 해주던지 아니면 Proxy를 구축해서 데이터를 가져오도록 만들어야 합니다.
Proxy는 자바스크립트를 제외한 Java 나 Python 또는 node 와 같은 프레임워크를 이용해서 구축이 가능합니다.
단 react 나 vue에서는 설정만으로 proxy 구축이 가능
- CORS(Cross Origin Resouce Sharing)
다른 출처 와 데이터를 공유할 수 있는 기능
웹 서버를 만들 때 다른 도메인을 가진 웹 클라이언트에서 ajax를 이용해서 데이터를 가져갈 수 있도록 설정하는 것입니다.
웹 프로그래밍을 할 때 클라이언트 와 서버 애플리케이션을 별개로 구현하는 경우 서버 쪽에 이 설정을 해주어야 클라이언트에서 데이터를 가져갈 수 있습니다.
서버 프레임워크마다 설정하는 방법이 다름
5.버킷 사용
1)관리 콘솔에서 사용
=>버킷에서 업로드 가능
=>업로드된 파일의 URL: https://버킷이름.s3.리전이름.amazonaws.com/파일경로
2)Django 에서 파일 업로드
=>필요한 패키지 설치
django
mysqlclient
Pillow
django-bootstrap4: 장고에서 템플릿 이용해서 출력할 때 디자인을 빠르게 하기 위해서 사용
=>장고 프로젝트 생성
django-admin startproject myproject .
=>장고 애플리케이션 생성
python manage.py startapp fileupload
=>설정 수정 - settings.py 파일 수정
#모든 곳에서 실행
ALLOWED_HOSTS = ['*']
#fileupload는 애플리케이션 이름으로 장고는 애플리케이션을 생성하면 여기에 등록을 해야 사용 가능
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"fileupload",
"bootstrap4"
]
#데이터베이스 설정
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "데이터베이스이름",
"USER": "계정",
"PASSWORD": "비밀번호",
"HOST":"데이터베이스 End Point",
"PORT":"포트번호"
}
}
=>models.py 파일에 모델을 생성
- 파일의 이름, 파일의 내용 및 경로, 내용을 저장할 수 있는 모델 생성
from django.db import models
class FileUpload(models.Model):
title = models.TextField(max_length=40, null=True)
imgfile = models.ImageField(null=True, upload_to="", blank=True)
content = models.TextField()
#인스턴스를 출력하고자 하는 경우 호출되는 메서드
def __str__(self):
return self.title
=>데이터베이스 연동이 되는지 확인
python manage.py makemigrations
python manage.py migrate
=>django는 기본적으로 애플리케이션이름_모델이름 으로 테이블을 생성
mysql은 테이블 이름에 대문자를 사용하지 않으므로 모델 이름이나 애플리케이션 이름에 대문자가 포함되어 있으면 소문자로 변경
=>2개의 디렉토리 생성
- fileupload 디렉토리에 templates 디렉토리(장고에서 클라이언트에게 전송할 뷰를 저장하는 디렉토리) 생성: 최근에는 뷰를 클라이언트에서 만들기 때문에 실제 사용은 거의 안함
- 프로젝트에 media 디렉토리(장고에서 현재 프로젝트 안에 업로드 한 파일을 저장하기 위해서 사용하는 디렉토리) 생성: 업로드된 파일이 프로젝트에 포함되면 프로젝트의 크기가 커지고 프로젝트 외부에서는 접근할 수 없기 때문에 실제 구현은 대부분 S3 같은 외부 저장소를 이용
=>파일 업로드 폼을 위한 forms.py 파일을 fileupload 디렉토리에 생성하고 작성
from django.forms import ModelForm
from .models import FileUpload
#FileUpload 모델의 title, imgfile, content 필드의 자료형을 확인해서
#입력폼을 생성해주는 클래스
class FileUploadForm(ModelForm):
class Meta:
model = FileUpload
fields = ["title", "imgfile", "content"]
=>요청을 처리하는 내용을 작성 - views.py
'Study > AWS' 카테고리의 다른 글
AWS(7)-S3 에 Spring Boot 프로젝트 업로드 (0) | 2024.04.18 |
---|---|
AWS(6)-S3에 파일 upload(Django, Spring Boot, react) (2) | 2024.04.17 |
AWS(4) (0) | 2024.04.15 |
AWS(3) (0) | 2024.04.13 |
AWS(2)-EC2 를 활용해 MySQL 접속 (0) | 2024.04.11 |