가상화와 AWS
가상화
가상화는 서버, 스토리지, 네트워크 및 기타 물리적 시스템에 대한 가상 표현을 생성하는 데 사용할 수 있는 기술입니다. 가상 소프트웨어는 물리적 하드웨어 기능을 모방하여 하나의 물리적 머신에서 여러 가상 시스템을 동시에 실행합니다. 기업은 가상화를 사용해 하드웨어 리소스를 효율적으로 사용하여 투자 대비 이익을 더 많이 얻을 수 있습니다. 또한 클라우드 컴퓨팅 서비스를 지원하여 조직의 인프라를 더욱 효율적으로 관리할 수 있습니다.아마존 피셜 가상화
아마존에서는 가상화를 위처럼 기술한다. 리소스를 효율적으로 사용할 수 있고 인프라를 더 효율적으로 관리할 수 있다는 장점에 주목하자. 컴퓨터 공학에서는 “혼자 쓰는 것처럼 보이는”, “진짜처럼 보이는” 이라는 의미로 쓰인다.
가상화, 왜 할까?
앞에서 얘기했듯 리소스를 효율적으로 사용하기 위함이다. CPU의 발전에 따라 성능이 올라 사용률(utilization)을 올리기 위해서 가상화를 도입하여 마치 1개의 CPU를 여러개의 CPU처럼 쓸 수 있도록 한 것이다.
CPU 가상화
CPU를 여러 사용자가 공유하면서 쓰지만 마치 혼자 쓰는 것처럼 느끼도록 하는 것
Host OS
Hypervisor라고도 하며, 물리 자원을 관리하면서 Guest OS에게 하드웨어를 흉내낸 software interface인 VM(Virtual Machine)을 제공한다. VM간의 자원 침범을 막는 isolation도 제공한다.
Guest OS
Host OS가 제공하는 VM을 하드웨어로 인식하여 사용하는 OS이다. 가상화를 거치는 오버헤드로 인해 성능이 저하 되지만 최근에는 intel의 VT-x, VT-d AMD의 SVM, IOMMU 기술로 이를 줄여준다.
네트워크 가상화
이때도 가상화는 같은 의미로 쓰인다. NIC는 하나지만 VM을 제공받는 Guest OS에게는 VM의 vNIC을 ‘혼자쓰는 것 같이’ 보이는 진짜 NIC이라 느낀다.
hypervisor는 가상의 L2스위치를 제공하고 각 VM은 자체 MAC 주소를 갖게 되어 이로 인해 VM들은 마치 서로 다른 물리적 장비처럼 동작할 수 있다.
Cloud Computing
옛날부터 복잡한 네트워크를 묘사할 때 “내부는 잘 모르지만 연결되어 있다”는 의미로구름 모양을 써왔다. 따라서 Cloud Computing은 역시 어디에 있는지는 잘 모르는 컴퓨팅 자원을 연결하여 사용하는 것 정도로 볼 수 있겠다.
이런 클라우드를 통해 제공하는 서비스를 추상화의 정도에 따라 나눌 수 있는데
하드웨어 컴퓨팅 자원 -> Infrastructure-as-a-Service (IaaS) ex) AWS
프로그램의 실행 환경 -> Platform-as-a-Service (PaaS) ex) firebase
완전한 App -> Software-as-a-Service (Saas) ex) Microsoft 365
크게 위처럼 3가지로 나누고 이외에도 클라우드 기반으로 제공되는 서비스를 X-as-a-Service(XaaS)라고 명명한다.
AWS
AWS(Amazon Web Services)는 아마존닷컴이 제공하는 클라우드 컴퓨팅 플랫폼으로 위 분류에서 하드웨어 컴퓨팅 자원까지 관리가능한 서비스인 IaaS에 해당한다. 대표적인 서비스로는 _EC2_와 _VPC_가 있으며 이외에도 수많은 서비스를 제공하고 있다.
EC2
Amazon Elastic Compute Cloud(Amazon EC2)는 Amazon Web Services(AWS) 클라우드에서 온디맨드 확장 가능 컴퓨팅 용량을 제공합니다. Amazon EC2를 사용하면 하드웨어 비용이 절감되므로 애플리케이션을 더욱 빠르게 개발하고 배포할 수 있습니다. Amazon EC2를 사용하여 원하는 수의 가상 서버를 구축하고 보안 및 네트워킹을 구성하며 스토리지를 관리할 수 있습니다. 용량을 추가(스케일 업)하여 월간 또는 연간 프로세스 또는 웹 사이트 트래픽 급증 등 컴퓨팅 사용량이 많은 작업을 처리할 수 있습니다. 사용량이 감소하면 용량을 다시 축소(스케일 다운)할 수 있습니다.아마존 피셜 EC2
EC2를 사용함으로써 하드웨어 자원에 대한 관리 비용을 줄이고 유연하게 자원을 사용할 수 있는 가상화의 장점을 얻을 수 있다. 구조를 보면 Region, VPC, Subnet 내에 위치하는데 이는 아래에서 설명할 것이다. 그리고 위 EC2의 서버의 터미널에 접속하기 위해서 SSH 프로토콜을 사용한다.
인스턴스 타입
가상 컴퓨팅 자원이기 때문에 유연하게 컴퓨팅 자원을 조절할 수 있다. 인스턴스 유형 이름은 패밀리, 세대, 프로세서 패밀리, 추가 기능 및 크기를 기준으로 지정됩니다.
- 첫 번째 자리는 인스턴스 패밀리를 나타낸다. (예: c - 컴퓨팅 최적화, T – 버스트 가능한 성능, M – 범용 등).
- 두 번째 자리는 인스턴스 세대를 나타냅니다 (예: 7).
- 세 번째 위치는 프로세서 패밀리를 나타낸다 (예: a - AMD 프로세서, g – AWS Graviton 프로세서, i - 인텔 프로세서).
- 마침표 앞의 나머지 문자는 인스턴스 스토어 볼륨과 같은 추가 기능을 나타냅니다. (예: d – 인스턴스 스토어 볼륨, n - 네트워크 및 EBS 최적화, e - 추가 스토리지 또는 메모리 등)
- 마침표(.) 뒤는 인스턴스 크기(예: small, 4xlarge 등)입니다.
간단하게 프리티어로 사용할 수 있는 인스턴스 타입으로는 t2.micro, t3.micro를 많이 사용한다.
키 페어
앞에서 SSH를 사용한다고 했는데 이 때 key페어로 이용될 key를 설정해주면 된다. 위처럼 키페어 메뉴에서 키페어가 있다면 가져오기를 하고 .pub으로 끝나는 public key를 가져오면 키 페어가 등록된다.
만들어둔 키페어는 EC2를 생성할 때 지정하면 해당 EC2서버의 authorized_keys 파일에 public key가 등록되어 이 public key와 짝인 private key가 있다면 접속할 수 있다.
보안그룹 설정
보안그룹은 마치 방화벽 같은 것이라고 생각하면 된다. 들어오는 데이터를 관리하는 인바운드 규칙, 나가는 데이터를 관리하는 아웃바운드 규칙이 있다. IP주소와 포트번호를 지정하여 들어오거나 나가는 규칙을 정할 수 있다. 여기서 0.0.0.0/0의 의미는 모든 IP주소를 의미하는 것으로 _인바운드 규칙_에서는 어떤 Sorce IP주소를 가졌는지와 상관없이 특정 포트로 들어오거는 것을 허용하는 것이고
_아웃바운드 규칙_에서는 어떤 destination IP주소를 가졌는지는 상관없이 특정 포트로 나가는 것을 허용한다는 뜻이다. 보통 엄격하게 하지 않는 이상 아웃바운드 규칙은 모두 열어둔다.
이렇게 설정한 규칙들운 VM내부에는 영향을 주지 않고 묵시적으로 주어진 방화벽에서 변경된다.
탄력적 IP설정
생성한 EC2인스턴스에 따로 탄력적 IP를 연결해주지 않으면 인스턴스를 재시작할 때마다 (public) IP주소가 바뀐다. 따라서 이를 고정해주고 싶으면 탄력적 IP를 할당받고 직접 연결을 해주어야 한다. 그러면 묵시적으로 주어진 NAT와 DNS에서 항상 고정된 IP와 DNS 정보를 줄 것이다.
VPC
AWS에서 제공하는 가상의 사설 네트워크 환경으로 각 리전당 default로 1개가 존재하고 최대 5개가 존재한다. 사설 IP이기 때문에 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/24 이 대역을 가진다.
여기서 리전이란?
리전과 가용영역
리전
AWS에서 호스팅 서비스를 제공하는 지역으로 미국에 한정되어 있지 않고 전세계 32개 지역에 흩어져 있다. 이로써 물리적인 접근이 가까워져 세계 각지에서 빠른 속도로 AWS의 서비스의 사용이 가능하다.
가용영역
리전을 다시 2개 이상의 데이터 센터로 나누어 고가용성을 보장하고 내구성을 높힙니다. 서로 물리적으로는 나뉘어져 있지만 성능 좋은 네트워크를 통해 논리적으로는 이어져 있다. 한 개의 데이터 센터에는 50000~ 80000개의 서버가 있다고 추정한다고 한다.
서브넷 생성
vpc내에서 서브넷을 생성하여 여러개의 논리적인 네트워크를 구성하여 사용한다. 이렇게 생성한 서브넷들로 ‘혼자 사용하는 것 같은’ 나만의 독립된 네트워크를 만들 수 있다. 그리고 생성한 서브넷들끼리는 가상의 VPC라우터를 통해 연결되어 있다.
public 서브넷 만들기
위처럼 만든 서브넷은 외부와 연결되지 않은 private 서브넷이다. 외부와도 통신을 하고 싶다면 인터넷과 연결이 되어야 하는데 이 연결 통로를 Internet Gateway(IG)라 한다.
- 인터넷 게이트웨이 생성 및 연결
위처럼 VPC에 외부로 나갈 수 있는 IG가 생긴 것이다.
- 라우팅 테이블 생성 및 연결 하지만 IG가 연결이 된 것만으로는 외부로 나갈 수 없다. 해당 문으로 나가는 경로를 모르기 때문에 이를 알려주어야 한다(라우팅).
가상의 네트워크이기 때문에 실제 물리적으로 라우터를 타고 데이터가 이동하는 것이 아니기 때문에 라우팅 테이블의 설정만으로 VPC라우터가 모두 라우팅 처리를 한다.
라우팅 테이블에서 0.0.0.0/0(모든 IP)로 가려면 방금 생성한 게이트웨이로 가야함을 명시한다.
private 서브넷의 서버에 접속하는법
같은 VPC에 public 서브넷이 있다면 이를 bastion host로 이용할 수 있다. VPC라우터를 통해 연결되어 있기 때문에 원격 접속하여 private 서브넷에 접속할 수 있다.
bastion host로 이용할 수 있는 서버가 없다면, public 서브넷의 인스턴스에 가상의 네트워크 카드를 만들어서 추가하여(접속하려는 private 서브넷과 연결된 ) 멀티 홈드 시스템을 만들어 접속할 수 있다. 사실 같은 서브넷까진 아니어도 같은 VPC와 연결된 네트워크 카드면 VPC라우터를 통해 연결될 수 있으니까 이 경우도 되겠지?
그리고 두 경우 모두 private 서브넷의 서버에 접속할 때 local의 key정보가 필요하다면 터널링을 이용한 Agent Forwarding를 이용하여 접속할 수 있다.
둘 다 직접 접속하는 것이 아닌 경유지를 거쳐 접속하는 방법을 이용하는 것이라 볼 수 있다.
출처
EC2 구조 이미지
인스턴스 타입 이미지
UMC 서버파트 교육자료
명지대학교 백엔드 수업 교육자료