AWS

AWS_Chaper6~10_요약

강용민 2022. 6. 9. 12:31

Chapter06_RDS

RDS는 Relation Database Service의 약자로 클라우드에 데이터 베이스를 구축할 수 있는 환경을 만들어 주는 서비스이다

RDS에는 Amazon Aurora(MySQL 호환), Amazon Aurora(PostgreSQL 호환), MySQL, MariaDB, PostgreSQL, Oracle 및 SQL Server의 7가지 주요 엔진이 있으며, 이번 시간에 실습해볼 엔진은 MySQL이다. 

 

실습

1.AWS에서 RDS를 검색하면 들어가면 볼 수 있는 페이지에서 데이터베이스 생성을 클릭한다.

 

2.데이터베이스 생성 방식 선택 & 엔진 옵션

데이터베이스 생성을 클릭하면 들어갈 수 있는 페이지이다.

여기서 데이터베이스 생성 방식 선택은 표준 생성으로 하고, 엔진은 앞서 말했듯이 MySQL를 할 것이기에  MySQL엔진을 선택할 것이다.

 

3.템플릿 & 설정

템플릿은 비용이 안나가는 프리티어로 설정하고, 설정은 다음 그림과 같이 있다.

  • DB 인스턴스 식별자 : DB의 이름을 설정한다.단, DB이름은 AWS리전(ex 서울)내에서 중복되지않아야한다
  • 마스터 사용자 이름 : 최상위권한을 가질 마스터 사용자의 이름을 설정한다. 즉, Root계정의 이름 설정이다.
  • 마스터 암호 : 마스터 사용자가 사용할 비밀번호이다.

 

4.인스턴스 구성 & 스토리지

인스턴스 구성은 DB 성능을 선택하는 것이다. DB성능이 좋으면 좋겠지만 그만큼의 비용이 청구된다. 위 템플릿에서 프리 티어를 선택했기에 db.t3.micro로 자동 설정되어 있기에 이 설정을 그대로 사용한다.

스토리지는 DB 저장용량를 설정한다. 이 또한 기본설정에 따른다.

5. 연결

연결은 보안과 관련된 설정이다. VPC의 경우 후에 변경가능하여 기본설정으로 한다.

만약 보안이 걱정되어 DB접근 IP를 제한하고 싶다면 후에 VPC설정을 바꾸면 된다.

 

VPC : 사용자의 AWS 계정 전용 가상 네트워크

서브넷 그룹 : VPC의 IP주소 범위

퍼블릭 엑세스 : 선택한 VPC 보안그룹 외 외부에서 해당 DB에 접근 허용여부

VPC 보안 그룹 : DB 접근 가능한 IP 설정. 

 

6.데이터베이스 인증

말그대로 데이터베이스에 접근하는 방법을 설정하는 것이다.

 

7.데이터베이스 생성

모든 설정이 완료가 되면 RDS 데이터베이스에 들어가면 다음과 같은 이미지를 볼 수 있다.

이번에 만든 DB 식별자(이름)을 database-mysql로 설정하였고, 오류없이 잘 생성된 것을 볼 수 있다.

 

DB설정

database-mysql를 클릭하면 볼 수 있는 페이지이다.

아래 그림의 모든 설정을 다 사용할 줄 알면 좋겠지만 그 중 연결 & 보안, 유지 관리 및  백업을 알아보겠다.

 

연결 & 보안

엔드포인트 : 해당 DB에 접근할 수 있는 URL이다. 외부(ex : EC2 인스턴스)에서 해당 DB로 접근하려면 엔드포인트를 이용해 접근해야한다.

포트 : 해당 DB에 접근할 포트이다. MySQL은 3306포트를 사용하기에 3306포트로 설정되어 있다.

VPC 보안 그룹 : 외부에서 접근할 IP를 설정한다.

VPC 보안 그룹

VCP 보안 그룹을 클릭하면 넘어가는 페이지이다.

우리가 볼 것은 인바운드 규칙이다. 인바운드 규칙은 해당 DB접근 TCP/IP를 설정하는 것으로 3306포트를 열어줘야 한다.

인바운드 규칙 편집을 클릭해 편집하자.

맨 위에 3306포트로 받는 행을 볼 수 있다. Anyware-IPV4로 설정하여 모든 주소를 받았다.

 

유지 관리 및 백업

백업 : 일반적으로 생각하는 백업이다. 자동 백업이 일주일 단위로 이뤄져있는 것을 알 수 있다.

스냅샷 : 확인 당시의 DB자료를 저장한 것이다. 즉, 백업파일이다. 나중에 복원할때 필요하다.

 

실습

Ubuntu에서 들어가는 법

Ubuntu에서 해당 DB를 접근하기 위해서는 다음의 명령어가 필요하다.

-h는 host 옵션이고, -p는 패스워드를 묻겠냐는 옵션이다.

처음 접속 시에는 따로 유저가 없기에 마스터 유저로 접속한다. 나중에 유저를 하나 만들면 해당 유저 계정으로 들어가면된다.

mysql -u <마스터네임> -p -h <엔드포인트>
#ex) mysql -u admin -p -h ~

 

Database 생성

현재 데이터베이스는 위그림과 같이 있다. 위에있는 데이터베이스는 마스터계정으로 접속했기에 보이는 것이다.

clouddb라는 이름의 데이터 베이스를 하나 만들고, 'cloudusr'라는 유저를 만들어보자.

#clouddb 데이터베이스 생성
create database clouddb;

#user 생성
#'%' : 어디서든 접속가능
#identified by '비밀번호'
create user 'cloudusr'@'%' identified by 'cloud';

이번에 새로 만든 유저로 접속을 해보자.

 

유저에게 권한주기

마스터 계정이 아닌 일반 계정으로 접속하면 접근할 수 있는 데이터베이스는 한정되어 있다.

그렇기에 유저에게 권한을 줘야한다. 권한을 주기 위해 마스터 계정으로 접속해 cloudusr에게 권한을 부여하자.

#사용권한 부여
#grant all privileges on <db명>.* to '<유저명>'@'%';
grant all privileges on clouddb.* to 'cloudusr'@'%';

#변경된 내용을 메모리에 반영(권한 적용)
flush privileges;

권한을 부여했으면, 일반 유저로 들어가 확인해보자.

확인해보면 데이터베이스 'clouddb'에 모든 권한이 부여되어 볼 수 있다.

 

Chapter07_네트워크 기초

네트워크

네트워크는 Net + Work의 합성어로 컴퓨터가 통신 기술을 이용하여 그물망처럼 연결된 통신 이용 형태를 의미한다.

즉, 두 대 이상의 컴퓨터들을 연결하고 서로 통신 할 수 있게 하는 것이다.

시스템은 다음과 같이 구성되어 있다.

  • 노드(Node) : 인터넷에 연결된 시스템
  • 호스트(Host) : 컴퓨터 기능이 있는 시스템
  • 클라이언트(Client) : 서비스를 요청하는 시스템
  • 서버(Server) : 서비스를 요청하는 시스템

네트워크 주소는 네트워크 상에 존재하는 노드를 고유하게 식별할 수 있게 해주는 일종의 식별자다.

주소는 다음과 같이 구성되어 있다.

  • MAC주소 : 모든 기기를 식별할 수 있도록 부여된 고유 주소이다. Link계층에서 사용하며, LAN 카드에 내장되어 있다.
  • IP 주소 : 모든 기기를 식별할 수 있도록 부여된 고유 주소이다. 네트워크 계층에서 사용한다.
  • 포트 번호 : 호스트 내 실행되고 있는 프로세스를 구분짓기 위한 식별 번호다. 전송 계층에서 사용한다.
  • 메일주소 : 메일 시스템에서 사용한다.

IP주소

네트워크상에서의 컴퓨터 간 의사소통에 관한 약속을 '프로토콜'이라 한다. TCP/IP는 가장 널리 사용되는 프로토콜 중 하나로 통신의 전송 및 수신을 다루는 TCP(Transmission Control Protocol)와 데이터 통신을 다루는 IP(Internet Protocol)로 구성되어 있다.

 

IP는 IPv4/IPv6 2가지 종류가 있으며, 일반적으로 IP주소라 하면 IPv4 주소를 의미한다.

IPv4는 전 세계적으로 사용된 첫 번째 인터넷 프로토콜로, 주소는 32비트 방식으로, 바이트마다 온점으로 구분한다.

IPv4는 0~2%32개의 주소를 가질 수 있는데, 전세계적으로 인터넷 사용자 수가 금증하면서 IPv4주소가 고갈될 위기에 처했다.

이러한 고갈 문제를 해결하이 위해 등장한 주소가 IPv6이다.

Ipv6는 IPv4의 주소체계를 128비트 크기로 확장한 차세대 인터넷 프로토콜 주소이다.

 

IP Class

하나의 IP주소에는 Network ID와 Host ID가 존재한다.

Network ID는 인터넷사에서 모든 Host들을 전부 관리하기 힘들기에 Network의 범위를 지정하여 그룹을 식별하기 위한 주소영역이다.

반면에 Host ID는 해당 네트워크에서 각각의 호스트를 식별하기 위한 주소영역이다.

IP Class는 하나의 IP주소에서 네트워크 영역과 호스트 영역을 나누는 방법으로 A,B,C,D,E Class로 나누어져 있다.

  • A Class : MSB가 항상 0이다.
    MSB를 제외한 맨 앞 1바이트가 Network영역이며, 나머지 3바이트는 Host영역으로 구분되어 있다.
    네트워크 주소 범위는 0~127까지 사용하여 2^7개이며, 호스트 주소 범위는 (2^24)-2 개이다.
  • B Class : 맨 앞 두 비트가 항상 10이다.
    네트워크 주소 범위는 128.0~191.255까지 사용하여  2^14개이며, 호스트 주소 범위는 (2^16)-2 개이다.
  • C Class : 맨 앞 세 비트가 항상 110이다.
    네트워크 주소 범위는 192.0.0~223.255.255까지 사용하여 2^21개이며, 호스트 주소 범위는 (2^8)-2 개이다.

Host 주소가 모두 '0'인것은 대표주소이며, Host 주소가 모두 '1'인것은 브로드캐스트 주소로 사용하고 있어 각 호스트 주소범위에서 2개가 빠진다.

 

서브넷 마스크(SubNet Mask)

IP주소에서 Net ID와 Host ID를 구분한다.(Net ID : 그룹식별, Host ID : 개인식별)

IP주소에서 그룹을 나타내는 네트워크주소를 표현하는데 핵심적인 키워드이다.

IP주소와 'BIT AND연산'을 통해 네트워크 주소를 식별하는데 이를 마스킹(Masking)이라 한다.

 

서브넷팅(Subnetting)

서브넷마스크를 알기 위해 먼저 서브네팅 개념을 이해해야한다.

IPv4는 클래스 개념을 적용하여 호스트에 IP주소를 할당한다. 네트워크가 작을 경우(100명 이하) C클래스를 할당받더라도 IP주소의 낭비가 발생될 우려가 많다.

따라서, 네트워크 규모에 따라 주어진 클래스 주소를 분할하여 효율적으로 사용하는 기술을 서브네팅이라 한다.

서프넷팅을 VLSM(Valuable Length Subnet Mask)으로 표현하기도 함.

 

서브넷팅 방법은 다음과 같다.

  • 서브넷팅은 주어진 서브넷마스크에서 1의 개수를 증가시킴으로서 네트워크를 분리하는 기술이다.
  • 서브넷의 수 = 2증가되는 1의 개수 이며, 각 서브넷의 호스트 수는 1/2씩 감소한다.
  • 네트워크 규모에 따라 IP주소를 분할하여 사용함으로써 IP주소를 낭비없이 효과적으로 사용 가능하다.

서브넷 마스크는 IP주소에서 첫 비트부터 어디까지가 네트워크 영역인가를 알려주는 역할을 해준다.

서브넷 마스크는 32비트의 숫자로 호스트영역은 '0'으로 나타내고, 네트워크영역은 '1'로 나타낸다. 서브넷 마스크로 인해 쪼개진 넽워크 주소를 서브넷 네트워크라 한다.

 

AWS S3

Simple Storage Service의 약자로 어디서나 원하는 양의 데이터를 저장하고 검색할 수 있도록 구축된 객체 스토리지이다.

 

객체 스토리지란?

더보기

파일 스토리지

일상적인 컴퓨터 사용법과 같다.

어떤 파일을 찾기 위해서 어느 폴더에 있는지 경로를 찾아 들어가야 한다.

 

블록 스토리지

단일 스토리지 볼륨을 '블록'이라는 개별 단위로 분할하여 저장하는 방식이다.

블록 스토리지는 주차장으로, 블록은 주차장의 구획된 한 면으로 비유할 수 있다. 블록은 파일보다 하위 개념의 저장단위이다.

블록 스토리지에서 데이터는 블록 단위의 일정한 크기의 조각으로 나누어 저장되며, 각 블록은 저장된 위치에 대한 고유한 주소를 가지고 있어 만약 서버에서 파일을 요청하면 블록들을 재구성해 하나의 데이터로 서버에 전달하게 된다.

 

객체 스토리지

구조화되지 않은 데이터의 대량 저장을 위한 데이터 스토리지 아키텍처로서, 각 데이터 조각을 하나의 객체(Object)로 개별 저장소에 보관하며 메타데이터와 고유 식별자를 함께 저장하므로 데이터 액세스와 검색이 용이하다.

흔히 대리주차 방식에 비유되곤 하는데, 사용자는 주차 위치를 알 필요가 없고 키를 제시하며 주차를 요청하거나 차를 가져와달라고 하기만 하면 된다.

 

[참조]

https://library.gabia.com/contents/infrahosting/9026/

S3 구성

S3를 사용하기 위해서 필수적으로 이해해야 하는 개념이 버킷(bucket)과 객체(Object)이다.

버킷은 데이터를 저장하는 저장소이며, 저장한 파일을 오브젝트라 한다.

S3를 사용하기 위해서는 먼저 버킷(Bucket)을 만들고 버킷에 오브젝트(Object)를 저장한 후 접근 권한을 만들고 공개하면 된다.

버킷은 리전별로 생성가능하며, 계정 별 100개까지 생성이 가능하다.

버킷이름은 S3 리전(region)에서 유일해야한다. 또한 버킷에 저장할 수 있는 객체 수는 무제한이다.

객체는 S3에서 관리/생성 되는 기본단위로 HTTP형태로 주고받으며 객체는 5TB까지 가능하다.

 

S3 특징

  • 객체 기반의 스토리비 서비스
  • 웹에서 Http 파일에 접근할 수 있다.
  • 99.99%의 내구성
  • 오브젝트 단위로 데이터를 업/다운로드 할 수 있다.
  • 비정형 데이터 저장에 용이하다.
  • 저장된 데이터는 직접 수정이 불가능하다.(수정된 데이터는 버전 관리를 통해 이뤄짐.)
  • S3 스토리지는 동일 리전에서 여러 가용영역(AZ)에 복제하여 하나의 내구성에 문제가 생겨도 복구할 수 ㅣㅇㅆ다.
  • 데이터 검색을 위해 메타데이터와 식별자(Key)를 사용한다.

S3의 단점

버전 업 시 복제가 되기 전 누군가 다운로드를 하면 속도차이에 의해 버전 업버전이 아닌 그 전 버전의 오브젝트를 받을 ㅅ 있다.

 

RDS vs S3

RDS는 수시로 데이터를 왔다갔다 해야하는 경우에 사용하지만,
S3는 데이터의 수정이 빈번한 입출력이 아니며, 객체 단위로 한번 저장하고 다운로드가 많이 발생하는 업무에 적합한 스토리지이다.

고가용성, 고 내구성 객체 스토리지이다.

유실성이 거의 없다.

같은 리전 내에서 데이터 전송 시 요금부과는 없다.

 

Docker

애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다.

Docker는 소프트에어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한  모든 것이 포함되어 있다.

docker를 사용하면 환경에 구애받지 않고 개발이 가능하며, 호환성도 뛰어나다.

 

Docker Container VS Virtual Machine

컨테이너는 Host OS 상에서 리소스를 논리적으로 구분하여 마치 별도의 서버인 것처럼 사용할 수 있게 하는 기술이다.

이를 Virtual Machine과 비교를 하면,

  • Virtual Machine(Hosted/ Bare Metal Hypervisor)
    • 애플리케이션 자체와 필요한 바이너리, 라이브러리외에 OS 전체가 포함된다.
    • CPU, 메모리, 하드 디스크등의 하드웨어를 가상화하기에 하드웨어나 OS부팅에 시간 소요가 발생한다.
    • 가상화된 하드웨어 및 하이퍼바이저를 통해 처리하기에 물리적 시스템보다 처리에 부가적인 오버헤드가 필요하다.
  • Docker Container
    • 애플리케이션과 꼭 필요한 바이너리, 라이브러리만 갖추며 Host OS의 커널을 공유한다.
    • 부팅 시 OS는 이미 시작한 Host OS를 공유하기에 프로세스만 시작하면 되므로 부팅 소요시간이 절약된다.
    • 커널을 공유하기에 개별 프로세스가 작업을 하는 것과 같은 정도의 시간이 걸리며, 때문에 오버헤드가 적다.

 

Docker 아키텍처

docker는 내부적으로 Client-Server 구조를 사용한다. 도커는 Docker Daemon이라는 데몬을 실행하여 컨테이너와 관련된 모든 요청(빌드, 실행 등)을 처리한다.

  • Docker daemon : Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크, 볼륨등의 도커 오브젝트를 관리한다.
  • Docker Client : 도커 서버와 통신하기 위한 가장 주요한 기능을 수행한다. 예를 들어, docker run 명령어를 실행하면 Docker Client는 해당 명령어를 Rest API Call으로 변환하여 도커 데몬으로 전송한다.
  • Docker Registries : 도커 이미지를 저장하는 저장소 역할을 한다.
  • Docker Objects : 도커의 컨테이너 기술의 핵심 기능을 담당하며, 다양한 도커 오브젝트를 지원한다.
    • Images : read-only 템플릿으로 필요한 프로그램, 라이브러리, 소스등을 설치한 뒤에 이를 파일로 만든 것이다. 이렇게 만든 이미지를 레지스트리에 올리고, 레지스트리에 올라와 있는 다른 이미지를 받을 수 도 있다.
    • Container : 이미지를 실행한 결과로 생성되는 인스턴스를 의미한다. 이미지를 여러번 실행시키면 여러개의 컨테이너가 만들어진다. OS로 본다면 이미지는 일종의 실행파일, 컨테이너는 프로세스와 유사한 개념이다.
      사용자는 도커 클라이언트 명령어를 호출함으로써, 컨테이너를 관리할 수 있다.

Docker 실습

1. Docker를 사용하기 위한 환경설정

#repository 인덱스 갱신하기
sudo apt update

#도커 다운을 위해 필요한 패키지 설치
sudo apt install apt-transport-https
sudo apt install ca-certificates
sudo apt install curl
sudo apt install software-properties-common

#curl 명령어로 Docker 다운받기
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add

#repository에 경로 추가하기
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

#저장소에 url 주소 추가 -> apt update 시 도커도 자동연결 update
sudo apt update

#docker 설치
apt-cache policy docker-ce
sudo apt install docker-ce

#확인하기 
sudo systemctl status docker

2.이미지 다운받아 실행해보기

#Hello world이미지 받기
sudo docker pull hello-world

#이미지 확인
sudo docker images

#컨테이너 생성 및 실행
sudo docker run hello-world

#실행중인 컨테이너확인
sudo docker ps -a

hello-world 이미지를 실행시킨 컨테이너를 보면 다음과 같이 확인할 수 있다.

 

Docker로 MySQL서버 구축

MySQL설치

현재 Docker 이미지와 컨테이너를 살펴보면 MySQL이 설치가 안되어 있는것을 볼 수 있다.

docker pull을 이용해서 mysql:5.6를 설치하자.

#mysql 이미지 받기
sudo docker pull mysql:5.6

#이미지 확인
sudo docker images

 

MySQL 컨테이너 생성

MySQL 컨테이너 생성 시 MySQL과 Host의 포트를 연결해야한다.

sudo docker run --name mysql-lecture -e MYSQL_ROOT_PASSWORD=<passwd> -d -p 3306:3306 mysql:5.6

컨테이너 생성에 오류가 났다. 이미 Aws3306포트를 누군가 사용하고 있단다.

docker 컨테이너를 확인해보면 STATUS가 Created상태이고 PORTS가 연결이 안되어 있는 것을 볼수 있다.

 

해당 컨테이너를 삭제하고, 3307포트를 이용한 컨테이너를 만들자.

#mysql-lecture 컨테이너 삭제
sudo docker rm mysql-lecture

#host포트 3307포트 --> docker 3306포트
sudo docker run --name mysql-lecture -e MYSQL_ROOT_PASSWORD=passwd -d -p 3307:3306 mysql:5.6

ps를 통해 확인해보면 컨테이너가 잘 생성되어있는 것을 볼 수 있다.

 

MySQL 컨테이너 시작,중지 및 접속

컨테이너가 잘 생성되었으니, 이제 컨테이너에 접속해보자.

# MySQL Docker 컨테이너 중지
sudo docker stop mysql-lecture 

# MySQL Docker 컨테이너 시작
sudo docker start mysql-lecture 

# MySQL Docker 컨테이너 재시작
sudo docker restart mysql-lecture 

#MySQL Docker 컨테이너 접속
sudo docker exec -it mysql-lecture /bin/bash

exec 명령어를 통해 컨테이너로 접속했으니, 이제 mysql로 접속을 하자.

 

MySQL접속

현재 컨테이너로 접속해 있는 상태다. mysql로 들어가기 위해서는 다음의 명령어를 친 후 비밀번호를 적으면 mysql로 들어갈 수 있다.

mysql -u root -p

mysql 관련 DB는 Toad를 이용해서 살펴볼 것이기에 Toad와 연결하자.

포트를 3307로 설정하고,마찬가지로 ec2의 인바운드에도 3307을 허가해준다.

 

Docker Build

이번에는 dockerfile을 만들어 볼것이다. dockerfile은 후에 build를 통해 이미지파일을 만들때 사용하는 소스이다.

 

그럼 dockerfile명령어를 알아보자.

 

 

ec2에서 폴더를 하나 만든뒤 nano나 vim을 이용해서 Dockerfile이라는 파일을 만든다.

그리고 안에는 아래와 같은 글을 작성한뒤 저장한다.

작성했으면, 다음 명령어를 이용해 빌드해보자.

#--tag(또는 -t) 옵션은 새로 생성할 이미지 이름을 지정
#마지막에 점(.)은 Dockerfile의 위치를 경로를 지정
#Dockerfile이 아닌 경우 --file(또는 -f) 옵션을 사용해서 파일 이름을 지정
#Dockerfile이 위치한 디렉토리에서 위 명령어를 실행하면 다음과 같이 새로운 도커 이미지를 생성
sudo docker build --tag echosimple:1.0 .