MySQL + Docker + AWS EC2 Simple Tutorial with Amazon Linux (2023)
Tags: mysql, docker, aws, ec2
Published: 2023-01-21 06:12:07

## Abstract

`Ajax`가 등장하고 `Frontend` 라는 개념이 등장한지 어언 20여년. 명확한 경계가 있었던 한 시대를 지나 이제는 새로운 기술의 등장과 함께 다시 `Frontend`와 `Backend`의 경계가 모호해지고 있다.

`react`, `vue` 처럼 `Virtual DOM` 개념을 구현한 프레임워크를 필두로 `svelte`, `solid.js` 등 부터 `DOM`을 컴파일 레벨로 구현하는 프레임워크가 등장하기 시작했다.

또한, 자체 `server` 를 제공하는 `fullstack` 프레임워크인 `Nest.js`, `Nuxt.js`, `svelte-kit` 등이 등장하면서 `Frontend` 라는 개념이 점차적으로 서버사이드까지 확장하였다.

그리고 현재는 다양한 `Server(Backend) SaaS`, `DB SaaS` 들이 등장하였다. 오래된 `Firebase` 부터 시작해서 `Supabase`, `GrafBase`, `PlanetScale` 등 서버사이드와 DB 및 인프라에 익숙치 않은 유저들을 위한 서비스들이 우후죽순 등장한다는 것은 이제 `Frontend` `Backend` 라는 경계가 무너지고 있는 것을 반증하고 있다.

하지만 이러한 다양한 `SaaS`, `PaaS` 등을 이용하다보면 다양한 접근성을 가능하게 하기위해 기존의 `Server` 와 `DB`의 개념에 대해 접근하고 이해하는 것이 필요해진다.

이번 포스팅에서는 대표적인 `Relation DB`인 `MySQL`을 `AWS`에 `Docker`로 말아올리는 간단한 예제를 소개할 예정이다. (적은 비용으로)

참고할만한 링크: https://github.com/ManzDev/frontend-evolution

---

## Setting up AWS EC2 Service

원하는 지역으로 `region` 을 변경

`Launch Instance` 클릭

![config instance_1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1xdmfrtroa1ifm8tokqb.png)

---

원하는 OS 선택. (여기서는 `Amazon Linux`로 진행)

`Free tier eligible` 한 `t2.micro`로 진행

Key Pair 생성, 혹은 있으면 그대로 선택해서 사용

나머지는 그대로 진행

![config instance_2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w5wqgtfbq0y2tigh6cf1.png)

---

`instance` 대쉬보드에 들어가서 방금 생성한 EC2 클릭

`connect` 선택

![config instance_3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6xsdpablb2jfsi23orlx.png)

---

`Terminal` 에서 Pair Key `[filename].pem` 이 저장된 폴더에 접근

3번 안내문 대로 권한 획득 후 4번 `Example` 명령어 복사 및 실행

![config instance_4](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tjzspq0at7lggyfsrh79.png)

![config instance_5](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f4aup387sqf6vh5no4xd.png)

---

아래 메세지와 같은 리턴을 받았다면 `Security Group` 수정이 필요

> ssh: connect to host [xxxx].ap-northeast-2.compute.amazonaws.com port 22: Operation timed out

`Security Groups` > 변경할 정책 이름 > `Inbound rules` > `Edit inbound rules` 클릭

![config security_1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ztqmaieudz1wbsh8l0bt.png)

`Inbound` 그룹에 `ssh` 관련 포트 설정 (TCP 22 Port)

`MySQL` 관련 포트 설정 (TCP 3306 Port)

![config security_2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/reh2b440nvxnz0vz606w.png)

---

다시 돌아가서 ssh 접속 실행

![ssh success](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/arphyl42v8t18pgtkn6f.png)

Package Update 진행

```sh
$ sudo yum update

$ sudo yum -y upgrade
```

---

## Setting up Docker on EC2

Docker 설치, 확인 및 시작

```sh
# install docker
$ sudo yum -y install docker

# docker version confirm
$ docker -v
Docker version 20.10.17, build 100c701

# start docker service
$ sudo service docker start
```

Docker 볼륨 생성

```sh
# create docker-volume
$ sudo docker volume create mysql_v
mysql_v

# result
$ sudo docker volume ls
DRIVER    VOLUME NAME
local     mysql_v
```

---

`Docker Hub`에서 `MySQL` 이미지 불러오기

```sh
$ sudo docker pull mysql:latest
```

Docker Container 마운팅

```sh
# mounting & run docker container
$ sudo docker run --name <container_name> -e MYSQL_ROOT_PASSWORD=<password> -d -v mysql_v:/var/lib/mysql -p 3306:3306 mysql:latest

# monitor running docker images
$ sudo docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
bec12e4eb164   mysql:latest   "docker-entrypoint.s…"   9 seconds ago   Up 8 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   <container_name>
```

---

## Connecting Database with DB Tool

`MySQL` 도구 중 가장 널리 쓰이는 도구는 `MySQL Workbench` 일 것이다.

여기서는 오픈 소스인 `DBeaver`를 이용하는 가이드를 소개하겠다.

`DBeaver`를 다운로드 및 실행

해당 링크: https://dbeaver.io/

---

`New Database Connection` 클릭 > `MySQL` 클릭

![config dbeaver_1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mo6yxbuiyqku61ldwn0f.png)
![config dbeaver_2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mt18capbtixsjqbyphr5.png)

---

`Server Host`, `Root Password` 입력

`Test Connection` 실행

![config dbeaver_3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ls88zwk3t1fsthlu9ead.png)

---

이런 메시지를 얻으면 연결에 성공

![connection success](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2ut86d8h8aec0xxd5p77.png)

만약 `Public Key` 관련 오류가 뜬다면 `Driver properties` 탭에 들어가 다음과 같이 설정

![publickey error](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g9vmlkz78rmw688mrpeq.png)

---

연결에 성공했으면 간단한 DB 생성과 테이블 생성을 진행해보자

성공한 연결은 왼쪽 `Database Navigator`에 리스트로 표시 된다.
선택한 뒤 작업표시줄에 있는 `SQL` 버튼을 클릭하면 Query를 작성할 수 있는 환경을 제공한다.

![Sql Query](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pucndvb9xgk2vgdqvbgs.png)

다음과 같이 데이터 베이스 생성해보자

```sql
CREATE DATABASE HELLO_WORLD;
```

테이블 생성

```sql
CREATE TABLE dummy_data (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  hello VARCHAR(100) DEFAULT NULL
);
```

데이터 삽입

```sql
INSERT INTO dummy_data(hello)
VALUES
  ('안녕하세요'),
  ('Hola'),
  ('こんにちは'),
  ('hallo'),
  ('ciao');
```

---

그럼 다음과 같이 DBeaver 에서 데이터 베이스, 테이블, 데이터가 생성된 결과를 확인할 수 있다.

![Query Result](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kym0qe0mqsx7czp31f96.png)

---

➕ DB Backup

DB 전체 백업은 다음과 같이 DBeaver 메뉴에서 진행 가능

![DB Backup](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a5spucfftkuld0zfifkd.png)

---

## Conclusion

`Docker compose` 를 구성하거나 그 외에 다양한 방법으로도 접근 가능하지만 가장 간단한 방식으로 `AWS EC2`에 `Docker`를 이용해서 `MySQL` DB 서버를 구성해보았다.

서문에 언급했듯이 더이상 `Frontend` `Backend` 구분은 의미가 없어지는 시대가 이미 성큼 다가왔다.

앞으로는 서비스 성격이나 규모에 따른 포지션 구분이 좀더 대중화가 될 것이다.

기존의 대규모 처리 시스템과 같은 서비스들은 변화가 느리기에 `View`, `Server`의 구분 방법을 따를 것이나 대다수를 차지하는 중소규모나 빠른 프로토 타이핑을 위해서는 `CI/CD SaaS`, `Server SaaS`, `DB SaaS` 와 같은 서비스들을 사용해서 빠르게 서비스를 개발하는 것이 경쟁력이 될것이다.

더 나아가 중소규모에서 대규모로 넘어갈 수 있는 기반 지식은 Engineer로서든 Manager로서든 서비스 개발하고 운영하는 관점에서 꼭 필요한 기본 소양이 될것이다.