[Spring Boot] Chap 6.AWS EC2 서버 환경 구축하기
by me
스프링 부트와 AWS로 혼자 구현하는 웹서비스 (프리렉, 이동욱 지음) 책에서 공부한 내용을 정리한 게시글입니다.
해당 시리즈의 소스코드는 이곳에서 확인할 수 있습니다.
목차
- 서버 그리고 다양한 클라우드 서비스란?
- EC2 서버 생성/접속하기
- 아마존 리눅스 1 서버 필수 설정하기
이번 게시글에서는 AWS EC2 인스턴스를 생성부터 환경 설정 그리고 이유를 중점으로 설명하겠습니다.
서버 그리고 다양한 클라우드 서비스란?
서비스와 서버
서비스를 개발하고 사용자들에게 보여지기 위해서 개발한 애플리케이션을 서버 에 배포해야합니다. 배포하는 방법에는 3가지 선택지가 있습니다.
- 집에 PC를 24시간 구동 시킨다.
- 호스팅 서비스(카페24, 코리아 호스팅 등)을 이용한다.
- 클라우드 서비스(AWS, AZURE, GCP 등)을 이용한다.
위의 선택지 중 본인의 상황에 맞게 선택하여 사용하면됩니다. 일반적으로 비용은 호스팅 서비스나 집 PC를 이용하는 것이 저렴합니다. 만약 특정 시간에만 트래픽이 몰린다면 유동적으로 사양을 늘릴 수 있는 클라우드 가 유리합니다.
클라우드 서비스
클라우드 서비스는 쉽게 말하면 인터넷(클라우드)을 통해 서버, 스토리지(파일 저장소), 데이터베이스, 네트워크, 소프트웨어, 모니터링 등의 컴퓨팅 서비스를 제공하는 것입니다.
클라우드 서비스에는 몇 가지 형태가 있습니다.
- Infrastructure as a Service(IaaS, 아이아스, 이에스)
- 기존 물리 장비를 미들웨어와 함께 묶어둔 추상화 서비스입니다.
- 가상머신, 스토리지, 네트워크, 운영체제 등의 IT인프라를 대여해 주는 서비스라고 보면 됩니다.
- AWS의 EC2, S3 등
- Platform as a Service(PaaS, 파스)
- 앞에서 언급한 IaaS에서 한 번 더 추상화 한 서비스입니다.
- 한 번 더 추상화했기 때문에 많은 기능이 자동화되어 있습니다.
- AWS의 Beanstalk(빈스톡), Heroku(헤로쿠) 등
- Software as a Service(SaaS, 사스)
- 소프트웨어 서비스를 이야기합니다.
- 구글 드라이브, 드랍박스, 와탭 등
AWS를 선택한 이유
- 첫 가입 시 1년간 대부분 서비스가 무료 입니다. 단, 서비스마다 제한이 있습니다.
- 클라우드에서는 기본적으로 지원하는 기능(모니터링, 로그관리, 백업, 복구, 클러스터링 등)이 많아 개인이나 소규모일 때 개발에 좀 더 집중할 수 있습니다.
- 많은 기업이 AWS로 이전 중이기 때문에 이직할 때 AWS 사용 경험은 도움이 됩니다. 국내에서는 AWS 점유율이 압도적입니다.
- 사용자가 많아 국내 자료와 커뮤니티가 활성화 되어 있습니다.
EC2 서버 생성/접속하기
EC2(Elastic Compute Cloud)란 AWS에서 제공하는 성능, 용량 등을 유동적으로 사용할 수 있는 서버입니다. AWS에서 무료로 제공하는 프리티어 플랜에서는 EC2 사용에 다음과 같은 제한이 있습니다.
- 사양이 t2.micro만 사용가능
- 월 750시간의 제한이 있습니다. 초과시 비용 부과
EC2 서버를 생성하기 위해 AWS 계정이 필요합니다.
계정을 생성했다면 오른쪽 상단 지역을 서울 로 맞춰줍니다. 그리고 왼쪽 상단 서비스 > EC2 선택 > 인스턴스 (시작)생성 선택합니다.
단계 1: AMI(Amazon Machine Image) 선택 - Amzon Linux AMI 2018.03.0(HVM), SSD Volume Type
AMI(Amazon Machine Image)
는 EC2 인스턴스를 시작하는 데 필요한 정보를 이미지로 만들어 둔 것 을 이야기합니다. 인스턴스라는 가상머신에 운영체제 등을 설치할 수 있게 구워 넣은 이미지로 생각하면 됩니다.
참고로 Amazon Linux AMI 2 가 아니라 1을 선택 해야합니다. 아마존 리눅스 1을 선택한 이유 는 아직 국내 자료가 리눅스 1이 더 많기 때문입니다. 보통 센토스 6 버전으로 진행되는 자료들은 아마존 리눅스 1에서 모두 사용할 수 있습니다. 아마존 리눅스 2는 센토스 7 버전 자료들을 그대로 사용할 수 있습니다.
그렇다면 센토스 AMI가 아닌 아마존 리눅스 AMI를 사용한 이유는?
- 아마존이 개발하고 있기 떄문에 지원받기가 쉽다.
- 레드햇 베이스이므로 레드햇 계열의 배포판을 많이 다워본 사람일수록 문제없이 사용할 수 있다.
- AWS의 각종 서비스와의 상성이 좋다.
- Amazon 독자적인 개발 리포지터리를 사용하고 있어 yum이 매우 빠르다.
단계 2: 인스턴스 유형 선택 - t2.micro(프리 티어 사용 가능)
여기서 t2는 요금 타입 을 이야기하며, micro는 사양 을 이야기 합니다. t2 외에 t3도 있으며 보통 이들을 T 시리즈 라고합니다. T 시리즈는 범용 시리즈로 불리기도 합니다.
이들은 다른 서비스와 달리 크레딧이란 일종의 CPU를 사용할 수 있는 포인트 개념이 있습니다. 인스턴스 크기에 따라 정해진 비율로 CPU 크레딧을 계속 받게 되며, 사용하지 않을 때는 크레딧을 축적하고, 사용할 때 이 크레딧을 사용합니다. 정해진 사양 보다 더 높은 트래픽이 오면 크레딧을 좀 더 적극적으로 사용하면서 트래픽을 처리하지만, 크레딧이 모두 사용되면 더이상 EC2를 사용할 수 없습니다. 그래서 트래픽이 높은 서비스들은 T 시리즈를 쓰지 않고 다른 시리즈를 사용하기도 합니다. 다만 그전까지는 활용도가 높기 때문에 시작하는 단계에서는 좋은 선택입니다.
단계 3: 인스턴스 세부 정보 구성
VPC, 서브넷 등을 세세하게 다루지만, 여기서는 혼자서 1대의 서버만 사용하니 별다른 설정을 하지 않고 넘어갑니다.
VPC와 서브넷 등은 AWS 서비스들의 네트워크 환경을 구성하는 정도로만 이해하면 됩니다.
단계 4: 스토리지 추가 - 크기(GiB) 30으로 설정
흔히 하드디스크 라고 부르는 서버의 디스크(ssd 포함)를 이야기하며 서버의 용량을 얼마나 정할지 선택하는 단계입니다. 여기서 설정의 기본값은 8GB 입니다. 모르고 넘어가는 분들이 있는데 프리티어에서 30GB 까지 무료 입니다. 크기를 30GB 로 설정합니다.
단계 5: 태그 추가
태그에는 웹 콘솔에서 표기될 태그인 Name 태그를 등록합니다. 태그는 해당 인스턴스를 표현하는 여러 이름으로 사용될 수 있습니다. EC2의 이름을 붙인다고 생각하고 넣으면 됩니다. 여러 인스턴스가 있을 경우 이를 태그별로 구분하면 검색이나 그룹 짓기 편하므로 여기서 본인 서비스의 인스턴스를 나타낼 수 있는 값으로 등록합니다.
단계 6: 보안 그룹 생성
보안 그룹은 방화벽을 이야기합니다. ‘서버로 80 포트 외에는 허용하지 않는다’ 는 역할을 하는 방화벽이 AWS에서는 보안 그룹으로 사용됩니다. 보안 그룹 이름엔 유의미한 이름 으로 변경합니다. ex) 프로젝트 애플리케이션 이름
보안 그룹 규칙 에는 인바운드와 아웃 바운드 가 있습니다. 인바운드 는 외부에서 AWS로 접속할 경우 규칙을 지정 한다고 생각하면 됩니다. 인바운드에 아래와 같이 규칙을 추가합니다.
SSH | TCP | 22 | 내 IP |
사용자 지정 TCP | TCP | 8080 | 사용자 지정 |
HTTPS | TCP | 443 | 사용자 지정 |
이 보안그룹 부분이 아주 중요합니다. 유형 항목에서 SSH이면서 포트 항목 22인 경우 AWS EC2에 터미널로 접속 할 때를 이야기 합니다. pem 키가 없으면 접속이 안 되니 전체 오픈(0.0.0.0/0,::/0)하는 경우를 종종 발견합니다. 이렇게 되면 이후 파일 공유 디렉토리나 깃허브 등에 실수로 pem 키가 노출되는 순간 서버에서 가상화폐가 채굴되는 것을 볼 수 있습니다.
pem 키 관리와 지정된 IP에서만 ssh 접속 이 가능하도록 구성하는 것이 안전합니다.
단계 7. 인스턴스 시작 검토
선택한 항목을 확인하고 시작하기 버튼을 클릭합니다.
인스턴스로 접근하기 위해서는 pem 키(비밀키)가 필요합니다. 그래서 인스턴스 마지막 단계는 할당할 pem 키를 선택하는 것입니다. 인스턴스는 지정된 pem 키와 매칭되는 공개키를 가지고 있어, 해당 pem 키 외에는 접근을 허용하지 않습니다. 일종의 마스터키 이기 때문에 절대 유출되면 안 됩니다.
키까지 발급을 완료 했다면 인스턴스 생성이 완료 됩니다.
Elastic IP(EIP, 탄력적 IP) 할당
인스턴스도 결국 하나의 서버이기 때문에 IP가 존재합니다. 인스턴스 생성 시에 항상 새 IP를 할당하는데, 한 가지 조건이 더 있습니다. 같은 인스턴스를 중지하고 다시 시작할 때도 새 IP가 할당됩니다. 즉, 요금을 아끼기 위해 잠깐 인스턴스를 중지하고 다시 시작하면 IP가 변경 되는 것입니다. 이렇게 되면 매번 접속해야 하는 IP가 변경 돼서 PC에서 접근할 때마다 IP 주소를 확인 해야합니다. 그렇기 때문에 인스턴스의 IP가 변경되지 않고 고정 IP를 가지게 하기 위해 탄력적 IP 를 할당받겠습니다.
- 네트워크 및 보안 > 탄력적 IP > 새 주소 할당
고정 IP를 할당 받았으면 인스턴스와 할당받은 주소의 연결 이 필요합니다.
- 탄력적 IP > Action > 탄력적 IP 주소 연결
이렇게 하면 인스턴스와 주소가 연결 완료됩니다.
EC2 서버에 접속하는 방법은 이곳을 참고해주세요
아마존 리눅스 1 서버 필수 설정하기
- Java 8 설치
- 아마존 리눅스 1의 기본 자바 버전은 7입니다. 그리고 현재 이 프로젝트의 버전은 Java 8 입니다.
- 타임존 변경
- 기본 서버의 시간은 미국 시간대입니다. 한국 시간대가 되어야만 우리가 사용하는 시간이 모두 한국 시간으로 등록되고 사용됩니다.
- 호스트네임 변경
- 현재 접속한 서버의 별명을 등록합니다. 실무에서는 한 대의 서버가 아닌 수십 대의 서버가 작동되는 데, IP만으로 어떤 서버가 어떤 역할을 하는지 알 수 없습니다. 이를 구분하기 위해 보통 호스트 네임을 필수로 등록합니다.
Java 8 설치
터미널에서 명령어 입력 후 Java 8 설치하기
sudo yum install -y java-1.8.0-openjdk-devel.x86_64
인스턴스의 Java 버전을 8로 변경
sudo /usr/sbin/alternatives --config java
명령어 입력 후 Java8 선택 2 입력
Java 7 삭제
sudo yum remove java-1.7.0-openjdk
타임존 변경
sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
명령어를 차례로 수행후 date
명령어로 타임존 KST 확인
호스트네임 변경
각 서버가 어느 서비스인지 표현하기 위해 HOSTNAME을 변경 하겠습니다.
sudo vim /etc/sysconfig/network
편집기를 열고 화면에서 노출되는 항목 중 HOSTNAME으로 되어있는 부분을 본인이 원하는 서비스명으로 변경 합니다.
변경 후 sudo reboot
명령어 입력 후 서버를 재부팅
Hostname이 등록되었다면 한 가지 작업을 더 해야 합니다. 호스트 주소를 찾을 때 가장 먼저 검색해 보는 /etc/hosts에 변경한 hostname을 등록 합니다.
sudo vim /etc/hosts
// /etc/hosts 내용
127.0.0.1 localhost...
::1 ...
127.0.0.1 등록한 HostName
해당 편집 내용에서 127.0.0.1 등록한 HostName
을 등록합니다. 그리고 wq로 저장 후 종료
여기까지 AWS EC2 인스턴스 생성, 환경설정에 대한 내용입니다. 다음 게시글은 RDS를 생성해 보겠습니다.
Related Posts
- Chap 1.스프링 부트 시작하기
- Chap 2.테스트 코드 작성하기
- Chap 3.스프링 부트에서 JPA사용하기
- Chap 4.Mustache로 화면 구성하기
- Chap 5.스프링 시큐리티와 OAuth2.0
- Chap 6.AWS EC2 서버 환경 구축하기 - Now
- Chap 7.AWS RDS 생성하기
- Chap 8.EC2 서버에 프로젝트 배포하기
- Chap 9.Travis CI 배포 자동화
- Chap 10.Nginx를 이용한 무중단 배포
References
- 스프링 부트와 AWS로 혼자 구현하는 웹서비스 (프리렉, 이동욱 지음)