'스프링 부트와 AWS로 혼자 구현하는 웹 서비스'를 읽고 정리한 글입니다.
특정 시간에만 트래픽이 몰린다면 유동적으로 사양을 늘릴 수 있는 클라우드가 유리하다.
클라우드 서비스는 쉽게 말하면 인터넷을 통해 서버, 스토리지(파일 저장소), 데이터베이스, 네티워크, 소프트웨어, 모니터링 등의 컴퓨팅 서비스를 제공하는 것이다.
클라우드의 형태
Iaas (Infrastructure as a Service)
- 기존 물리 장비를 미들웨어와 함께 묶어둔 추상화 서비스
- 가상머신, 스토리지, 네트워크, 운영체제 등의 IT 인프라를 대여해 주는 서비스
- AWS의 EC2, S3 등
Paas (Platform as a Service)
- Iaas에서 한번 더 추상화한 서비스
- 많은 기능이 자동화 되어 있음
- AWS의 Beanstalk 빈스톡, Heroku 등
Saas (Software as a Service)
- 소프트웨어 서비스
- 구글 드라이브, 드랍박스, 와탭 등
배포할 때마다 서버가 다운되면 제대로 된 서비스를 만들 수 없으니 무중단 배포는 필수이고 빈스톡은 사용할 수 없다.
그래서 Iaas를 사용할 것이다.
6.1 AWS 회원 가입
6.2 EC2 인스턴스 생성하기
EC2는 AWS에서 제공하는 성능, 용량 등을 유동적으로 사용할 수 있는 서버다.
프리티어 플랜에서 EC2 사용에 다음 제한이 있다.
- 사양이 t2.micro만 가능하다.
- vCPU(가상 CPU) 1 Core, 메모리 1GB 사양이다.
- 보통 vCPU는 물리 CPU 사양의 절반 정도의 성능을 가진다.
- 월 750시간의 제한이 있다. 초과하면 비용이 부과된다.
Region이란?
- AWS의 서비스가 구동될 지역을 이야기한다.
- AWS는 도시별로 클라우드 센터를 지어 해당 센터에서 구축된 가상머신들을 사용할 수 있다. 이것을 리전이라고 한다.
EC2를 생성하기 전에, Region을 변경해야 한다.
- Region을 서울로 변경한다.
- EC2 서비스 선택
- 인스턴스란 EC2 서비스에 생성된 가상머신을 이야기한다.
- 인스턴스 시작 클릭
이름 및 태그
- 태그에 웹 콘솔에서 표기될 태그를 등록한다.
- 태그는 해당 인스턴스를 표현하는 여러 이름으로 사용될 수 있다.
- EC2의 이름을 붙인다고 생각하면 된다.
애플리케이션 및 OS 이미지
- AMI는 EC2 인스턴스를 시작하는 데 필요한 정보를 이미지로 만들어 둔 것을 이야기한다.
- 인스턴스라는 가상 머신에 운영체제 등을 설치할 수 있게 구워 넣은 이미지로 생각하면 된다.
- 아마존 리눅스 AMI는 AWS에서 개발하고 있기 때문에 지원받기 쉽고, AWS의 각종 서비스와의 상성이 좋다.
인스턴스 유형
- t2는 요금 타입을 얘기하며, micro는 사양을 말한다.
- t2 외에 t3도 있으며 보통 T 시리즈라고 한다.
- T 시리즈는 다양한 사양을 사용할 수 있다.
- T 시리즈는 다른 서비스와 달리 크레딧이란 일종의 CPU를 사용할 수 있는 포인트 개념이 있다.
- 인스턴스 크기에 따라 정해진 비율로 CPU 크레딧을 계속 받게 되며, 사용하지 않을 때는 크레딧을 축적하고, 사용할 때 이 크레딧을 사용한다. (무슨 말일까..)
정해진 사양보다 더 높은 트래픽이 오면 크레딧을 더 사용하면서 트래픽을 처리하지만, 크레딧이 모두 사용되면 더이상 EC2를 사용할 수 없다. 그래서 트래픽이 높은 서비스들은 T 시리즈를 쓰지 않고 다른 시리즈를 사용하기도 한다. 하지만 시작하는 단계에서 좋은 선택이다.
키 페어
- 인스턴스로 접근하기 위해서 pem 키(비밀키)가 필요하다.
- 인스턴스는 지정된 pem 키와 매칭되는 공개키를 가지고 있어, 해당 pem 키 외에는 접근을 허용하지 않는다.
- 일종의 마스터키로 절대 유출되면 안된다.
- pem 키는 이후 EC2 서버로 접속할 때 필수 파일이니 잘 관리해야 한다.
네트워크 설정
1인 개발 시 대량의 서버를 사용하지 않는다면 굳이 별도로 구성할 필요가 없어 기본 생성되는 값을 사용한다.
보안 그룹
- 보안 그룹은 방화벽을 말한다.
- '서버로 80 포트 외에는 허용하지 않는다'는 역할을 하는 방화벽이 AWS에서는 보안 그룹으로 사용된다.
- SSH이면서 포트 번호가 22인 경우는 AWS EC2에 터미널로 접속할 때를 얘기한다.
- 지정된 IP에서만 ssh 접속이 가능하도록 구성하는 것이 안전하다.
- 집의 IP를 기본적으로 추가하고(내 IP를 선택하면 접속한 장소의 IP가 자동 지정됨) 그 외에 다른 장소에서 젒속할 때는 해당 장소의 IP를 다시 SSH 규칙에 추가하는 것이 안전하다.
스토리지 구성
- 스토리지 구성은 흔히 하드디스크라 부르는 서버의 디스크(SSD 포함)를 이야기하며
서버의 용량을 얼마나 정할지 선택하는 단계다.
생성하기
성공적으로 인스턴스를 생성하였다. 인스턴스 id를 클릭하여 EC2 목록으로 이동하자.
인스턴스를 클릭하여 세부 정보에서 IP와 도메인이 할당된 것을 확인 할 수 있다.
- 인스턴스도 하나의 서버이기 때문에 IP가 존재한다.
- 인스턴스 생성 시에 항상 새 IP를 중지하고 다시 시작할 때도 새 IP가 할당된다.
- 매번 접속해야 하는 IP가 변경돼서 PC에서 접근할 때마다 IP 주소를 확인해야 한다.
- 번거로우므로 인스턴스의 IP가 매번 변경되지 않고 고정 IP를 가지게 해야 한다.
EIP(탄력적 IP) 할당
- AWS의 고정 IP를 Elastic IP(EIP, 탄력적 IP)라고 한다.
왼쪽 카테고리에서 탄력적 IP를 선택하여 생성해보자.
생생한 탄력적 IP와 EC2 인스턴스를 연결해야 한다.
작업 - 탄력적 IP 주소 연결을 선택한다.
인스턴스 정보에서 탄력적 IP가 연결된 것을 확인할 수 있다.
- 생성한 탄력적 IP는 생성하고 EC2 서버에 연결하지 않으면 비용이 발생한다.
- 생성한 탄력적 IP는 무조건 EC2에 바로 연결해야 하며 더 사용할 인스턴스가 없을 때도 탄력적 IP를 삭제해야 한다.
- 비용 청구가 되므로 잊지 말고 삭제하자.
6.3 EC2 서버에 접속하기(Window)
putty.org 접속
- putty.exe
- puttygen.exe
위 두 파일 설치 후 puttygen.exe 실행
키 페어에서 다운로드 받은 pem 키를 ppk 파일로 변환 후 save private key 버튼 클릭
putty 실행하여 ID@EIP 등록
생성한 ppk 등록
Session 탭에서 현재 설정 저장
open하여 Accpet 클릭 선택
EC2 접속을 진행 해봤다. 이제 리눅스 서버에 추가 설정 작업을 진행하자.
6.4 아마존 리눅스 서버 생성 시 꼭 해야 할 설정들
자바 기반의 웹 애플리케이션(톰캣과 스프링부트)가 작동해야 하는 서버들에서 필수로 해야 하는 설정들이다.
- Java 8 설치: 현재 프로젝트의 버전
- 타임존 변경: 기본 서버의 시간은 미국 시간대다. 한국 시간대로 변경
- 호스트네임 변경: 현재 접속한 서버의 별명 등록
- 실무에서는 수십 대의 서버가 작동한다.
- IP만으로 어떤 서버가 어떤 역할을 하는지 알 수 없으므로 이를 구분하기 위해 호스트 네임을 필수로 등록하자.
EC2에 접속한 뒤에 다음 과정을 진행하자.
Java 8 설치
EC2에서 아래 명령어 실행하여 Java 8 설치
sudo yum install -y java-1.8.0-openjdk-devel.x86_64
설치가 완료되면 인스턴스의 Java 버전을 8로 변경
sudo /usr/sbin/alternatives --config java
자바 버전 확인
타임존 변경
- EC2 서버의 기본 타임존은 UTC로 한국의 시간과 9시간 차이난다.
- 서버의 타임존을 한국 시간으로 변경하자.
Hostname 변경
IP만으로 어떤 서비스의 서버인지 표현하기 어려우므로 Hostname을 변경하여 알아볼 수 있도록 하자.
변경 후 서버를 재부팅하자.
이 과정에서 remote side unexpectedly closed network connection 에러가 발생했다.
책에서 설명한 내용은 Amazon Linux AMI 버전을 기준으로 되어있다.
아마존 Linux AMI는 2020년을 마지막으로 지원이 종료되었으므로 여기선 Linux AMI 2를 선택할 수 밖에 없었다.
Linux AMI 2에선 다른 방법으로 hostname을 변경해야 한다.
https://aws.amazon.com/ko/premiumsupport/knowledge-center/linux-static-hostname-rhel7-centos7/
sudo hostnamectl set-hostname 호스트명
Hostname을 등록하고 수정이 되었다면 추가 설정을 해야 한다.
정상적으로 등록되었는지 확인해보자.
- 아직 80포트로 실행된 서비스가 없음을 의미한다.
EC2 설정이 완료되었으니 AWS의 데이터베이스 서비스인 RDS를 생성하고 설정해보자.