과제
EC2를 활용해보기 위해 EC2 위에 상용 환경에서 다수 사용되는 Nginx라는 Web server를 배포하고, EC2에 접속하기 위해 Application Load Balancer를 연결할 수 있도록 합니다.
본 포스팅은 필자가 과제를 수행하며 개인적인 의문점이나 호기심을 해소하고 기록하고 싶은 내용을 기록하기 위한 포스팅입니다.
EC2
EC2란 Elastic Compute Cloud의 줄임말로 AWS 클라우드에서 온디맨드 확장 가능 컴퓨팅 용량을 제공합니다. 여기서 온디맨드(On-demand)는 단어뜻 그대로 요구사항대로 즉, 필요한 만큼 컴퓨터의 용량을 할당받는 것을 의미합니다.
AWS 공식문서 참조
EC2 인스턴스를 생성하면 EBS(Elastic Block Storage)라는 디스크 볼륨이 함께 생성되어 부착됩니다. 이는 AZ(Availability Zone)에 생성되며 자연재해나 불미스러운 사고에도 백업이 가능한 환경을 의미합니다.
보안 그룹 설정
위 이미지는 필자가 생성한 EC2 인스턴스의 보안그룹입니다. 먼저 첫번째 인바운드 규칙인 ssh 규칙에대해 알아보겠습니다.
SSH(Secure Shell)
ssh의 경우 주로 네트워크 서비스를 보안적으로 사용하기 위해 설계된 프로토콜의 종류 중 하나입니다. 즉, SSH는 네트워크 상 다른 컴퓨터의 쉘을 사용할 수 있게 해 주는 프로그램으로 강력한 보안을 자랑합니다.
제가 사용하는 맥북 pro의 경우 MacOS 운영체제에 SSH 클라이언트가 포함되어 있기 때문에 보안그룹에 유형에 ssh설정만 해도 주로 linux기반안 EC2인스턴스에 접속하는데 문제가 발생하지 않습니다. 추가로 여기에는 윈도우가 PuTTY라는 SSH클라이언트의 도움을 받아 SSH에 접속하는 이유가 포함되어 있습니다.
TCP(Transmission Control Protocol)
TCP는 인테넷에서 데이터를 전송하기 위해 사용되는 핵심 기능 중 하나로 TCP 프로토콜을 사용하는 수 많은 어플리케이션이 주로 IP위에서 동작하기 때문에 TCP/IP로 묶어서 명하기도 한다. TCP는 TCP/IP 프로토콜 슈트 중 핵심 프로토콜로 전송 계층(Transport Layer)에 위치하므로 그 역할도 흐름 제어, 혼잡 제어, 오류 제어 등의 역할을 한다.
위키백과 참조
인바운드 규칙을 생성할 때, 유형을 선택하면 주로 프로토콜과 포트 범위가 자동으로 설정되고 바꿀 수 없는데 이는 AWS에서 생성하는 EC2가 네트워크 통신을 할 때, 유형에 따라 정해놓은 규약이 있기 때문인가? 내가 알아본 바로는 SSH 프로토콜이 주로 TCP 프로토콜 위에서 작동하기 때문인데 그 이유로 다음과 같습니다.
- TCP의 신뢰성 : 데이터가 손실되거나 잘못된 순서로 도착하면, TCP는 해당 데이터의 재전송을 요청
- 연결 지향적 프로토콜 : '핸드셰이크' 과정을 거쳐, 양방향 통신이 가능한 안정적인 연결을 제공
- 포트 및 프로토콜 표준화 : SSH는 표준적으로 TCP 포트 22를 사용 이는 전 세계적 네트워크 표준에 부합
- 흐름 제어 및 혼잡 제어 : 네트워크의 상태에 따라 데이터 전송 속도를 조절
그러나 완벽한 네트워크와 프로토콜은 없다는 점을 명심하면 좋을거 같습니다.
포트(port)
인터넷 프로토콜 스위트에서 포트(port)는 운영 체제 통신의 종단점이다. 컴퓨터와 컴퓨터 또는 컴퓨터와 다른 장치들(프린터, 마우스 등)을 연결하는 하드웨어 인터페이스를 의미하기도 한다. 이 용어는 하드웨어 장치에도 사용되지만, 소프트웨어에서는 네트워크 서비스나 특정 프로세스를 식별하는 논리 단위이다. 주로 포트를 사용하는 프로토콜은 전송 계층 프로토콜이라 하며, 예를 들어 전송 제어 프로토콜(TCP)와 사용자 데이터그램 프로토콜(UDP)가 있다. 각 포트는 번호로 구별되며 이 번호를 포트 번호라고 한다. 포트 번호는 IP 주소와 함께 쓰여 해당하는 프로토콜에 의해 사용된다.
위키백과 참조
포트의 경우 위키백과에 너무 잘 설명이 돼있다 생각이 들어서 링크를 공유합니다.
https://ko.wikipedia.org/wiki/%ED%8F%AC%ED%8A%B8_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9)
개발을 하면서 MySQL의 경우 3306 포트를 웹 어플리케이션이나 웹 서버의 경우 3000 포트를 사용한 경험이 있을 것입니다.
IP(Internet Protocol)
인터넷 프로토콜은 송신 호스트와 수신 호스트가 패킷 교환 네트워크(패킷 스위칭 네트워크, Packet Switching Network)에서 정보를 주고받는 데 사용하는 정보 위주의 프로토콜이다. IP는 비신뢰성(unreliability)과 비연결성(connectionlessness)이 특징으로 즉, LAN과 WAN의 연결을 이어주는데 주요 역할을 한다.
위키백과 참조
이미지에서 사용하는 0.0.0.0/0의 경우 서브넷 마스크를 사용하여 IP 주소 범위를 사용하는데 IP 주소 범위를 지정하는 CIDR(Classless Inter-Domain Routing)표기법의 일부 입니다. 각 부분에 대해서 설명하자면
/를 기준으로 나뉠 수 있고 0.0.0.0은 모든 IP 주소를 의미합니다. /뒤에 오는 0의 경우 서브넷 마스크를 의미하고, 0으로 설정할 경우 역시 모든 IP 주소에 대한 접근을 허용하겠다는 의미를 가집니다. 이외에 8, 16, 24, 32의 경우 각각 비트를 나타내는 것으로 각 비트가 의미하는 범위 만큼 IP 주소를 허용하겠다는 뜻입니다. 추후 서브넷과 서브넷 마스크에 관하여 더 자세히 공부하는 기회가 있다면 이해하는데 더 도움이 될것 같습니다. 지금은 / 뒤 숫자가 커질수록 허용 IP 범위가 더 좁아지는 사실만 알아두고 넘어가겠습니다.
별도로 인바운드 규칙에서 소스의 경우 트래픽이 허용되는 IP 범위를 의미하고 각각 옵션이 의미하는 것은 다음과 같습니다.
- 사용자 지정 (Custom) : CIDR 표기법을 사용하여 IP 범위를 직접 지정합니다.
- Anywhere - IPv4 (0.0.0.0/0) : 인터넷 상의 모든 IPv4 주소에서의 접근을 허용하며 서비스를 공개적으로 사용할 수 있게 하고자 할 때 유용합니다. 그러나 보안 이슈가 존재할 수 있습니다.
- Anywhere - IPv6 (::/0) : 위 내용과 동일하지만 주소가 IPv6인 네트워크의 접근을 허용합니다.
- 내 IP (My IP) : 이 옵션은 현재 사용하고 있는 컴퓨터의 공개 IP 주소만 접근을 허용합니다.
HTTP(HyperText Transfer Protocol)
W3(World Wide Web) 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다. HTTP는 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜이다. 예를 들면, 클라이언트인 웹 브라우저가 HTTP를 통하여 서버로부터 웹페이지(HTML)나 그림 정보를 요청하면, 서버는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달하게 된다. 이 정보가 모니터와 같은 출력 장치를 통해 사용자에게 나타나는 것이다. HTTPS의 기본 TCP/IP 포트는 443이다. HTTP를 통해 전달되는 자료는 http:로 시작하는 URL(인터넷 주소)로 조회할 수 있다.
위키백과 참조
즉, 서비스를 웹을 통해서 배포하고 싶으면 인바운드 규칙에서 HTTP을 필수로 추가해야 합니다. 수행하고 있는 과제의 특성상 필수로 HTTP 유형의 인바운드 규칙을 추가해 주었습니다. 그러나, HTTP의 경우 암호화 되어 있지 않아 데이터가 중간에 가로채지기 쉽습니다. 이를 보완하기 위해 나타난 것이 HTTPS 입니다.
HTTPS(HyperText Transfer Protocol over Secure Socket Layer)
월드 와이드 웹 통신 프로토콜인 HTTP의 보안이 강화된 버전이다. HTTPS는 통신의 인증과 암호화를 위해 넷스케이프 커뮤니케이션즈 코퍼레이션이 개발한 넷스케이프 웹 프로토콜이며, 전자 상거래에서 널리 쓰인다. HTTPS는 소켓 통신에서 일반 텍스트를 이용하는 대신에, SSL이나 TLS 프로토콜을 통해 세션 데이터를 암호화한다. 따라서 데이터의 적절한 보호를 보장한다. HTTPS의 기본 TCP/IP 포트는 443이다. 보호의 수준은 웹 브라우저에서의 구현 정확도와 서버 소프트웨어, 지원하는 암호화 알고리즘에 달려있다. HTTPS를 사용하는 웹페이지의 URI는 'http://'대신 'https://'로 시작한다.
위키백과 참조
그러나 웹서버에 HTTPS 통신을 하기 위해서는 인증서를 배포하고, ALB에 HTTPS 리스너를 설정해 주어야 합니다. 다음에 배포를 할 때에는 HTTPS 통신을 사용하면 좋을것 같습니다.
ALB
Elastic Load Balancing은 둘 이상의 가용 영역에서 EC2 인스턴스, 컨테이너, IP 주소 등 여러 대상에 걸쳐 수신되는 트래픽을 자동으로 분산합니다. 등록된 대상의 상태를 모니터링하면서 상태가 양호한 대상으로만 트래픽을 라우팅합니다. Elastic Load Balancing은 수신 트래픽이 시간이 지남에 따라 변경됨에 따라 로드 밸런서를 확장합니다. 대다수의 워크로드에 맞게 자동으로 조정할 수 있습니다.
AWS공식문서 참조
즉, ALB의 역할은 동일한 서버를 배포하는 여러 EC2 인스턴스가 있을 때, 하나의 인스턴스에 트래픽이 몰리는 것을 방지하는 역할을 해줍니다. 타겟 그룹만 설정해주면 DNS를 통해서 도메인주소를 설정해주고 해당 도메인으로 접속하는 모든 트래픽이 ALB를 거쳐 상황에 맞게 트래픽을 조정해 줍니다.
물론 본 과제에서는 2개 이상의 인스턴스를 생성하지 않았지만, 여러 인스턴스를 다루는 큰 프로젝트에서 ALB의 역할이 즉, Loadbalance의 역할이 중요함을 알 수 있습니다.
Nginx
Nginx는 웹 서버의 종류 중 하나로 웹 서버는 Nginx 이외에도 Apache, Microsoft IIS, Lighhttpd 등이 존재합니다.
웹 서버(Web server)란, HTTP 또는 HTTPS를 통해 웹 브라우저에서 요청하는 HTML 문서나 오브젝트(이미지 파일 등)을 전송해주는 서비스 프로그램을 말합니다.
위키백과 참조
본 과제에서는 간단하게 Nginx를 EC2에 설치해 웹서버를 띄우는 것이 과제의 끝이기 때문에 앞에서 설정한 것들 + EC2의 운영체제에 맞게 Nginx를 설치하고 실행시켜주기만 하면 쉽게 과제를 끝낼 수 있었습니다.
'개발 > 9oormthon 부트캠프 👨🏼🏫' 카테고리의 다른 글
[9oormthon] Jenkins를 활용한 CI/CD (0) | 2024.04.24 |
---|