🖥 EC2

AWS을 활용해 웹 서비스를 운영할 때 가장 널리 사용하는 서비스가 EC2 이다.
EC2는 원격으로 접속해 사용할 수 있는 컴퓨터를 빌려주는 서비스 이다. ( 실무에서 많이 쓰임 )
EC2 인스턴스
EC2에서 빌리는 컴퓨터 한대를 뜻함. ( EC2 인스턴스 = 컴퓨터 한 대 )
1️⃣ OS 이미지
- 인스터스를 시작할 때 필요한 OS로 구성된 템플릿을 의미
- EC2에서 미리 구성된 OS 템플릿을 선택해 컴퓨터를 빠르게 시작할 수 있음.
2️⃣ 인스턴스 유형
- 컴퓨터 사양을 의미, 사양이 좋으면 많은 사용자 요청 처리 할수 있고, 무거운 프로그램을 실행시 성능 저하가 잘 안됨.
3️⃣ 스토리지
- 인스턴스도 하나의 컴퓨터이므로 파일을 저장할 공간이 필요, 이런 저장공간을 스토리지 or 볼륨 이라고 함.
- 우리가 쓰는 컴퓨터에도 HDD, SSD와 같은 여러 종류 저장 공간이 있는 것처럼 EC2의 스토리지에도 목적에 따라 선택할 수 있는 여러 유형이 있음.
🤩 사용 이유
1️⃣ 관리 부담 절감
웹 서비스를 배포한 컴퓨터는 24시간 동안 켜두어야 사용자들이 언제든지 웹 서비스를 이용 가능.
혹여나 정전으로 컴퓨터가 종료되면 서비스에 접속할 수 없기 때문
EC2를 활용하면 컴퓨터의 전원까지 AWS가 관리하므로 부담이 줄어듬.
2️⃣ 손쉬운 보안 설정
개인 PC에 웹 서비스를 배포하면 보안이 위험할 수 있음. 입문자 입장에서 처음부터 올바른 보안 설정은 쉽지 않음.
EC2에서 ' 보안 그룹 ' 기능을 사용해 비교적 쉽게 보안 설정을 적용할 수 있다.
📦 배포
개발자들 사이에서 " 기능 구현과 테스트가 끝났으니 EC2에 배포하자! " 라는 말을 자주 한다. 여기서 배포에 의미는 우리가 만든 서비스를 서버나 클라우드 환경에 업로드하는 것을 의미.
서비스를 배포하면 사용자가 인터넷을 통해 해당 서비스를 이용할 수 있고, 구글, 네이버, 유튜브 같은 웹 사이트 또한 인터넷에 배포가 되어 있기 때문에 접속이 가능함.

일반적으로 개발할 때 로컬호스트(localhost) 즉, 자신의 컴퓨터 주소를 사용하며, 로컬 호스트는 다른 컴퓨터에서 접근할수 없는 주소이며 외부에서도 접속할 수 있는 클라우드 환경에 웹 서비스를 배포해야함.
EC2에 웹 서비스를 배포하면 다른 컴퓨터에서도 접근할 수있는 퍼블릭 IP주소를 받음. 사용자는 인터넷에서 IP주소를 사용해 우리가 개발한 웹 서비스에 접속 가능.
🔍 IP주소
IP 주소란 인터넷에서 특정 컴퓨터를 가리키는 주소로, 모든 컴퓨터에 IP주소가 부여되어 있다. ex) 13.250.15.132
이때 cmd에서 ping 명령어를 사용해 특정 도메인 주소와 네트워크의 연결상태를 확인할 수 있다.
cmd에 ping naver.com 입력하면, naver.com이라는 도메인의 IP 주소가 223.130.192.248라고 출력되며 이 IP주소가 네이버의 컴퓨터 주소라고 알수 있다.

💫 포트
포트는 한 컴퓨터 내에서 실행되는 특정 프로그램의 주소라고 할수 있다.
밑에 이미지를 참고하면, 앞이 IP주소, 뒤 : 3000 은 포트이다. 즉, IP주소가 13.250.15.132인 컴퓨터 내부의 여러 프로그램 가운데 3000번 포트에 할당되 있는 프로그램을 가리킨다.

그런데 컴퓨터에서 프로그램을 하나만 실행하지 않을 것이다. 대부분 동시에 열어놓고 사용.
실제 백엔드 서버를 운영하는 컴퓨터도 마찬가지, 외부에서 특정 컴퓨터에 있는 백엔드 서버와 통신할 때 IP 주소로 특정 컴퓨터 까지는 접근했다고 해도 포트를 모르면 컴퓨터의 어떤 프로그램과 통신해야 할지 알수가 없다.
따라서, 특정 프로그램과 통신하라면 IP 주소와 포트 번호까지 알아야 한다.
컴퓨터에서 포트 번호는 0~65535번 까지 사용 가능하며, 그중 0~1023 특정 용도로 사용하길 권장 ( = 역할이 정해져 있는 포트 )
그 중에서도 3가지 포트만 잘 기억 하면 된다.
1️⃣ 22번 포트 ( SSH )
Secure Shell의 약자로 네트워크를 통해 원격 서버에 안전하게 접속할 수 있도록 하는 통신 방식.
EC2에서 컴퓨터를 빌린 후 그 컴퓨터에 원격으로 접속할 때도 22번 포트를 사용
2️⃣ 80번 포트 ( HTTP )
웹 브라우저에서 웹 사이트를 접속할 때 HTTP방식을 활용해 통신.
규약에 따라 웹 브라우저는 포트 번호가 입력되지 않으면 기본적으로 80번 포트로 통신하도록 설정되어 있음 ( 기본값 )
3️⃣ 443 포트 ( HTTPS )
HTTP와 HTTPS는 모두 웹 브라우저와 웹 사이트에 접속할 때 사용하지만 서로 다른 포트를 활용해 통신한다는 것도 알아둘 것.
HTTP보다 안전한 웹 통신 방식.
* 차이점 *
http://naver.com 으로 접속하면 80번 포트로 요청
https://naver.com 으로 접속하면 443번 포트로 요청
⚙ 보안 그룹
AWS 환경에서 보안은 매우 중요한 요소.
AWS의 컴퓨터 자원은 인터넷으로 접근하는 경우가 많아서 외부 공격에 노출될 위험이 큼.
따라서 EC2를 비롯한 다양한 자원은 외부와 안전하게 통신할 수 있도록 관리하는 것이 핵심
AWS 공식 문서를 보면, 보안 그룹은 EC2, RDS 등 AWS의 다양한 자원이 수신, 발신하는 트래픽을 제어하는 가상 방화벽 역할.

이미지를 참고하면, EC2 인스턴스가 집이라면, 보안 그룹은 집으로 들어가기 전 지나는 대문이라 생각하면 쉽다.
집( EC2 인스턴스 ) 에 아무나 들어오면 안되니 대문( 보안 그룹 )을 설치해 신원이 보장된 사람만 들여 보내는 것.
이처럼 AWS 자원에 아무나 접근하지 못하게 막아 놓은 장치가 바로 ' 보안 그룹 ' 이다.
인바운드 vs 아웃바운드
실제로 서비스를 운영하다 보면 많은 사용자가 EC2에 잇는 서버로 요청을 보내거나 반대로 EC2에 있는 서버가 외부 인터넷으로 요청을 보냄. 이때 발생하는 트래픽이 자유롭게 드나들면서 보안 문제 이슈가 발생, 이를 위해서 보안 그룹을 사용.
( 프로토콜 = 통신 방식 ) 이라고 생각하면 됨
인바운드는 ec2로 접근하는 트래픽에 대한 규칙을 설정하는 것
아웃바운드는 반대로 ec2에서 나가는 트래픽에 대한 규칙을 설정하는 것
소스가 0.0.0.0/0 이면 모든 IP 주소에 대해서 허용 한다는 의미. 즉, 어떤 IP에서 들어오는 트래픽도 허용.

위 이미지를 참고해서 해석하자면,
- 첫번째 인바운드 규칙은 EC2 인스턴스의 SSH 유형, 22번 포트로 접속하는 모든 IP 트래픽을 허용한다는 의미. 즉, EC2 인스턴스에 원격으로 접속하기 위해 SSH 통신을 허용 하는 규칙
- 두번째 인바운드 규칙은 EC2 인스턴스의 HTTP 유형, 80 포트로 접속하는 모든 IP 트래픽을 허용한다는 의미. 이는 백엔드 서버에 접속을 허용하는 규칙.
- 아웃바운드 규칙은 EC2에서 나가는 모든 트래픽을 허용한다는 의미. 일반 적으로 아웃바운드 트래픽은 허용하는 상태로 기본적으로 설정되며, 보안상 큰 위협을 초래하지 않아 실무에서도 기본 설정 그대로 두는 경우가 많다.
이로소 보안 그룹 규칙에 추가되지 않은 포트는 접근할 수가 없음. 접근을 허용하고 싶은 포트가 생기면 추가 수정 필요.
🤔 탄력적 IP
EC2 인스턴스를 중지하고 다시 시작할 때 마다 퍼블릭IP 주소가 변경됨. 이렇게 계속 주소가 변경 되면 기존 사용자가 서비스에 접속하지 못하므로, AWS에서 탄력적 IP를 제공해 IP가 변경되지 않도록 함.
탄력적 IP는 바뀌지 않는 고정된 IP 주소를 의미 한다.
