💬 배포(Deployment)란 무엇일까?
개발자를 꿈꾸면서 혹은 개발자로 취업을 하고 프로젝트를 진행하면서 배포라는 말이 자주 나오는것을 알 수 있다
그리고 초보 개발자는 그 배포가 너무 어렵다고 느끼고 항상 머리를 꽁꽁 싸매게 된다
도데체 배포가 뭘까?
정말 간단하게 배포란 다른 사용자들이 우리가 만든 서비스를 인터넷에서 사용하게 만드는 것이다
우리의 컴퓨터로 개발을 하면 localhost라는 주소로 테스트, 개발을 하는데 이 주소는 외부의 사용자는 접속 할 수 없는 주소이다. 그래서 우리는 배포를 통해 IP를 받고 도메인을 등록하여 다른 컴퓨터에서도 나의 서비스를 접속할수 있도록 하는 것 이것이 바로 배포인것이다
💬 AWS의 EC2
그렇다면 배포는 어떻게 하는것이 좋을까? 일단 우리가 사용하는 서비스들을 생각해보자 서비스가 잠깐 사용되고 꺼지고 잠깐 사용되고 꺼지고 이러한 것은 본적이 없다. 무조건 24시간 켜져있는 모습이 자주 보인다. 그럼 우리의 서비스도 당연히 그렇게 작성이 되어야 한다. 하지만 당연하게도 우리의 컴퓨터는 그렇게 하지 못한다.
왜일까?
- 24시간 컴퓨터를 켜놓아야한다 이것이 가능하다면 괜찮다.
- 서비스를 가동하기위해 왠만하면 해당 컴퓨터로 다른 작업을 한다는게 조금 부담스럽다
- 내 컴퓨터를 사용하다보니 보안적으로 뭔가 불안한 경우가 발생할 수 있다.
이때문에 우리는 내 컴퓨터가 아닌 안정적으로 서버를 24시간으로 가동할 수 있고 해당 작업이 아니면 다른 작업을 굳이 할 필요가 없는 작은 컴퓨터를 하나 빌려서 사용하기위해 EC2를 사용하게 되는 것이다
즉, EC2를 한줄로 요약한다면 컴퓨터를 빌려서 원격으로 접속해서 사용하는 서비스 라는 것이다.
프론트 엔드는 왜 EC2를 안써??
물론 사용은 할 수 있다. 하지만 굳이 그렇게 하지 않는다. 왜냐하면 프론트 엔드의 구성은 주로 정적 콘텐츠이기 때문이다. S3와 같은 서비스는 정적 콘텐츠를 효율적으로 제공할 수 있고 심지어 EC2보다 훨씬 저렴하다.
❓ 리전이 뭐지?
이렇게 EC2 에 실제로 들어가보면 서비스 상태 혹은 아이디 옆에 지역이 표시가 되어 있다. 그리고 이것을 선택도 할 수 있는것을 볼 수 있다
이때 리전이라는 말이 나오는데 리전이 뭘까?
인프라를 지리적으로 나누어 배포한 각각의 데이터 센터
우리가 컴퓨터를 빌릴껀데 AWS는 이 컴퓨터들을 관리하는 센터가 따로 존재한다. 근데 이 관리하는 센터가 여러 군데로 나뉘어져 있고 그 지역을 리전이라고 한다는 것이다
🎞 EC2 세팅
EC2 인스턴스 시작을 누르면 엄청나게 많은 요구조건(?)들이 나온다. 이것들을 하나씩 천천히 알아보자
인스턴스란?
AWS 에서 사용하는 인스턴스는 "컴퓨터 1대" 라는 의미이다
그럼 인스턴스 유형이란 무엇일까? 컴퓨터 사양을 의미하는 것이다.
1. 이름 및 태그
우리가 앞으로 굉장히 많은 서비스를 만들게 되고 등록할텐데 그때 이름을 잘 작성해주어야 나중에 쉽게 인스턴스에 대한 내용을 파악하기 좋다
2. Application and OS Images 와 인스턴스 유형
해당 컴퓨터의 OS를 결정하는 단계이다. 우리가 자주 사용하는 mac, windows도 좋지만 해당 OS는 너무 많은 용향을 차지하고 때문에 성능에 대한 이슈도 발생할 가능서이 있다. 때문에 우리는 훨씬 가벼운 ubuntu 서버를 생성해보고자 한다.
또한 우리가 빌려서 사용할 컴퓨터의 성능을 뜻하는 인스턴스 유형도 프리티어로 사용할 수 있는 t2.micro를 사용해보자
3. 키 페어 ( 키페어 생성 )
인스턴스 유형 바로 밑에 키 페어에 대해 적혀있다. 키페어란 EC2 컴퓨터에 접근할 때 사용되는 비밀번호라고 생각하면 된다.
우리가 컴퓨터 들어갈때 비밀번호 설정하면 입력하고 들어가는 것처럼 키페어라는 것을 만들어서 빌린 컴퓨터 비밀번호를 만들고 들어갈때 비밀번호를 작성하도록 만들어주는 것이라고 생각하면 된다
위의 사진은 키페어가 없다면 키페어를 생성한다. RSA는 대표적인 비대칭 암호화 방식을 사용하는 암호방식이다. 그리고 .pem을 선택해주면된다.
이후에는 해당 키페어가 다운로드되는데 그것은 아주 잘 보관해놔야하고 잊어버리지 않는곳에 저장해두면 된다.
3. 네트워크 설정
네트워크 설정에서 오른쪽 상단에 편집을 누르면 우리가 네트워크 관련 설정을 직접 해줄수 있도록 변경되는 것을 볼 수 있다.
네트워크 설정에는 다양한 그룹이 있다.
- VPC
- 서브넷
- 퍼블릭 IP
- 보안그룹 관련
여기서 위의 3개는 지금 당장 알지 못해도 EC2를 사용하는데 문제가 없지만 보안그룹에 관련해서는 우리가 알아야 EC2를 다룰수 있다.
그래서 잠깐 알아보려고 한다
앞서서 나의 집에 있는 컴퓨터에 서비스를 배포하지 않는 이유 중 하나가 보안적 위험 때문이라고 한적이 있다. 이것과 관련이 있는 말이다
보안 그룹이란
AWS 클라우드에서의 네트워크 보안을 의미한다.
EC2인스턴스를 집이라고 생각한다면 보안 그룹은 집 바깥쪽에 쳐져있는 울타리와 대문이라고 생각하면 되는 것이다. 집에 접근할 때 울타리의 대문에서 접근해도 되는 요청인지 물어본다는 것이다 즉, 우리의 집(서버)에 보디가드(보안 그룹)가 생기는 것이라고 생각하면 된다.
예를 들어
일부 사용자가 EC2 인스턴스에 접근하려고 한다. 그러면 우리는 보안 그룹을 통해 방화벽 역할을 하여 규칙을 만들어서 인바운드 트래픽 ( 외부(사용자) → 내부(서비스) ), 아웃바운드 트래픽 ( 내부(서비스) → 외부(사용자) ) 중 어떤 트래픽만 허용할 지 설정할 수 있다는 것이다.
그럼 위에서 말하는 보안 설정을 어떻게 하면 되는 걸까?
보안 설정은 기본적으로 IP 범위와 Port를 통해 설정을 한다
4. 인바운드 보안 그룹 규칙 설정
그렇다면 외부(사용자) → EC2(서비스)로 접근하는 포트번호는 뭘까? 크게 2가지 이다.
- 22번 포트
- 우리가 EC2에 원격 접속을 할때 사용해야하는 포트이기 때문에 필수 포트이다
- 80번 포트
- 해당 포트에 우리가 만든 서버를 띄울 것이기 때문에 포트를 열어주어야 한다
- 소스 유형의 위치 무관
- 두 개의 설정이 모두 위치가 무관하다고 설정했다. 그 이유는 어떤 IP에서든 우리의 서비스를 그리고 내가 EC2를 사용하기 위해 접속할 수 있게 만들어야 하기 때문이다.
만약 내가 EC2 서버를 수정하는 것을 집에서만 하게 된다면 소스 유형의 IP주소를 우리 집 IP주소로 해도 된다.
- 두 개의 설정이 모두 위치가 무관하다고 설정했다. 그 이유는 어떤 IP에서든 우리의 서비스를 그리고 내가 EC2를 사용하기 위해 접속할 수 있게 만들어야 하기 때문이다.
IP와 PORT
IP는 네트워크 상에서의 특정 컴퓨터를 가리키는 주소 같은 것이다
PORT는 한 컴퓨터 내에서 실행되고 있는 특정 프로그램의 주소이다.
특정 컴퓨터로 가기 위해 IP주소를 사용하면 해당 컴퓨터에 여러가지 프로그램들이 실행되고 있을 것이다. 그럼 외부의 특정 컴퓨터 내부에 있는 Spring Boot라는 서버에 통신을 하고 싶다면 해당 서버가 가지고 있는 port번호를 알고 있어야 한다. 그래서 특정 서버와 통신을 하기 위해서는 IP 주소와 서버가 실행되고 있는 포트 번호를 알아야 한다.
위에서 잠깐 봤지만 정말 많이 사용되는 포트 3개를 알아보자
1. 22번 (SSH) : 원격 접속을 위한 포트 번호
2. 80번 (HTTP) : HTTP로 통신을 할 때 사용하는 포트 번호
3. 443번 (HTTPS) : HTTPS로 통신을 할 때 사용하는 포트 번호
5. 스토리지 구성
우리가 사용하고 있는 노트북이나 데스크톱 컴퓨터는 전부 HDD(하드디스크)를 가지고 있다 그곳에 데이터를 저장하게 되는데 EC2도 하나의 컴퓨터로써 여러 파일들을 저장할 공간이 필요하다
이 저장 공간을 EBS(Elastic Block Storage)라고 부른다. 즉, EBS는 EC2 안에 부착되어 있는 일종의 하드디스크라고 생각하면 되는 것이다. EBS와 같은 저장 공간을 조금 더 포괄적인 용어로 스토리지, 볼륨이라고 부른다.
스토리지 구성에 보면 프리티어 고객은 최대 30Gib까지 지원한다는 것을 알 수 있다. 그래서 30gib로 설정하면 된다.
🎞 EC2 접속해보기
접속하기 전에 나의 인스턴스 상태 확인해보기
생성이 완료된 인스턴스는 이런 화면을 보이게 된다 초록색으로 밑줄, 상자 표시 해놓은 것을 하나씩 살펴보자
- 인스턴스 상태 : 현재 인스턴스(컴퓨터)가 실행 중인지 아닌지를 확인한다
- 오른쪽 상단의 인스턴스 상태 탭
- EC2를 중지, 종료할 수 있다. 중지는 잠시 운영을 멈춘다는 뜻이고 종료는 인스턴스를 삭제한다라는 뜻이다
- 보안
- 우리가 인바운드, 아웃바운드를 구성한 규칙이 있는 곳이다. 인스턴스를 생성하고 설정한 보안 그룹에 대한 정보가 나와야한다. 우리는 앞서 아웃바운드는 별도로 설정하지 않았기때문에 전체로 하나가 존재할 것이고 인바운드는 22포트번호와 80포트번호를 규칙으로 하고 있는 것을 확인 할 수 있다
- 네트워크
- 메인 화면에서도 볼 수 있듯이 퍼블릭IPv4 주소가 나온다. 실제로 EC2의 주소이다.
- 스토리지
- 우리가 마지막으로 30gib로 설정한 하드디스크이다.
- 상태 검사는 따로 깊게 보지는 않는다
- 모니터링
- 굉장히 중요한 창이다. 현재 EC2의 여러가지 정보를 볼 수 있다. 때문에 실제로 서버를 운영하면 자주 보게 된다. EC2인스턴스가 정상적으로 작동하고 있는지, EC2 인스턴스의 성능을 향상 시켜주어야 하는 것은 아닌지 등을 파악할 수 있다.
진짜 연결 해보기
인스턴스를 연결하는 방법은 4가지 정도가 있다. 이중 EC2 인스턴스 연결을 사용해보고자 한다.
크게 따로 뭔가를 설정하지 않고 연결을 누르면
잠시 대기를 하면 이런식으로 우리가 만든 Ubuntu OS를 가진 EC2가 실행이된다. 환경은 리눅스 기반이라는 것을 알 수 있다.
탄력적 IP, 생성
사진을 보면 분명 같은 인스턴스인데 위와는 다른 IP로 변경된 것을 확인할 수 있다. 똑같은 이름의 인스턴스는 만들수 없다. 갑자기 왜 이러는 것일까?
바로 인스턴스를 잠깐 중지했다가 다시 키면서 발생하는 것이다. 이게 왜? 라고 생각할 수 있지만 이는 서비스에 치명적인 오류로 남을 수 있다. IP는 컴퓨터의 주소 같은 것이다. 근데 주소가 계속해서 바뀌면 서버에 요청하는 IP가 계속해서 변경하는 것과 마찬가지로 운영이 된다는 것이다. 그래서 우리는 서비스의 IP가 계속해서 바뀌지 않도록 고정된 IP를 할당 받아야 한다
그것이 바로 탄력적 IP이다.
제작하는 방법은 굉장히 간단하다. EC2 왼쪽의 탭에서 탄력적 IP로 들어가서 생성하고 다른 설정은 건들이지 않고 그냥 생성만 하면 되는 것이다. 여기서 연결하는 것을 좀 알아보자
만들어진 탄력적 IP주소에 작업탭을 누르고 연결을 누르면 연결하고자 하는 인스턴스를 적는 곳이 나오고 그곳에 아까만든 EC2를 연결하면 끝이다. 그러면 밑의 사진처럼 아까는 없던 연결된 인스턴스ID에 입력이 된것을 볼수 있다.
그렇다면 실제로 연결이 됐는지 안됐는지 확인하기 위해 실제로 중지를 하고 다시 연결을 해보자
이제 탄력적 주소가 할당이 되고 이후부터 재실행을 하더라도 똑같은 IP주소를 받아올수 있다는 것을 알 수 있다.
🎞 EC2에 스프링 부트 설치
1. JDK 설치하기
sudo apt update && /
sudo apt install openjdk-17-jdk -y
# 그리고 확인
java -version
2. 나의 서비스 clone하기
git clone 나의 서비스가 있는 git 주소
cd 폴더 안으로 들어가기 위한 폴더명
3. application.yml 파일 확인하기
Git에는 보통 설정 정보창인 yml파일을 올리는 것을 추천하지 않는다. 때문에 만들어서 따로 관리를 해주어야 한다
src/main/resources/application.yml
// 대부분 8080으로 설정하거나 하겠지만 우리가 보안 규칙을 80으로 잡아주었기 때문에 80으로 맞추는 것이 좋다
server:
port: 80
🧨 팁! 리눅스를 이용한 application.yml 파일 만들기
# resources 까지 들어갔다는 전제
vim application.yml
# 을 통해 만들고 안에 입력을 하고 Esc를 누르고 :wq를 누른뒤 Enter를 하면 끝!
4. 서버 실행시키기
./gradlew clean build # 기존에 빌드된 파일을 삭제하고 새롭게 빌드
cd ~/폴더명/build/libs
sudo java -jar 저장된 파일명
5. 결과
이렇게 정상적으로 웹 페이지로 들어가는 것을 확인 할 수 있다. (404에러는 화면이 없다는 이야기다)
🎞 EC2 완료 후 모두 종료 ( 이후 비용 발생 방지 )
1. EC2 종료
앞서 봤던 태그에서 종료를 클릭한다
2. 탄력적 IP 삭제
탄력적IP탭으로 넘어가서 삭제하려는 IP를 클릭하여 들어가서 작업탭을 누르면 릴리즈라고 있다. 그것을 누르면 삭제가 되는 것을 알 수 있다.
이렇게 두가지를 삭제하면 더 이상 비용이 나가지 않는 것을 알 수 있다.
'AWS' 카테고리의 다른 글
🗃 S3 사용해보기(1부) (1) | 2024.06.08 |
---|---|
AWS를 위해 S3를 Spring에 연동하기 (1) | 2024.06.08 |
🗃 VPC를 활용해서 RDS를 연결해보자 (0) | 2024.06.07 |
🗃 ELB를 통해 HTTPS 설정하기 (0) | 2024.06.06 |
🗃 도메인 구성 DNS, 그리고 Route 53 (0) | 2024.06.06 |