본문 바로가기
개발/스프링

[혼자 구현하는 웹서비스] 6. AWS 서버 환경을 만들어보자 - AWS EC2

by 카펀 2022. 1. 16.

* 이 글은 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스' (프리렉, 이동욱 저)를 공부하며 내용을 정리한 글입니다.

* 이 글은 5. 스프링 시큐리티와 OAuth 2.0으로 로그인 기능 구현하기 (2)에서 이어집니다.

 

0. 개요

1. EC2 인스턴스 생성하기

2. EC2 서버에 접속하기

3. 아마존 리눅스 1 서버 생성 시 꼭 해야 할 설정들

 

0. 개요

앞으로 두 챕터에 걸쳐서 배포 환경을 구축하는 과정을 살펴보도록 하겠다. 이를 위해 AWS (Amazon Web Services)라는 클라우드 서비스를 이용할 것이다. 유사한 서비스로는 Google Clouds, Microsoft Azure, IBM Cloud 등이 존재하지만, AWS가 가장 대중적이고, 그만큼 공개된 자료도 많기 때문에 여기서는 AWS로 진행해 보도록 한다.

우리가 앞서 만든 웹 서비스를 외부에서 접근하려면 24시간 작동하는 서버가 필요하다. 이를 구축하는 방법은 크게 세 가지가 존재한다.

 

  • 집에서 개인 PC를 24시간 구동시킨다.
  • 호스팅 서비스 (Cafe24 등)를 이용한다.
  • 클라우드 서비스 (AWS, Azure 등)를 이용한다.

일반적인 비용은 호스팅 서비스나 개인 PC가 유리하지만, 클라우드 서비스는 안정성과 유동성에서 큰 장점을 가진다. 만약 내가 만든 서비스의 사용자 트래픽이 지수함수 모양으로 증가한다면, 즉 갈수록 점점 더 많은 사용자가 생긴다면, 개인 PC만으로는 버틸 수 없는 때가 올 것이고, 그 때 서버 증설을 하려면 물리적, 소프트웨어적 증설 과정이 필요하다.

클라우드 서비스는 그런 과정이 필요 없다. 필요한 만큼 서비스에서 제공하는 자원을 더 받아 쓰고, 그만큼 값을 지불하면 된다. 뿐만 아니라 하드웨어 관리, 로그 관리, 모니터링 등을 전부 클라우드 서비스에서 API 형태로 지원해 준다. 따라서 운영적인 면에서 훨씬 편리하다.

 

클라우드 서비스는 몇 가지 카테고리로 나뉜다.

 

  • Iaas (아이아스, 이에스; Infrastructure as a Service) - 기존 물리 장비를 미들웨어와 함께 묶어 둔 추상화 서비스이다.
  • PaaS (파스; Platform as a Service) - IaaS를 한번 더 추상화한 서비스이며, 많은 기능이 자동화 되어있다.
  • Saas (사스; Software as a Service) - 소프트웨어 서비스이다.

앞으로 사용할 AWS는 모두 IaaS이다. 프리티어로 무중단 배포가 가능하게끔 구성한다.

 

1. EC2 인스턴스 생성하기

 

EC2란, Elastic Compute Cloud의 약자로, AWS에서 제공하는 성능, 용량 등을 유동적으로 조절하여 사용할 수 있는 서버이다. 가장 대중적으로 사용되는 서비스이다.

AWS에서는 프리티어 플랜을 무료로 제공하는데, 다음과 같은 제약이 있다.

 

  • 사양이 t2.micro만 가능하다. 가상 CPU 1core, 메모리 1GB 사양이며, 가상 CPU는 물리 CPU 사양의 절반 정도의 성능을 가진다.
  • 월 750시간의 제한이 있으며, 이를 초과하면 비용이 부담된다. 24 * 31일 = 744시간이므로, 1대의 t2.micro만 사용하면 24시간 무료로 사용할 수 있다.

EC2를 만들기 전에, 계정에 설정된 리전을 변경하자.

 

리전 변경

보통 처음에는 오하이오로 설정되어 있다. 서울로 변경해 주면 된다.

 

다음으로, 상단의 검색창에 EC2를 찾아서, 클릭한다.

 

EC2

클릭하면 EC2 대시보드가 나오는데, 내용이 많아 복잡해 보인다.

가운데쯤에 있는 '인스턴트 시작'을 눌러 주자.

 

인스턴트 시작

EC2 인스턴스를 생성하는 첫 단계는 AMI (Amazon Machine Image)를 선택하는 것이다. AMI란, EC2 인스턴스를 시작하는데 필요한 정보를 이미지로 만들어 둔 것이다. 즉, 미리 설치할 수 있도록 구워 둔 것이다.

 

Amazon Linux 2 AMI 선택

위에 보이는 목록 중 Amazon Linux 2 AMI - Kernel 4.14를 선택하였다. 아무래도 너무 최신 버전은 정보 찾기가 어려울 것 같아서...

이후 인스턴스 유형 선택에서는 '프리 티어 사용 가능'이 붙어 있는 t2.micro를 선택하면 된다.

부연 설명을 하자면, t2는 요금 타입을 의미하며, micro는 사양을 얘기한다.

 

다음 단계는 세부 정보 구성이다. 기업에서 사용할 경우 VPC, 서브넷 등을 세세하게 다루겠지만, 1인 소규모 개발에서는 이를 고려하지 않아도 괜찮다. 다음으로 넘어간다.

 

스토리지 및 태그 설정

스토리지는 서버에서 사용하는 용량을 의미하는데, 프리 티어에서는 30GB까지 설정할 수 있다. 30GB로 바꿔 주고 다음으로 넘어가면 된다.

태그는 웹 콘솔에서 표기될 태그인 Name 태그를 등록한다. EC2의 이름을 붙인다고 생각하면 된다.

 

보안 그룹 설정

보안 그룹은 방화벽을 의미한다. 위처럼 이름 및 내용을 추가해 주면 된다.

보안그룹 부분이 중요한데, 유형 항목에서 SSH면서 포트 범위가 22인 경우는 AWS EC2에 터미널로 접속할 때를 의미한다. pem 키가 없으면 접속이 안 되니 전체 오픈 (0.0.0.0/0, ::/0)으로 해 둔다면, 파일 공유 디렉토리나 GitHub 등에 pem 키가 노출되어 제3자가 서버에 접근하는 불상사가 발생할 수 있다. 따라서 내 IP에서만 접속할 수 있도록 하였다.

 

인스턴스에 접근하기 위해서는 pem 키가 필요하다. 그러므로 마지막으로, 할당할 pem키를 선택한다. 인스턴스는 지정한 pem키와 매칭되는 공개 키를 가지고 있어, 해당 pem키 외에는 접속을 허용하지 않는다. 이는 절대로 유출되면 안 되는 값이다.

 

pem 키 생성

 

키 페어 다운로드까지 마쳤다면 인스턴스 시작을 누르자. 아래와 같은 화면이 나온다.

 

인스턴스 시작 상태

인스턴스에 대한 자세한 정보를 확인하려면 '다음 인스턴스 시작이 개시됨: @@@@@' 을 클릭하면 된다. 앞서 Name 태그를 따로 설정하였으므로, 인스턴스 이름이 보이는 것까지 확인할 수 있다.

 

자세한 내용을 확인해 보면, 인스턴스에 IP와 도메인이 할당된 것을 확인할 수 있다. 인스턴스 생성 시에 새로운 IP를 할당하며, 인스턴트를 중지하고 다시 시작할 때도 새 IP가 할당된다. 따라서 요금을 아끼기 위해 인스턴트를 중지하고 다시 시작하면 IP가 변경되므로, 매번 확인하기에는 번거롭다. 이를 해결하기 위해 고정 IP를 가지도록 설정해 보자.

 

탄력적 IP 설정

발급받은 탄력적 IP를, 앞서 생성한 EC2 주소와 연결해 주자. IP 주소를 확인하고, 작업 > 탄력적 IP 주소 연결을 눌러 준다.

 

탄력적 IP를 앞서 생성한 EC2이름과 IP를 선택하여 연결해 준다.

 

설정한 후 인스턴스 정보를 다시 조회하여 퍼블릭, 탄력적 IP가 잘 연결되어 있는지 확인하자.

 

탄력적 IP는 생성하고 EC2 서버에 바로 연결하지 않으면 비용이 발생한다. 즉 생성한 직후에 EC2 서버에 연결해 주어야 하고, 사용할 인스턴스가 없는 경우 탄력적 IP를 삭제해야 한다.

 

2. EC2 서버에 접속하기

 

생성한 EC2 서버로 접속해 보자. Linux 계열 환경 (macOS, Linux, Windows WSL)에서 시도할 수 있는 환경이다. Putty를 이용하는 방법은 여기서는 다루지 않는다.

 

AWS와 같은 외부 서버로 SSH 접속을 하려면 아래와 같은 명령어를 입력하면 된다.

 

ssh -i pem '키 위치' 'EC2의 탄력적 IP 주소'

 

매번 치기에는 명령어가 너무 길다. 따라서 조금 쉽게 접속할 수 있도록 간단한 설정을 해 주자.

 

pem 키를 복사해서 옮겨 주자. 아래와 같이 하면 된다.

 

cp pem키명 ~/.ssh/
잘 복사되었는지 /.ssh로 이동하여 확인해 본다.

다음으로, pem 키의 권한을 변경해 주자.

 

권한 변경

이제 파일 소유자는 읽고 쓸 수 있고 그 외 사용자는 접근할 수 없다.

 

이어서 pem키가 있는 ~/.ssh 디렉토리에 config 파일을 생성해 준다.

VS Code가 설치되어 있다면 code ~/.ssh/config, 없다면 code 대신 vim을 입력해 주자.

 

config 파일 설정

macOS나 리눅스의 경우 별다른 문제 없이 저장이 되지만, Windows의 경우 저장 권한에 문제가 있을 수 있다.

Failed to save 'config': Unable to write file '\\wsl$\Ubuntu\~.ssh\config' (NoPermissions (FileSystemError): Error: EPERM: operation not permitted, mkdir '\\wsl$\Ubuntu\~.ssh')

위와 같은 에러 메세지가 나온다면, 아래와 같은 방법을 시도해 보자. (출처: StackOverflow)

 

sudo chown -R 'username' 'target directory'

저장 후에는 권한을 변경해 주자. 실행까지 가능해야 하므로 아래와 같이 설정해 주면 된다.

 

chmod

여기까지 완료했다면 다 왔다. 다음 명령어를 통해 접속해 보자.

 

ssh 'config에 등록한 서비스명'

성공적으로 EC2에 접속하였다.

3. 아마존 리눅스 1 서버 생성 시 꼭 해야 할 설정들

아마존 리눅스 서버를 처음 열었다면 몇 가지 설정해야 할 것들이 있다. 이것은 Java 기반의 웹 어플리케이션 (톰캣, 스프링부트)가 작동하는 서버에서는 모두 필수로 해야 하는 설정들이다.

 

  • Java 8 설치: 우리의 프로젝트는 Java 8로 작성되었다.
  • 타임존 변경: 기본 서버의 시간은 미국 기준이므로, 한국 시간대로 바꾸어 주어야 한다.
  • 호스트네임 변경: 현재 접속한 서버의 별명을 등록한다. 보통 실무에서는 수십 대의 서버가 작동하는데, IP만으로는 각 서버의 역할을 파악하기 어려우므로 보통 호스트 네임을 필수로 정한다.

EC2에 접속한 후에 진행하면 된다.

 

1. Java 8 설치

 

Java 8 설치

다음 명령어를 입력하자.

 

sudo yum install -y java01.8.0-openjdk-devel.x86_64

 

Amazon Linux 2 AMI - Kernel 4.14에는 기본적으로 Java가 설치되어 있지 않으므로, 기존에 따로 설치되어 있던 Java는 없으므로 선택하는 과정은 필요 없다.

 

java -version

Java 8이 잘 설치되었는지 명령어를 통해 확인하자.

 

2. 타임존 변경

서버의 시간이 현지 (한국)의 시간과 다르다면, 서버에서 수행되는 Java 어플리케이션에서 생성되는 시간이 모두 한국과 차이가 나게 된다.

 

아래의 명령어를 입력하자.

 

sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime

 

타임존 확인

date를 입력하면 KST로 잘 반영된 것을 확인할 수 있다.

 

3. Hostname 변경

 

위의 캡처를 보면 ec2-user@ip-172-31-43-5 라고 되어 있다. 이 인스턴스가 무엇을 하는지 짐작도 되지 않는다.

각 서버가 어떤 서비스인지 표현하기 위해 hostname을 변경해 보자. 아래의 명령어를 입력하여 hostname을 수정한다.

 

sudo hostnameclt '원하는 hostname'

 

sudo hostnamectl

이후 sudo reboot를 통해 서버를 재부팅 하면 정상적으로 적용된 것을 확인할 수 있다.

 

hostname이 변경되었다.

이후 한 가지 작업을 더 해 주어야 한다. 호스트 주소를 찾을 때 가장 먼저 검색해 보는 /etc/hosts/에 변경한 hostname을 등록하자.

 

sudo vim /etc/hosts

 

맨 아래 줄에 설정한 hostname을 입력해 주면 된다. 

잘 등록되었는지 확인해 보자.

 

curl '등록한 호스트 이름'

 

실행 결과

잘못 등록되었다면, (6) Could not resolve host 라는 메세지가 뜬다.

정상적으로 등록되었다면, 위와 같이 80 포트로 접근이 안 된다는 메세지가 뜬다. 이는 아직 80포트로 실행된 서비스가 없음을 의미한다.

 

지금까지 기본적인 AWS EC2 환경 생성 과정을 진행하였다. 이어서 AWS에 DB 환경을 만드는 과정을 진행해 보도록 하겠다.

댓글