RDS(Relational Database Service)란 말 그대로 관계형 데이터베이스를 대여해주는 AWS의 서비스다. AWS에서 주로 사용자들이 사용하는 데이터베이스 서비스는 RDS와 DynamoDB일 것이다. DynamoDB는 비 관계형(NoSQL) 데이터베이스로 RDS와는 다른 성격을 띠고 있다.
관계형 데이터베이스와 비 관계형 데이터베이스에 대해서는 나중에 따로 정리하는 걸로 하고 정말 간단하게 알아보자.
관계형 데이터베이스는 위 엑셀 표처럼 Banana, Cherry, Melon, Peach라는 칼럼이 정해져 있는 데이터베이스 형태를 말한다. May행을 추가한다고 하면 Banana, Cherry, Melon, Peach에 관한 데이터만 입력할 수 있다. 하지만 비 관계형 데이터베이스는 정해진 칼럼이 없다. May행이 Banana, Cherry, Kiwi에 대한 데이터를 입력할 수 있다.
칼럼이 기준이 되어 테이블마다 관계를 가질 수 있냐 없냐 따지는 것이 두 구조의 차이라고 생각한다.
자세한 내용은 나중에 더 공부해서 따로 작성하겠다.
[ 본론 ]
이번 글에서는 RDS 인스턴스 생생과 접속을 해보자.
목차
1. 데이터베이스 생성
2. 데이터베이스 접속
퍼블릭 액세스 허용해주기
보안 그룹 인바운드 포트 열어주기
접속
1. 데이터베이스 생성
먼저 리전을 잘 확인하자. 나는 서울에 데이터베이스를 생성할 것이기 때문에 서울을 선택하고 데이터베이스 생성 버튼을 클릭한다.
RDS는 다양한 관계형 데이터베이스를 지원한다. 나는 가장 흔하게 쓰이는 MySQL을 선택하고 버전은 디폴트 값을 사용하겠다.
템플릿에 프로덕션으로 디폴트 값으로 맞춰져 있을 텐데 이대로 만들면 한 달 뒤 돈이 청구되는 것을 볼 수 있다. 무료로 사용하고 싶다면 프리 티어를 선택하도록 하자.
DB이름은 그냥 말 그대로 DB 인스턴스 이름이기에 이쁘게 지어주면 되고 "마스터 사용자 이름", "마스터 암호"는 접속하는데 꼭 필요한 정보이기 때문에 꼭 기억을 해 두던지 기록을 해주자.
다른 부분은 건드릴 것이 없어서 데이터베이스 생성 버튼 클릭!
생성 중이다. 시간이 몇 분 걸린다. 기다리자.
이제 사용 가능한 데이터베이스를 생성했다.
2. 데이터베이스 접속
데이터베이스를 생성했다고 해서 바로 접근할 수 없다. 데이터베이스에 원격으로 접속하기 위해서는 몇 가지 해야 할 것들이 있다.
먼저 우리가 생성한 데이터베이스의 상세정보를 보기 위해 클릭하자.
1. 퍼블릭 액세스 허용해주기
수정을 클릭한다.
네트워크 및 보안에서 퍼블릭 액세스 가능성을 "예"로 변경하고 저장하자.
즉시 적용을 선택하고 수정 버튼을 누르면 끝이다.
*수정되는데 시간이 몇 분 소요된다.
2. 보안 그룹 인바운드 포트 열어주기
보안 그룹의 인바운드 설정으로 3306 포트를 열어줘야 접속이 가능하다.
보안 그룹 클릭!
보안 그룹 ID 클릭!
인바운드 규칙 편집 클릭!
MYSQL/Aurora를 선택하면 포트는 자동으로 설정되고 보안에 따라 위치 무관, 특정 IP만 설정해주면 된다. 그리고 규칙 저장!
3. 접속
데이터베이스에 접속하는 방법은 다양하다.
나는 보통 MariaDB를 설치하면 자동으로 설치되는 heidisql라는 프로그램을 사용한다.
클라우드 컴퓨팅 서비스를 사용하다 보면 콘솔로 작업을 진행해야 하는 고통을 견딜 수 없었다. vi, vim 등을 잘 사용하여 개발하면 충분히 불편함 없이 개발을 할 수 있지만 이미 Visual studio code와 같은 ide에 익숙해져 버린 몸이기에 견딜 수 없었다. 이런 나의 고충을 덜어주는 서비스가 Cloud9이었다.
Cloud9은 원래 AWS의 서비스가 아닌 다른 회사에서 운영하고 있었던 것으로 알고 있다. 하지만 AWS가 사들여 오면서 정식 AWS 서비스가 되었다. AWS의 정식 서비스가 된 지 얼마 안 됐기 때문에 서울 리전을 지원 안 했다. 도쿄나 싱가포르 리전에서 사용했지만 이제 서울 리전도 지원해서 너무 기쁘다. 사실 차이점을 체감상 못 느낌.
[ 본론 ]
환경
Ubuntu 18.04
준비물
Nodejs가 설치된 Ec2 인스턴스
인스턴스는 가지고 있지만 Nodejs가 설치되어 있지 않아 Nodejs의 설치부터 진행하겠다.
새로운 인스턴스를 생성하면서 Cloud9 환경을 설치하는 선택지도 있지만 우리는 이미 인스턴스를 가지고 있기 때문에 3번째 "Create and run in remote server (SSH connection)"을 선택해준다.
User 값은 우리가 처음 로그인할 때 사용했던 로그인 아이디 값을 넣어준다. 만약 자신이 별도로 사용자를 만들어 줬다면 그 사용자 아이디 값을 넣어주면 된다. Cloud9에서는 자신이 설정한 사용자의 폴더만 접근할 수 있다.
아래 public SSH key를 복사해주자.
다시 콘솔로!
인스턴스에서 SSH 접근을 허락해줘야 Cloud9에서 접근하여 설치를 진행할 수 있기 때문에 public SSH key를 입력해주자.
$ cd ~
$ ls -al
ubuntu 사용자 루트 디렉터리에서 ls -al 명령어를 입력하여 디렉터리를 확인해보면. ssh라는 파일이 존재한다.
$ cd .ssh
$ ls -al
위 명령어로. ssh폴더로 이동하고 내부 파일을 확인해보면 "authorized_keys"라는 파일이 존재한다. 이 파일 속에 아까 복사해준 public SSH key를 입력해주면 된다.
$ sudo vi authorized_keys
vi 사용법은 구글링을 통해서 자세히 알아보고 난 간단하게만 소개하겠다.
키보드에서 i를 누르면 insert, 즉 입력이 가능해진다.
기존에 적혀있는 key값 다음 줄에 우리가 가져온 key값을 붙여 넣어주자(마우스 오른쪽 클릭하면 붙여 넣기).
키보드의 esc를 누르면 insert 상태가 해제된다.
:wq를 입력하면 저장하고 나가 진다.
이제 모든 준비는 끝났다.
웹으로 돌아가자!
다음 스탭로 넘어가자!
*혹시 여기서 접근할 수 없다는 에러가 발생하고 다음 창으로 넘어가지 않는다면 참고하자!
인스턴스에 보안 그룹의 인바운드 설정이 제대로 되어있지 않는 것이다. SSH 접근 설정을 내 PC IP에서만 접근 가능하도록 설정해놓았을 가능성이 크다. Cloud9을 사용하기 위해 모든 IP로부터 접근을 가능하게 하면 보안상 좋지 못하다. 혹시나 좋은 방법을 아는 사람이 있다면 댓글로... 부탁드립니다.
또 확인 창이 한번 더 나오는데 Create environment 버튼을 누르면 어떤 항목을 설치할 것인가 확인하는 창이 나온다. 난 모든 항목을 다 체크된 상태로 설치를 진행한다.
설치가 완료되었다는 창이 보인다. 이제 Cloud9을 사용하여 좀 더 편한 서버 개발을 시작할 수 있게 되었다.
가끔 작업을 하다가 보면 버벅거리거나 문제가 있어 재부팅해야 할 경우가 있다. 그렇게 아무런 생각 없이 재부팅한 결과 SSH에 접근이 안됐다. 무슨 문제인가 살펴보니 재부팅되면서 할당되었던 IP가 변경된 것이다. 그래서 SSH IP 설정을 변경해주고 나서야 다시 접근할 수 있었다.
이런 귀찮은 문제를 해결해 줄 수 있는 것이 탄력적 IP이다. 항상 IP를 고정시켜주는 역할을 한다. 이 서비스의 경우 IP를 할당받고 인스턴스에 연결해주지 않고 방치해 두면 요금이 발생하지만 연결시켜 준 상태로 두면 요금이 발생하지 않는다.
[ 본론 ]
준비물
AWS 계정
인스턴스
Ec2 카테고리에서 탄력적 IP를 선택해주고 탄력적 IP 주소 할당을 클릭한다.
할당을 눌러준다.
새로운 IP가 생성된 것을 확인할 수 있다. 그럼 이제 이 IP를 우리가 생성한 인스턴스에 연결해줘야 한다.
동그라미가 점점 일그러지고 있는 건 귀찮아서 그런 게 절대 아니다. 주소 연결 버튼을 눌러주자.
인스턴스에 우리가 생성한 인스턴스의 고유 id값을 입력해주고 연결을 누르면 끝.
기존에 사용하던 인스턴스였다면 인스턴스의 IP가 변경되었으므로 접근이 되지 않을 것이다. SSH IP 설정을 변경해주도록 하자.
Smol이라 하는 프로젝트를 진행하면서 클라우드 환경에 서버를 구축해야 하여 작업하는 김에 글을 작성해본다. 깊은 부분은 나도 잘 모르기에 실용적인 부분만 캐치하고 넘어가겠다.
Ec2란 Elastic Compute Cloud의 약자로 독립된 컴퓨터를 임대해주는 서비스를 말한다. 쉽게 설명하면 우리가 일정 비용을 내면서 아마존에게 컴퓨터를 빌려서 사용하게 해주는 서비스이다. AWS의 가장 기본이 되는 서비스 중 하나이다.
회사 내부에 서버를 배치하는 것보다 훨씬 편리한 장점이 존재한다. 그것은 바로 확장성이다. 서비스의 규모가 점점 커져서 더 큰 서버가 필요해지면 어떻게 해야 할까? 회사 컴퓨터의 더 좋은 부품을 사서 끼우고 해야 하는 작업 해야 한다. 하지만 AWS 서비스를 사용하면 버튼 몇 개로 혹은 자동으로 컴퓨터의 성능을 늘렸다가 줄였다가 할 수 있다. 그 기능의 중심이 되는 서비스가 Ec2이다.
*이제부터 "인스턴스"라는 말이 자주 나올 텐데 Ec2에서 인스턴스란 그냥 "컴퓨터"라고 받아들이면 될 것 같다. 예를 들어 한 개의 인스턴스라고 하면 한 대의 컴퓨터가 되는 것이다.
[ 본론 ]
그럼 한번 아마존으로부터 나만의 컴퓨터를 대여해보자!
준비물
AWS 계정
서비스를 클릭하고 ec2페이지로 들어가 보자.
리전 위치가 서울인지 확인하고 인스턴트 시작 버튼을 누르자.
처음 AWS를 사용하는 사람의 경우, 다른 나라 리전에 인스턴스를 생성해 놓고 "전에 만들었는데 인스턴스가 왜 없지?" 하며 새로 생성하여 요금을 두 배로 청구받는 경우가 있다. 항상 리전을 확인하고 생성 & 삭제를 하자.
*리전(Region)은 물리적인 서버의 위치를 나타낸다. 우리가 AWS를 통해 인스턴스를 만들면 생성할 때 선택한 리전에 존재하는 물리적 서버에서 우리가 사용할 서버 영역을 할당해주게 된다. 리전의 위치가 가까울수록 서버와의 통신 속도가 빠를 것이다.
자신이 원하는 운영체제를 선택해주자. 나는 우분투(Ubuntu) 18.04를 선택하겠다.
서버의 사양을 선택할 수 있다. 나는 비용을 발생시키고 싶지 않기 때문에 프리티어로 제공되는 t2.micro를 선택하고 다음으로 넘어가겠다.
네트워크나 뭐 다양한 설정을 할 수 있지만 그냥 넘어가도 사용하는데 큰 지장이 없으니 넘어가도록 하자. 괜히 건드렸다가 비용이 청구되는 일이 없도록 잘 알아보고 체크하자. 보안 그룹 구성이 나올 때까지 쭉 넘어가자.
SSH, HTTP, HTTPS 3가지 방식으로 서버에 접근이 가능하도록 설정했다. SSH는 콘솔로 서버에 대한 접근을 허용한다. 그렇기 때문에 보안상 내 IP에서만 접근이 가능하도록 설정했다. HTTP, HTTPS는 웹 서비스를 제공할 경우, 꼭 설정해야 한다.
이제 인스턴스 생성이 거의 다 완료되었다. 시작하기에 앞서 키 페어를 생성해야 한다. 키 페어란 콘솔에 접근하기 위한 열쇠라고 생각하면 된다. 키 페어를 활용하여 서버에 접근하는 방법은 다음 편에서 알아보도록 하자.
새로운 키 페어 이름을 만들어 주고 다운로드를 하면 인스턴스 시작 버튼에 불이 들어오는 것을 확인할 수 있다. 다운로드 받은 파일은 꼭 안전하게 보관하자.
인스턴스를 생성하고 나면 인스턴스 상태가 노란색 동그라미와 함께 pending으로 되어있는데 시간이 지나면 초록색으로 바뀌면서 running으로 바뀌게 된다.
이제 우리는 클라우드 환경에 어떤 환경에서도 접속 가능하며 24시간 동안 돌아가는 컴퓨터를 한 대 생성한 것이다.
자! 열심히 알아봤다. 이제 받아져야지? 라고 생각한 나의 실수였다. 계속해서 데이터가 넘어오지 않았다. 여기서 삽질 또 시작.
문제는 프론트의 axios에 있었다. axios를 사용하면 받아지지 않았지만 아래의 코드를 사용하니 값이 넘어왔다.
var req = new XMLHttpRequest()
var file = new Blob(['This is a test'], { type: 'text/plain' })
var data = new FormData()
data.append('photo', file, 'test.txt')
req.open('POST', '/upload')
req.send(data)
3. 저장 폴더를 유동적으로 바꾸기
난 aws s3에 이미지 파일을 저장해야했기 때문에 multer-s3도 사용했다.
multer의 구조는 좀 이상했다. 프론트로 받은 데이터를 기반으로 이미지가 저장될 폴더를 만들고 싶었지만
app.post('/image', s3.upload.single('avatar'), function (req, res, next) {})
이렇게 req로 받기도 전에 파일에 저장을 때리는데 어떻게 하란 말인가...
그래서 아래와 같은 방법으로 파일명을 고쳐보기로 했다.
/* router file */
const express = require('express');
const router = express.Router();
const ctrl = require('../api/c_board');
const multer = require("multer");
const {new_s3_storage} = require("../utils/u_s3_storage");
// s3를 빈 값으로 선언했더니 아래 라우터에서 빈 값에
// array() 함수가 없다고 에러가 떠서 저장 폴더가 고정된 s3객체를 넘겨줬다
let s3 = require("../utils/u_s3");
// 해당 middleware부터 먼저 실행되고 아래 /image가 실행된다
router.use('/image', (req, res, next) => {
// 프론트로부터 받은 데이터
var bo_id = req.headers.bo_id;
// 데이터를 매개변수로 넘겨 새로운 s3 storage 객체 생성
var s3_storage = new_s3_storage(bo_id);
// 기존 s3에 새로만들어진 s3 storage로 덮어준다
s3 = multer({ storage : s3_storage });
next();
})
router.post('/image', s3.array('img'), ctrl.image);
module.exports = router;
middleware를 사용해서 /image로 들어가기 전에 header 값으로 프론트로부터 받은 데이터(req.headers.bo_id)로 새로운 storage 객체를 만들어 s3에 덮어씌울 계획이었다.
결과는 실패!
let s3 = require("../utils/u_s3"); 값이 middleware에서 아무리 덮어씌어도 안바뀌더라.
IT에 관련된 지식이 없는 사람에게 아마존(Amazon)이 어떤 기업이냐 물어본다면 '세계에서 가장 큰 온라인 오픈마켓이 아니냐?'라는 답변이 돌아올 것이다. 틀린 말이 아니다. 하지만 과연 쇼핑몰 하나만으로 구글-애플을 제치고 브랜드 가치 1위의 기업에 거듭날 수 있었을까?
초기 아마존은 온라인 오픈마켓만을 운영했었다. 기업의 규모가 점점 커지면서 '블랙 프라이데이'와 같이 할인 행사 기간에 웹 사이트에 많은 사용자가 몰려들어 서버에 과부하가 걸리기 시작했다. 사용자들에게 불편함을 덜어주기 위해 아마존은 막대한 양의 서버를 사들였다.
서버 문제는 사라졌지만 트래픽이 몰리지 않는 날엔 그 많은 양의 서버를 돌릴 필요가 없었다. 그래서 아마존은 놀고 있는 서버를 개인, 기업들에 비용을 받고 대여해주는 사업을 시작하게 되었다. 2002년 아마존 웹 서비스를 시작했다.
아마존 웹 서비스란?
아마존에서 제공하는 클라우드 컴퓨팅 서비스
쉽게 설명하기 위해 내가 좋은 아이디어가 하나 떠올라서 IT사업을 진행한다고 가정해보자. 24시간 동안 내 서비스를 제공하기 위해서는 24시간 동안 작동되는 서버 컴퓨터가 필요하다. 매우 작은 프로젝트라면 컴퓨터 한 대로 충분할 것이다. 하지만 일반적으로 웹 서버, 데이터베이스 서버 등 많은 서버가 필요하다. 이 서버들을 들여놓을 초기 자금이 없다면 시작도 전에 포기해야 할까? 또 처음에는 평균 사용자가 100명이었는데 100,000명으로 늘어나면 서버를 확장하기 위해 얼마나 번거로운 작업이 많이 필요할까...
AWS를 사용하면 이런 문제를 쉽게 해결해 준다.
1. 비용 절감
AWS에서 이미 다양한 성능의 서버를 가지고 있기 때문에 내가 원하는 성능에 맞춰 커스텀 하여 우린 돈을 주고 빌리기만 하면 된다. 휴대폰 살 때 「일시불로 긁을 것이냐」 「할부로 천천히 낼 것이냐」 의 차이라고 보면 될 것 같다.
2. 확장성
상황에 따라 서버를 확장하거나 감축할 때 마우스 클릭 몇 번으로 정말 쉽게 처리할 수 있다.
AI, Blockchain, IoT 등 다양한 클라우드 서비스를 제공하고 있다. 이러한 다양한 서비스를 쉽게 연동 할 수 있도록 서비스를 제공하고 있다.
3. 안전성
서버를 전 세계 곳곳에 설치해 뒀기 때문에 자연재해로 회사가 사라져도 서비스를 안전하게 운영할 수 있다.
무엇보다 비용 절감에 있어서 메리트가 있기 때문에 다양한 스타트기업이 AWS를 활용하여 새로운 사업을 시작한다.
전하고 싶은 말...
나(글쓴이)는 대학생 때 처음 AWS를 알게 되었다. 자취방에서는 전용 서버가 한 대 있었다. 서버용으로만 쓰는 것이 아니라 게임도 하고 웹툰도 보고 다양한 용도로 사용하다 보니 매일 켜두는 것도 컴퓨터에 부담이 가는 것 같고 프로젝트를 진행하던 도중 서버가 다운되거나 하면 너무 불편할 것 같아 클라우드 컴퓨팅 서비스에 대해서 찾아보게 되었다. 하지만 당시 구글링에 서툴렀던 나는 온통 영어로 된 검색 결과에 지쳐 온라인 수업을 통해서 AWS를 공부하기 시작했다.
나처럼 처음 AWS를 접하고 고군분투하고 있는 사람들에게 조금이나마 도움이 되길 바라는 마음으로 글을 작성한다.