본문 바로가기
Study/AWS

AWS(5) - DataBase

by 왕방개 2024. 4. 16.

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 는 밑에를 선택할 수 있는데 이를 잘못 누르면 가격이 어마어마하게 나옴

 

-스토리지 선택

기본 세팅으로 해도 충분히 사용할만함.

 

=>인스턴스 선택

 

안에서 밖으로 나갈때 제어하는 파트. 따로 클릭 안해도 됨

 

 

현업에서는 포트 번호를 바꿔서 써야합니다
모니터링. 체크하면 돈나가유

-추가 구성을 눌러서 처음 만들어지는 데이터베이스를 생성해야함

기본 백업은 aws에서 제공해줍니다

하고 데이터베이스 생성하면 됨

 

 

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