임대일

AWS: EC2, Region, 탄력적 IP, SpringBoot 연동하기 본문

AWS

AWS: EC2, Region, 탄력적 IP, SpringBoot 연동하기

limdae94 2024. 6. 16. 17:13
 

비전공자도 이해할 수 있는 AWS 입문/실전 | JSCODE 박재성 - 인프런

JSCODE 박재성 | 비전공자 입장에서도 쉽게 이해할 수 있고, 실전에서 바로 적용 가능한 AWS 입문 강의를 만들어봤습니다!, 🤬 에라이, 못 해먹겠네!비전공자로 개발을 시작해 여러 회사에서 CTO로

www.inflearn.com

 

1. 배포

배포(Deployment)란 다른 사용자들이 인터넷을 통해서 사용할 수 있게 만드는 걸 의미한다.
쉽게 얘기해서 우리가 만든 웹 페이지나 서버를 다른 사람들이 사용하려면 인터넷 상에 배포가 돼있어야 한다.

배포되어 있어야만이 사용자는 인터넷으로 서비스에 접근할 수 있다.

 

자신의 컴퓨터에서 개발을 할 때는 localhost 라는 주소로 테스트도 하고 개발을 한다. 하지만 이 localhost 는 다른 컴퓨터에서는 접근이 불가능한 주소이다. 배포를 하게 되면 IP(ex. 124.16.2.1)나 도메인(ex. www.naver.com)과 같이 고유의 주소를 부여받게 되고, 다른 컴퓨터에서 그 주소로 접속할 수 있게 된다. 이것이 바로 배포이다.

 

따라서 어떤 서비스를 완성했다면, 그 다음 단계로 해야 하는 게 배포(Deployment)이다. 코딩을 배울 때도 기본적인 백엔드 서버를 만들 수 있는 역량이 갖춰졌다면, 그 다음에 배워야 하는 게 배포(Deployment)이다.


2. EC2

EC2(Elastic Compute Cloud)란 컴퓨터를 빌려서 원격으로 접속해 사용하는 서비스이다.
EC2 를 쉽게 말하자면 하나의 컴퓨터이다.

 

서버를 배포하기 위해서는 컴퓨터가 필요하다. 내가 가진 컴퓨터에서 서버를 배포해 다른 사용자들이 인터넷을 통해 접근할 수 있게 만들 수도 있다. 하지만 내 컴퓨터로 서버를 배포하면 24시간 동안 컴퓨터를 켜놔야 한다. 그리고 인터넷을 통해 내 컴퓨터에 접근할 수 있게 만들다보니 보안적으로도 위험할 수도 있다.

 

이러한 불편함 때문에 내가 가지고 있는 컴퓨터를 사용하지 않고, AWS EC2 라는 컴퓨터를 빌려서 사용하는 것이다.
이 외에도 AWS EC2는 여러 부가기능들(로깅, 오토스케일링, 로드밸런싱 등)을 많이 가지고 있다.

 

현업에서도 실제 서버를 배포할 때 AWS EC2를 아주 많이 사용한다.
백엔드 서버를 배포해야 할 때면 EC2에 서버를 배포해서 사용한다.

 

“그러면 프론트엔드 웹 페이지를 배포할 때는 AWS EC2를 사용하지 않는걸까?”


프론트엔드 웹 페이지를 배포할 때 AWS EC2 를 사용할 수도 있다. 하지만 AWS EC2 보다 vercel, netlify 또는 AWS S3 를 사용해서 주로 배포한다. 이게 어떤 것들인지 모를 경우 “AWS EC2는 백엔드 서버를 배포할 때 주로 사용하는구나“ 라고만 기억해도 괜찮다.


3. [실습] EC2 세팅하기: 리전

3.1 AWS EC2 서비스로 들어가서 리전 선택하기

AWS Region

3.2 리전이란

리전(Region)이란 인프라를 지리적으로 나누어 배포한 각각의 데이터 센터를 의미한다.

전 세계의 AWS Region

 

말이 어렵다. 조금 더 쉽게 풀어서 EC2에 대입해서 생각해보자. 우린 EC2 가 컴퓨터를 빌려서 원격으로 접속해 사용하는 서비스라는 걸 알고 있다. 여기서 EC2 를 통해 빌려서 쓸 수 있는 컴퓨터들이 전 세계적으로 다양하게 분포해있다. 이렇게 컴퓨터들이 위치한 위치를 보고 AWS 에서는 리전이라고 한다.

 

3.3 리전의 특징

  1. AWS는 전 세계적으로 다양한 리전을 보유하고 있다.

전 세계의 AWS Region

 

2. 각 리전은 고유의 이름을 가지고 있다. (us-east-1, eu-west-3)

Region 고유 이름

3.4 리전 선택 기준

사람들이 애플리케이션을 사용할 때는 네트워크를 통해 통신하게 된다. 이 때, 사용자의 위치와 애플리케이션을 실행시키고 있는 컴퓨터와 위치가 멀면 멀수록 속도가 느려진다. 따라서 애플리케이션의 주된 사용자들의 위치와 지리적으로 가까운 리전을 선택하는 것이 유리하다.

 

예를 들어, 한국 유저들이 주로 사용하는 서비스를 만들거라면 리전을 아시아 태평양(서울)로 선택하면 된다.

 

3.5 많이 하는 실수

아시아 태평양(서울) 리전에서 EC2를 생성해놓고, 실수로 미국 동부(버지니아 북부) 리전에 들어가서 생성한 EC2 가 없어졌다고 당황하는 경우가 있다.

 

리전마다 EC2 가 따로따로 관리가 되고 있으니 이 점 유의하자.

 


4. [실습] EC2 세팅하기: 기본 설정

4.1 이름 및 태그

EC2 의 이름을 설정하는 곳이다. 이름을 지을 때는 이 컴퓨터가 어떤 역할을 하는 지 알아볼 수 있게 작성한다. 예:instagram-server

이름 및 태그

 

4.2 Application and OS Images (Amazon Machine Image)

  • Ubuntu 22.04 LTS 선택

Application and OS Images (Amazon Machine Image): Ubuntu 22.04 LTS (프리 티어) 선택하기

 

OS를 선택하는 단계이다. OS(운영체제)란 Mac, Windows 7, Windows 10, Windows 11 같은 것들이 OS 이다. 하지만 Windows 나 Mac OS는 생각보다 용량도 많이 차지하고 성능도 많이 잡아먹는다. 그래서 서버를 배포할 컴퓨터의 OS 는 훨씬 가벼운 Ubuntu 를 많이 사용한다.

 

 

4.3 인스턴스 유형

우선 인스턴스라는 뜻부터 정리하고 가자. 인스턴스란, AWS EC2에서 빌리는 컴퓨터 1대를 의미한다. 그럼 인스턴스 유형은 무슨 뜻일까? 컴퓨터 사양을 의미한다. 컴퓨터 사양이 좋으면 좋을수록 많은 수의 요청을 처리할 수 있고, 무거운 서버나 프로그램을 돌릴 수 있다.

 

프리 티어에 해당하는 t2.micro 를 사용할 것이다.

 

여기서 많이들 오해하는 것은 t2.micro 는 학습할 때나 테스트할 때만 쓰는 안 좋은 사양의 컴퓨터라고 생각한다. 하지만 실제 서비스에서 활용해도 될 정도로 나름 괜찮은 사양이다. 하루 방문자 수가 2,000명 정도였던 서비스를 운영했었는데 문제 없이 잘 돌아갔다. 성능에 문제가 직접적으로 생기기 전까지는 너무 걱정하지 말자.

 

4.4 키 페어(로그인)

 

키 페어(Key Pair)는 무슨 뜻일까? EC2 컴퓨터에 접근할 때 사용하는 비밀번호라고 생각하면 된다.

말 그대로 열쇠(Key, 키)의 역할을 한다.

 

키 페어 생성하기

  • 키 페어 이름은 어떤 EC2에 접근하기 위한 키 페어였는 지 알아볼 수 있게 지정하면 좋다.
  • RSA.pem을 선택한 후에 키 페어를 생성하면 된다. ED25519가 뭔지, .ppk가 뭔지는 몰라도 된다. 중요하지 않다.
  • 키 페어를 생성하면 파일이 하나 다운받아질텐데, 그 파일은 잃어버리면 안 되니 잘 보관해놔야 한다.
  • 참고) 실습에서는 키 페어를 활용해서 EC2에 접근하지 않고, 더 편한 방법으로 접근할 예정이다.

 

5. EC2세팅하기: 보안그룹 설정

5.1 네트워크 설정

네티워크 설정 [편집] 선택하기

 

[인바운드 보안 그룹 규칙] 설정하기

 

네트워크 설정 칸을 보면 VPC Security Groups(보안 그룹) 가 보인다. 여기서 VPC 라는 개념은 AWS 를 입문하는 입장에서는 크게 중요하지 않으니 넘어가자. 나중에 AWS에 어느 정도 익숙해졌을 때 VPC를 학습하도록 하자. VPC 를 몰라도 서버를 배포하는 데 아무 문제가 없다.

 

하지만 Security Groups(보안 그룹) 은 서버를 배포할 때 중요한 개념이므로 자세히 알아보자.

 

5.2 보안 그룹이란

보안 그룹(Security Group)이란 AWS 클라우드에서의 네트워크 보안을 의미한다.

보안 그룹을 거치는 인바운드, 아웃바운드

 

EC2 인스턴스이라고 생각한다면, 보안 그룹집 바깥 쪽에 쳐져있는 울타리와 대문이라고 생각하면 된다. 집에 접근할 때 울타리의 대문에서 접근해도 되는 요청인지 보안 요원이 검사를 하는 것과 비슷하다.

 

인터넷에서 일부 사용자가 EC2 인스턴스에 접근(액세스)하려고 한다고 가정해보자. 위 그림과 같이 EC2 인스턴스 주위에 방화벽 역할을 할 보안 그룹(Security Group)을 만들고 보안 그룹에 규칙을 지정한다. 이 보안 규칙에는 인바운드 트래픽(즉, 외부에서 EC2 인스턴스로 보내는 트래픽)에서 어떤 트래픽만 허용할 지 설정할 수 있고, 아웃바운드 트래픽(즉, EC2 인스턴스에서 외부로 나가는 트래픽)에서 어떤 트래픽만 허용할 지 설정할 수 있다.

 

보안 그룹을 설정할 때는 허용할 IP 범위포트(port)를 설정할 수 있다.

 

그러면 EC2 인스턴스를 생성할 때 어떻게 보안 그룹(Security Group)을 설정해야 하는 지 알아보자.

 

5.3 보안그룹 설정

외부에서 EC2로 접근할 포트는 22번 포트80번 포트라고 생각해서 이 2가지에 대해 인바운드 보안 그룹 규칙을 추가했다. 왜냐하면 22번 포트는 우리가 EC2에 원격 접속할 때 사용하는 포트이고, 80번 포트에는 백엔드 서버를 띄울 예정이기 때문이다. 그리고 어떤 IP에서든 전부 접근할 수 있게 만들기 위해 소스 유형은 위치 무관으로 설정했다.

[인바운드 보안 그룹 규칙] ssh, HTTP

 


6. IP와 Port의 개념

6.1 IP의 개념

💡 한 줄 요약 : 네트워크 상에서의 특정 컴퓨터를 가리키는 주소

 

아래와 같은 값이 IP 주소이다.

13.250.15.132

 

IP는 특정 컴퓨터의 주소를 가리킨다. 예를 들면, naver.com이라는 서비스도 IP 주소를 가지고 있다.
저 IP 주소는 네이버가 운영하고 있는 컴퓨터의 주소이기도 하다.

 

네이버 Server: 61.41.153.2

6.2 Port의 개념

 

💡 한 줄 요약 : 한 컴퓨터 내에서 실행되고 있는 특정 프로그램의 주소이다.

 

아래와 같은 값에서 :3000 부분이 포트 번호를 의미한다.

 

13.250.15.132:3000

 

한 컴퓨터 내에서 여러 프로그램이 실행되고 있을 것이다. 내가 지금 사용하고 있는 노트북만 보더라도 크롬, 카카오톡, 슬랙, VSCode 등 여러가지 프로그램이 동시에 실행되고 있다. 실제 서버를 운영하는 컴퓨터도 동일하다. 하나의 컴퓨터에서 여러가지의 프로그램이 실행된다.

 

그럼 외부에서 특정 컴퓨터 내부에 있는 Spring Boot라는 서버에 통신을 하고 싶다고 가정하자. 하지만 외부에서 IP 주소만 알아서는 실행되고 있는 여러 프로그램 중 어떤 프로그램과 통신을 해야 할 지 알 수가 없다. 그래서 특정 서버와 통신을 할 때는 IP 주소와 서버가 실행되고 있는 포트 번호까지 알고 있어야 한다.

 

6.3 브라우저 창에 포트 번호를 입력하지 않는 이유

위 설명에서 분명 특정 서버와 통신하기 위해서는 IP 주소포트 번호를 둘 다 알아야 된다고 했다. 도메인 주소를 통해서 알 수 있는 건 IP 주소 뿐이다. 그럼 포트 번호를 입력해주지도 않았는데 어떻게 정상적으로 통신을 한 걸까?

네이버 도메인 주소: naver.com

 

주소창에 도메인 주소를 입력해서 엔터를 누르면, 브라우저(크롬, 익스플로러 등)는 기본적으로 80번 포트로 통신을 보내게 설정되어 있다. 그래서 포트 번호를 입력해주지 않아도 통신이 잘 됐던 것이었다. 만약 80번 포트로 통신하고 싶지 않고, 3000번 포트로 통신하고 싶다면 아래와 같이 주소창에 입력해야 한다.

 

3000번 포트로 네이버에 접속하기

 

6.4 잘 알려진 포트(well-known port)란

🧑🏻‍🦱 포트(Port)에는 잘 알려진 포트(well-known port)라는 개념이 있다. 이 개념에 대해 알아보자.

 

포트 번호는 0 ~ 65,535번까지 사용할 수 있다. 그 중에서 0 ~ 1023번까지의 포트 번호는 주요 통신을 위한 규약에 따라 이미 정해져 있다. 이렇게 규약을 통해 역할이 정해져있는 포트 번호를 보고 잘 알려진 포트(well-known port)라고 부른다.

 

규약으로 정해져 있는 포트 번호 중 자주 사용되는 포트 번호에 대해서만 알아보자.

  • 22번 (SSH, Secure Shell Protocol): 원격 접속을 위한 포트 번호: EC2 인스턴스에 연결할 때 22번 포트를 사용한다.
  • 80번 (HTTP) : HTTP로 통신을 할 때 사용
  • 443번 (HTTPS) : HTTPS로 통신을 할 때 사용

여기서 착각하면 안 되는 점은 위에서 정해놓은 규약을 꼭 지키지 않아도 된다. 즉, 규약으로 정해져 있는 포트 번호와 다르게 사용해도 된다는 뜻이다. 예를 들어, 특정 서버와 HTTP 통신을 할 때 80번 포트를 쓰지 않고 3000번 포트나 8080번 포트를 써도 상관 없다.


7. EC2 세팅하기: 스토리지 구성

7.1 스토리지 구성

스토리지

 

우리가 쓰고 있는 노트북이나 데스크톱 컴퓨터는 전부 하드디스크를 가지고 있다. 하드디스크는 컴퓨터에서 파일을 저장하는 공간이다. EC2 도 하나의 컴퓨터이다보니 여러 파일들을 저장할 저장 공간이 필요하다. 이 저장 공간을 보고 EBS(Elastic Block Storage)라고 부른다. 즉, EBS 란 EC2 안에 부착되어 있는 일종의 하드디스크라고 생각하면 된다.

 

EBS 와 같은 저장 공간을 조금 더 포괄적인 용어로 스토리지(Storage), 볼륨(Volume)이라고 부른다.

7.2 스토리지 셋팅

30GiB, gp3 으로 변경

 

스토리지의 종류를 보면 gp3 이외에도 여러가지 종류의 스토리지가 있다. 하지만 가성비가 좋은 gp3 를 선택해주자. 용량을 30GiB 를 설정한 이유는 프리 티어에서 30GiB 까지 무료로 제공해주기 때문이다. 이 스토리지의 크기는 추후에 늘릴 수도 있으므로 처음 설정할 때 너무 큰 고민을 할 필요는 없다.

 


8. [실습] EC2 접속하기

8.1 생성된 인스턴스 정보 해석하기

  1. 세부 정보

EC2 퍼블릭 IPv4 주

 

세부 정보에서 눈여겨 봐야 할 부분은 2가지 밖에 없다. 퍼블릭 IPv4 주소인스턴스 상태이다.

  • 퍼블릭 IPv4 주소는 EC2 인스턴스가 생성되면서 부여받은 IP 주소이다. EC2 인스턴스에 접근하려면 이 IP 주소로 접근하면 된다.
  • 인스턴스 상태는 말그대로 EC2 인스턴스가 실행 중이라는 뜻은 컴퓨터가 켜져있다는 뜻이다.

인스턴스 상태

 

EC2 인스턴스를 중지, 재부팅, 종료도 할 수 있다. 우리가 쓰는 컴퓨터와 아주 유사하다. 재부팅은 말그대로 컴퓨터를 재시작시키는 걸 의미하고, 중지는 컴퓨터를 잠시 꺼놓는 걸 의미한다. 종료는 컴퓨터를 아예 삭제시킨다는 걸 의미한다. EC2 인스턴스를 한 번 종료하면 도중에 취소할 수 없으니 조심해야 한다.

 

  1. 보안 (보안 그룹)

인스턴스 보안 그룹: 인바운드, 아웃바운드 규칙

 

 

인스턴스 생성 시 설정한 보안 그룹에 대한 정보가 나온다.

  1. 네트워크

인스턴스 퍼블릭 IPv4 주소

 

퍼블릭 IPv4 주소는 생성한 EC2 인스턴스의 IP 주소를 뜻한다.

  1. 스토리지

인스턴스 루트 디바이스 유형 및 스토리지 크기

 

인스턴스 생성 시 설정한 스토리지에 대한 정보가 나온다.

  1. 상태 검사: 잘 안 보는 창이다.
  1. 모니터링
     
    EC2 인스턴스에 관련한 여러가지 정보를 볼 수 있는 창이다. AWS를 처음 입문할 때는 자주 볼 일이 없는 창이지만, 나중에 실제 서버를 운영할 때는 자주 보게되는 창이다. EC2 인스턴스가 정상적으로 작동하고 있는 지, EC2 인스턴스의 성능을 향상시켜주어야 하는 건 아닌 지 아래 지표를 통해 파악할 수 있다.

인스턴스 모니터

  1. 태그: 잘 안 보는 창이다.

인스턴스 태그

8.2 EC2에 접속하기

EC2 인스턴스에 연결


9. 탄력적 IP 연결하기

9.1 탄력적 IP가 왜 필요할까?

EC2 인스턴스를 생성하면 IP를 할당받는다. 하지만 이렇게 할당받은 IP는 임시적인 IP이다. EC2 인스턴스를 잠깐 중지시켰다가 다시 실행시켜보면 IP가 바뀌어있다. EC2 인스턴스를 중지시켰다가 다시 실행시킬 때마다 IP가 바뀌면 굉장히 불편하다. 그래서 중지시켰다가 다시 실행시켜도 바뀌지 않는 고정 IP를 할당받아야 한다. 그게 바로 탄력적 IP이다.

 

현업에서도 EC2 인스턴스를 생성하면 탄력적 IP를 대부분 필수적으로 설정한다.

9.2 탄력적 IP 설정 방법

탄력적 IP


10. Spring Boot 서버를 EC2에 배포하기

리눅스와 Spring Boot에 대한 수업이 아니므로, 리눅스 명령어나 Spring Boot 코드에 대한 자세한 설명은 생략한다.

 

10.1 Ubuntu 환경에서 JDK 설치하는 법

Spring Boot는 3.x.x 버전을 사용할 예정이고, JDK는 17버전을 사용할 예정이다. 그에 맞게 환경을 설치해보자.

sudo apt update && /
sudo apt install openjdk-17-jdk -y

 

10.2 잘 설치됐는 지 확인하기

java -version

 

10.3 Github으로부터 Spring Boot 프로젝트 clone하기

git clone 깃허브클론주소
cd 깃허브디렉토리경로명

 

10.4 application.yml 파일 직접 만들기

application.yml와 같은 민감한 정보가 포함된 파일은 Git으로 버전 관리를 하지 않는게 일반적이다. 따라서 application.yml 파일은 별도로 EC2 인스턴스에 올려주어야 한다. 하지만 application.yml 파일을 EC2 인스턴스에 올리는 작업보다는, application.yml 파일을 직접 만드는 게 훨씬 간단하다.

 

src/main/resources/application.yml

server:
  port: 80

 

10.5 서버 실행시키기

./gradlew clean build # 기존 빌드된 파일을 삭제하고 새롭게 JAR로 빌드
cd ~/ec2-spring-boot-sample/build/libs
sudo java -jar ec2-spring-boot-sample-0.0.1-SNAPSHOT.jar

 

추가 설명: 백그라운드에서 Spring Boot 실행시키기

sudo nohup java -jar ec2-spring-boot-sample-0.0.1-SNAPSHOT.jar &

 

10.6 잘 작동하는 지 확인하기

퍼블릭 IPv4 주소에 접속한 화면