[Spring Boot] AWS 배포 (1)
1. AWS 인스턴스
1) Amazon Linux AMI 2018.03.0 (HVM)
아직까지는 Amazon Linux 1 에 대한 국내 자료가 많다. Amazon Linux AMI를 사용하는 이유는 Amazon이 개발하고 있기 때문에 지원받기 쉬우며, AWS의 각종 서비스와 상성이 좋고 Amazon 독자적인 개발 레포지터리를 사용하고 있기에 yum이 빠르기 때문이다.(레드햇 베이스)
2) 인스턴스 유형
인스턴스 유형은 대부분 프리티어로도 사용이 가능한 T시리즈(micro)를 많이 사용한다. 또한, T2계열의 인스턴스는 다른 서비스와 달리 크레딧이라는 CPU를 사용할 수 있는 포인트 개념이 있다. 인스턴스 크기에 따라 정해진 비율로 CPU 크레딧을 계속 받게 되는데, 사용하지 않을 경우 크레딧을 축적하고, 사용할 때에는 이 크레딧을 사용한다. 정해진 사양보다는 더 높은 트래픽이 오면 크레딧을 더 사용하여 처리하지만, 크레딧이 모두 소진될 경우 EC2를 사용할 수 없게 된다. 따라서 트래픽이 많은 서비스의 경우 T시리즈 이외의 시리즈를 사용한다.
3) 보안 그룹
보안 그룹은 방화벽의 역할이며, 80/443번 포트, 8080번 포트, 22번 포트를 허용하도록 한다. 단, 22번 포트의 경우 SSH 접속이기에 지정된 IP에서만 접속이 가능하도록 설정해둔다. 마지막으로, 보안 그룹의 이름의 경우 유의미한 이름으로 변경해주도록 한다.
4) 탄력적 IP
인스턴스를 사용하다보면, 중지하고 다시 구동할 경우 IP가 변경이 되는걸 확인할 수 있다. 그렇기 때문에 매번 변경되지 않고 고정 IP를 가지도록 탄력적 IP를 할당한다. 단, 탄력적 IP를 인스턴스와 연결하지 않을 경우 과금이 되기 때문에 연결해주도록 한다.
5) Mac, Linux SSH 접속
매번 SSH 접속할 때마다 긴 명령어를 입력하는 번거로움을 방지하고자 쉽게 SSH 접속을 할 수 있도록 설정해준다.
// 키 복사 및 위치 변경
cp [pem 키] ~/.ssh/
// 키 확인
cd ~/.ssh
ll | grep [pem 키]
// 키 권한 변경
chmod 600 ~/.ssh/[pem 키]
// 호스트 등록
vim ~/.ssh/config
// config 파일 권한 변경
chmod 700 ~/.ssh/config
config 파일에 들어갈 내용은 SSH 접속시 필요한 정보이다.
# [서비스명 주석]
Host [원하는 서비스명]
HostName [탄력적 IP 주소]
User ec2-user
IdentityFile ~/.ssh/[pem 키]
이 후, SSH 접속을 할 때 간단한 명령어로 접속이 가능해진다.
ssh [서비스명]
※ Window의 경우, Putty를 이용하여 접속해야한다.
2. 인스턴스 설정
1) Java 8 설치
Amazon Linux 1은 기본 Java 7이다. Java 8로 설치해야한다.
// Java 8 설치
sudo yum install -y java-1.8.0-openjdk-devel.x86_64
// Java 버전 변경 선택
sudo /usr/sbin/alternatives --config java
// Java 7 제거
sudo yum remove java-1.7.0-openjdk
// Java 버전 확인
java -version
2) 타임존 변경
기본 서버의 시간은 UTC로, 미국 시간대이므로 한국 시간대가 아니다. 사용하는 시간이 모두 KST 한국 시간으로 등록되고 사용되도록 설정해주어야 한다.
sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
3) 호스트명 변경
여러 서버를 관리할 경우, IP만으로 운영하는 서비스를 판별하기 어렵다. 따라서 어떤 서비스인지 표현하기 위해 호스트명을 변경해주고 reboot 하여 확인한다.
sudo vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=[호스트명]
NOZEROCONF=yes
더불어, 호스트 주소를 찾을 때 가장 먼저 검색해 보는 /etc/hosts에도 변경한 호스트명을 가장 하단에 추가해준다.
sudo vim /etc/hosts
127.0.0.1 [호스트명]
정상적으로 등록이 완료되었는지 확인하기 위해 curl 명령어로 확인해본다. 'Could not resolve host' 에러가 발생하면 등록이 실패인 경우이며, 현재 80번 포트로 실행되는 서비스가 없을 경우 발생하는 'Failed to connect to ...' 에러가 출력되면, 정상적으로 등록되었음을 확인할 수 있다.
curl [호스트명]
3. RDS
1) RDS 인스턴스 생성
AWS에서 지원하는 클라우드 기반 관계형 데이터베이스이다. 하드웨어 프로비저닝, 데이터베이스 설정, 패치 및 백업과 같이 잦은 운영 작업을 자동화하여 개발자가 개발에 집중할 수 있도록 한다. RDS에는 많은 데이터베이스를 지원한다. 특별한 이유가 없다면 MySQL, MariaDB, PostgreSQL중에 사용하는 것을 추천한다. MySQL, MariaDB, PostgreSQL을 추천하는 이유는 가격적인 측면과 Amazon Aurora 교체 용이성이 좋기 때문이다.
2) Amazon Aurora
AWS에서 MySQL과 PostgreSQL을 클라우드 기반에 맞게 재구성한 데이터베이스이다. RDS MySQL 대비 5배, RDS PostgreSQL 보다 3배의 성능을 제공한다. 또한 AWS에서 직접 엔지니어링하고 있기 때문에 지속적으로 발전해나가고 있다. 클라우드 서비스에 가장 적합한 데이터베이스이기에 많은 회사에서 사용중이다. 하지만 프리티어 대상이 아니며 월 10만원 이상의 비용을 지불해야해야한다.
3) MariaDB
MySQL은 국내외를 가리지 않고 오픈소스 데이터베이스 중에서 가장 인기 있는 제품이다. 단순 쿼리 처리 성능이 압도적이며 오랜기간 사용되어져왔다. 하지만 오라클과 합병이되면서, 많은 MySQL 개발자들이 썬마이크로시스템즈를 떠나게 되었다. 그렇게 떠나간 개발자들중, MySQL 창시자 몬티 와이드니어는 회사를 나와 MariaDB를 만들었다. MariaDB는 MySQL 기반으로 제작이 되었기에 전반적인 사용법은 MySQL과 유사하며, 동일 하드웨어 사용으로 MySQL보다 향상된 성능과 더 많은 기능이 추가가 되었기에 많은 사용자들이 이용하고 있다.
4) 데이터베이스 생성
5) RDS 파라미터 설정
RDS를 생성할 경우 파라미터 그룹을 생성하고 생성한 파라미터를 편집하여 타임존, Character Set, Max Connection 정보를 설정해주어야 한다.
항목 | 설정 |
time_zone | Asia/Seoul |
character_set_client | utf8mb4 |
character_set_connection | utf8mb4 |
character_set_database | utf8mb4 |
character_set_filesystem | utf8mb4 |
character_set_results | utf8mb4 |
character_set_server | utf8mb4 |
collation_connection | utf8mb4_general_ci |
collation_server | utf8mb4_general_ci |
max_connections | 프리티어 사양으로는 60개의 커넥션만 가능하기에 넉넉잡아 150으로 설정한다. |
※ utf8mb4의 경우 이모지(☺️)를 저장할 수 있다.
6) RDS 파라미터 연결
생성된 파라미터 그룹을 데이터베이스에 연결한다. 수정 시, 즉시 적용을 하도록 한다. 예약된 다음 유지 관리 기간에 적용 옵션의 경우 새벽 시간대에 수정이 진행된다. 서비스가 오픈된 상태가 아니기때문에 즉시 적용으로 수정하도록 한다. (파라미터가 제대로 반영이 안되었을 경우에는 재부팅을 진행하도록 한다.)
7) RDS 보안 그룹 설정
RDS 만의 보안 그룹을 생성한다. 생성 시 MySQL/Aurora 규칙에는 이전에 생성한 EC2 인스턴스의 보안 그룹 ID와 자신의 IP를 규칙으로 추가한다.(로컬 PC와 EC2 인스턴스와 RDS 간에 접근이 가능해진다.) 이 후 생성한 보안 그룹을 데이터베이스에 연결한다.
8) IntelliJ 데이터베이스 연동
로컬에서 원격 데이터베이스로 붙을 때 GUI 클라이언트를 많이 사용한다. 대표적으로는 MySQL Workbench가 있으며, IntelliJ의 플러그인을 통해 조작할 수 있다. IntelliJ의 왼쪽 사이드 탭의 데이터베이스 브라우저 탭에서 MySQL로 RDS의 엔드포인트와 접속 정보를 기입하여 연결한다.
9) 데이터베이스character_set, collation, time_zone
현재 데이터베이스의 character_set, collation, time_zone 설정을 확인한다. 확인했을 때, character_set_database와 collation_connection 이 latin1로 설정이 되어있기에 이를 직접 변경해준다.
ALTER DATABASE SpringbootProject
CHARACTER SET = 'utf8mb4'
COLLATE = 'utf8mb4_general_ci';
SHOW VARIABLES LIKE 'c%';
SELECT @@time_zone, now();
10) 한글 테스트
간단한 테이블을 생성하여 한글이 입력이 되는지 확인해본다.
CREATE TABLE test (
id bigint(20) NOT NULL AUTO_INCREMENT,
content VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE = InnoDB;
INSERT INTO test(content) values ('테스트');
SELECT * FROM test;
11) EC2 RDS 접속
EC2에는 mysql 클라이언트가 설치되어있어야 한다. EC2에서 RDS로 접속하기 위한 명령어만 올바르게 작성해준다면 쉽게 접속할 수 있다.
sudo yum install mysql
mysql -u[사용자명] -p -h[RDS 엔드포인트]
[참고] 스프링 부트와 AWS로 혼자 구현하는 웹 서비스