Cloud/AWS

[AWS] EC2

dohyeon2 2023. 12. 6. 16:05

이번 글에서는 AWS EC2의 전체적인 개념과 사용법을 정리하였습니다. 


AWS EC2란? 

: AWS EC2란 Amazon Elastic Compute Cloud의 줄임말로서 AWS에서 제공하는 온디맨드 클라우드 컴퓨팅 서비스입니다.

컴퓨터를 임대해주는 서비스로서 우리가 PC방에 가서 요금을 내고 컴퓨터를 이용하는 것처럼 aws에서 컴퓨터를 임대해주는 서비스라고 생각하면 이해가 쉽습니다. 우리가 이 서비스를 사용하면 얻을 수 있는 장점은 다음과 같습니다.

  • 하드웨어 구축 비용 및 시간 절감: 실제로 서버를 구축하는 데에는 매우 많은 비용과 노력이 필요합니다. EC2를 사용하면 초기 하드웨어 구축 비용이 필요하지 않고, 짧은 시간안에 원하는 컴퓨팅 리소스를 얻을 수 있습니다.
  • 컴퓨팅 요구사항 변화에 대응: EC2를 사용하면 컴퓨팅 요구사항 변화에 맞춰 손쉽게 컴퓨팅 파워를 조정할 수 있습니다. 예를들어 배포한 서비스의 사용자 트래픽이 갑작스럽게 증가했을 경우, 컴퓨팅 용량을 손쉽게 증가시킬 수 있습니다.
    위와 같은 이유로 EC2를 통해 본인의 어플리케이션을 빠르게 개발하고 배포할 수 있습니다. 

AWS EC2 예산설정

: AWS EC2는 사용자가 컴퓨팅 자원을 사용한만큼 요금을 청구받는 방식입니다. 따라서 과도한 요금청구를 피하기 위해 미리 예산을 설정해놓고 그 예산을 초과하면 알림을 받을 수 있도록 해놓는 것이 좋습니다. 과금 정보 및 비용관리/예산/예산 생성 탭에 들어가면 다음과 같은 레이아웃을 확인하실 수 있습니다.

저는 연구실에서 한달에 AWS 서비스에 사용가능한 예산이 100$ 이므로 위와 같이 설정하였습니다. 이렇게하면 서비스 사용량이 100$에 가까워지면 메일, 휴대폰 등을 통해 알림을 받을 수 있습니다.

AWS EC2 인스턴스 유형

: aws에는 다양한 목적에 맞춰 사용 가능한 여러 유형의 EC2 인스턴스가 있습니다. aws에서는 이러한 목적에 맞게 인스턴스 명명규칙을 갖고있는데 m5.2xlarge라는 인스턴스 유형을 예로 들어보겠습니다. 여기서 m은 인스턴스 클래스를 뜻하고 5는 인스턴스의 세대를 말합니다. 인텔 칩셋의 12세대, 13세대 등을 생각하면 이해하기 쉽습니다. 2xlarge는 인스턴스 클래스의 크기를 말합니다. 클래스의 크기가 클수록 더 많은 메모리와 CPU 코어를 갖습니다. 이렇게 다양한 인스턴스를 목적에 따라 분류하면 다음과 같습니다.

  • 범용 인스턴스: 범용적인 목적에 사용되는 인스턴스 유형을 말합니다. 범용 인스턴스는 컴퓨팅 파워, 메모리, 네트워크 속도 등을 밸런스있게 제공합니다.
  • 컴퓨팅 최적화 인스턴스: 컴퓨팅 계산 작업에 특화된 인스턴스 종류를 말합니다. C라는 단어로 시작하는 인스턴스 이름을 갖고있습니다. 
  • 메모리 최적화 인스턴스: 메모리에서 대규모 데이터셋을 빠르게 처리하는데 특화된 인스턴스 종류를 말합니다. 주로 고성능의 관계형 데이터베이스 또는 비관계형 데이터베이스를 구축할 때 사용하는 인스턴스입니다. 
  • 스토리지 최적화 인스턴스: 로컬 스토리지에서 대규모 데이터셋에 엑세스할 때 적합한 인스턴스입니다. 주로 관계형과 비 관계형인 NoSQL 데이터베이스에 사용됩니다.  
  • 가속화된 컴퓨팅 인스턴스: GPU를 기반으로 그래픽처리, 데이터 패턴 일치 등의 기능을 CPU보다 빠르게 수행하는 인스턴스를 말합니다.
    (참고: https://aws.amazon.com/ko/ec2/instance-types/)

AWS 보안 그룹

Inbound, Outbound 트래픽

(그림출처: udemy AWS Certified Solutions Architect Associate 강의)

 

보안 그룹은 일종의 EC2 인스턴스 방화벽을 말합니다. 보안 그룹을 사용하여 EC2 인스턴스로 들어오거나 나가는 트래픽들을 사용자가 설정한 허용규칙을 통해 제어할 수 있습니다. 위 그림처럼 외부에서 EC2 인스턴스로 들어오는(Inbound) 트래픽과 EC2 인스턴스에서 외부로 나가는(Outbound) 트래픽을 허용할지 말지 결정합니다. 보안그룹 규칙을 설명하기 위해 그림을 그려보면 아래와 같습니다.

 

AWS EC2 방화벽 모식도

보안 그룹 1의 인바운드 규칙에서 내 컴퓨터의 IP와 port 22를 허용하면 내 컴퓨터에서 EC2 인스턴스로 전달하는 트래픽은 Port 22를 통해서 허용되지만 IP가 다른 컴퓨터에서 EC2 인스턴스로 전달하는 트래픽은 차단합니다. 또한 EC2 인스턴스에서 외부로 전달하는 아웃바운드 규칙은 default로 모든 port와 IP를 허용합니다. 또한 보안그룹은 여러 인스턴스에 연결할 수 있으며 인스턴스 또한 여러 보안그룹을 설정할 수 있습니다. 

AWS Port

: 우리는 네트워크 상에서 통신을 할 때 주로 IP를 기반으로 접근합니다. 하지만 내가 접속하고자 하는 IP에서 여러개의 서버를 실행중일때 IP만 가지고 접근한다면 어떤 서버에 접속할건지 특정할 수 없을 것입니다. 이때 Port를 통해 해당 IP의 어떤 서버를 실행할 것인지 특정하여 정확한 서버에 접근할 수 있습니다. 우리가 주로 사용하는 포트는 다음과 같습니다. 

  • SSH(Secure shell): 22번 포트를 통해 리눅스 인스턴스에 로그인 하는데 사용
  • FTP: 21번 포트를 통해 파일공유 시스템에 파일을 업로드하는데 사용 
  • SFTP: SSH를 통해 파일을 전송하기 때문에 SSH port와 동일하게 22번 포트를 사용
  • HTTP: 80번 포트를 통해 보안이 되지 않은 웹사이트에 엑세스하는데 사용
  • HTTPS: 443번 포트를 통해 보안된 웹사이트에 엑세스하는데 사용
  • RDP: 3389번 포트를 통해 윈도우 인스턴스에 로그인 하는데 사용

AWS 구매옵션 선택방법

: aws에서는 다양한 상황과 목적에 맞는 여러 구매옵션을 제공합니다. 그러나 aws를 처음 이용하는 경우 어떤 구매옵션이 내게 가장 적합한지 알기 어렵습니다. 자신에게 맞는 구매옵션을 선택하는 방법을 리조트에 비유해서 정리해보았습니다.

  • 온디맨드 옵션: 자신이 원할 때 언제나 리조트에 오고 전체 가격을 지불하는 방법
  • 예약 옵션: 자신이 리조트에 아주 오래 체류할 것이라는 걸 알고있을때(1년~3년) 미리 예약하는 방법
  • 절약 플랜 옵션: 자신이 리조트에서 일정한 금액을 지출할 것임을 미리 알고 있을 때 사용하는 방법. 12개월동안 매월 300달러를 지출하고, 객실 타입등을 변경할 수 있음. 
  • 스팟 인스턴스 옵션: 리조트에 빈 객실이 있고 리조트가 사람들을 끌어 모으기 위해 호텔이 할인을 제공하는 경우, 사용자들이 빈객실을 얻기 위해 경매하는 방법. 하지만 다른 사람이 본인보다 더 많은 객실 요금을 낼 의사가 있을경우 객실을 빼앗길 위험이 있습니다.
  • 전용 호스트 옵션: 리조트 건물 전체를 예약하는 방법. 자신만의 하드웨어 즉 자신만의 리조트를 할당받습니다. 
  • 스토리지 예약 옵션: 객실을 에약할건데 본인이 체류할지 말지 정확히 알지 못할 경우 사용하는 방법. 만약 객실에 체류할 수도 있지만 체류하지 않더라도 예약금액을 지불해야합니다. 

AWS EC2 Spot Instance

: 스팟 인스턴스를 사용하면 온디맨드 옵션에 비해 최대 90%까지 할인받을 수 있습니다. 이러한 금액적인 이유때문에 중간에 인스턴스 연결이 끊길 위험성을 갖더라도 많은 사람들이 스팟 인스턴스 옵션을 고려하고 있습니다. 스팟 인스턴스 옵션을 도입하는 과정은 다음과 같습니다.

  • 스팟 인스턴스에 지불할 수 있는 최대 금액을 정합니다. 이를 본인의 "예산"이라고 하겠습니다. 
  • 만약 스팟 인스턴스 가격이 예산보다 낮다면 해당 인스턴스를 유지합니다. 
  • 그러나 현재 스팟 인스턴스 가격이 예산을 초과하면 두가지 중에 하나를 선택합니다.(2분안에 선택해야하므로 주의!!)
    1. 인스턴스 중지: 모든 작업을 중지하고 스팟 인스턴스 가격이 예산보다 낮아지면 인스턴스를 재시작
    2. 인스턴스 종료
  • aws가 본인의 인스턴스를 회수하는 것을 원치 않는다면 스팟 블록을 사용할 수 있습니다. 스팟 블록이란 지정된 기간(1~6시간)동안 스팟 인스턴스를 차단하는 기능을 말합니다. 

이러한 이유로 스팟 인스턴스는 중요한 작업이나 데이터베이스에는 적합하지 않고 주로 데이터 분석이나 장애 복원력이 뛰어난 워크로드 등에 사용합니다. 

 

AWS EC2 Spot Fleets

: 스팟 플릿이란 스팟 인스턴스 세트를 정의하는 방법을 말합니다. 스팟 플릿은 본인이 정의한 예산으로 목표 용량을 충족하기 위해 최선을 다합니다. 스팟 플릿의 동작과정은 다음과 같습니다.

1. 먼저 사용 가능한 런치풀을 정의합니다. 사용가능한 다양한 인스턴스 유형(m5.large), 다양한 OS 등을 정의합니다.

2. 플릿이 알아서 가장 적합한 런치 풀을 선택합니다. 

3. 만약 원하는 예산이나 용량에 도달한다면 인스턴스 시작을 중지합니다.

따라서 우리가 해야할 일은 스팟 플릿에 스팟 인스턴스를 할당하는 전략만 정의하면 됩니다.

스팟 인스턴스 할당 전략

  • 최저 가격 전략: 플릿이 가장 낮은 가격인 풀에서 인스턴스를 실행하기 때문에 비용이 최적화 됩니다. 워크로드가 매우 짧은경우 적합한 전략입니다. 
  • 다양성 전략: 사용자가 미리 정의한 모든 스팟 풀에 분산되어 실행합니다. 가용성과 긴 워크로드에 적합합니다. 하나의 풀이 사라져도 여전히 다른 풀이 살아있기 때문에 보다 안정적인 전략입니다. 
  • 용량 최적화 전략: 원하는 인스턴스 수에 맞는 최적의 용량을 가진 풀을 선택하여 인스턴스를 실행합니다. 
  • 가격 및 용량 최적화 전략: 먼저 사용 가능한 용량이 가장 큰 풀을 선택하고 그중 가격이 가장 낮은 풀을 선택하는 전략입니다. 대부분의 워크로드에 적합한 전략입니다. 

스팟 인스턴스와 스팟 플릿이 조금 헷갈릴 수 있지만 차이점은 다음과 같습니다.

스팟 인스턴스는 원하는 인스턴스 유형과 AZ를 정확히 알고있는 경우 사용하기 좋습니다. 스팟 플릿은 사용 가능한 모든 인스턴스 유형과 모든 AZ를 정의하면 플릿이 알아서 최적의 인스턴스를 선택해주기 때문에 사용하고자 하는 인스턴스 유형과 AZ가 명확하지 않을 때 사용하기 좋습니다. 

AWS EC2 Placement Groups

: AWS EC2 배치그룹(Placement Group)이란 EC2 인스턴스가 aws 인프라에 배치되는 방식을 제어할 때 사용됩니다. 우리는 aws에서 제공하는 하드웨어와 직접적인 통신을 하지 않지만 배치그룹을 통해 EC2 인스턴스가 하드웨어에 각각 어떻게 배치되기를 원하는지 정의할 수 있습니다. 

EC2 배치그룹 전략

  • 클러스터 배치그룹: 하나의 AZ(Availavility Zone)에서 지연시간이 가장 짧은 하드웨어 설정으로 인스턴스를 그룹화 합니다. 이 전략은 높은 네트워크 성능을 보장하지만 아래 그림과 같이 모든 인스턴스가 동일한 하드웨어 Rack, 동일한 AZ에 존재하기 때문에 랙에서 issue가 발생하면 모든 인스턴스가 정지할 수 있는 위험성이 있습니다. 
    (매우 높은 네트워크 대역폭, 짧은 지연시간이 필요한 애플리케이션에 적합한 전략)

클러스터 배치그룹

  • 분산 배치그룹: 여러 하드웨어(AZ)에 인스턴스를 분산시키는 전략입니다. 이 전략은 인스턴스들이 여러 AZ에 분산되어 있기 때문에 하나의 하드웨어 랙에서 issue가 발생하더라도 다른 AZ에서 동작하여 애플리케이션 중단을 방지할 수 있습니다. 하지만 동일한 AZ에는 7개의 인스턴스만 생성할 수 있기 때문에 배치그룹 규모에 제한이 있는 문제점이 있습니다.
    (가용성을 극대화하고 서비스 안정성이 중요한 애플리케이션에 적합한 전략

분산 배치그룹

  • 분할 배치그룹: 분산 배치그룹처럼 인스턴스를 여러 AZ로 분산시키는 것은 동일하지만, 동일 AZ안에서 여러 파티션을 생성하여(~7개) 최대 수백 개의 인스턴스를 생성할 수 있는(분산 배치그룹의 단점을 보완한) 전략입니다. 아래 그림과 같이 하나의 파티션 내의 인스턴스는 다른 파티션의 인스턴스와 동일한 하드웨어 랙을 공유하지 않으므로 하나의 랙에서 실패가 발생하더라도 애플리케이션은 안정적으로 실행됩니다.
    (파티션 전반에 걸쳐 데이터와 서버를 분산시킨 애플리케이션에 적합한 전략)

분할 배치그룹

AWS EC2 Elastic Network Interfaces(ENI)

: AWS EC2 탄력적 네트워크 인터페이스는 VPC의 논리적 구성요소이며 가상 네트워크 카드를 의미합니다. ENI는 EC2 인스턴스가 네트워크에 엑세스 할 수 있게 해주는 기능입니다. ENI의 특징은 다음과 같습니다.

  • 초기 private IPv4와 하나 이상의 보조 IPv4를 가질 수 있음
  • 각 ENI는 private IPv4당 탄력적 IPv4를 갖거나 혹은 하나의 공용 IPv4를 가질 수 있으므로 private, public IP가 하나씩 제공됨
  • ENI에 하나 이상의 보안 그룹을 연결할 수 있음
  • EC2 인스턴스와 독립적으로 ENI를 생성하고 즉시 연결하거나 장애 조치를 위해 인스턴스에서 분리시킬 수 있음
  • ENI는 특정 AZ에 바인딩 됨(서울 AZ에서 생성한 ENI는 북미 AZ에서 사용할 수 없음)

AWS EC2 Hibernate(절전) 모드

: AWS EC2 절전모드는 우리가 자주 사용하는 윈도우의 절전모드를 생각하시면 이해가 빠릅니다. EC2 인스턴스가 종료되면 RAM에 있는 메모리는 날아가지만 절전모드에 들어가면 AM에 있던 인메모리 상태는 그대로 보존됩니다. 이에 따라 인스턴스 부팅이 매우 빠르게 진행됩니다. 우리가 윈도우에서 절전모드에 들어갔다가 키보드를 한번 클릭하면 기존 실행중이던 모든 프로그램이 0.1초만에 부팅되는 것과 같습니다. EC2 인스턴스가 절전모드에 돌입하면 다음과 같이 동작됩니다. 

  1. 실행중인 인스턴스는 중지상태로 전환
  2. RAM의 내용을 EBS 볼륨에 덤프
  3. RAM 삭제
  4. 인스턴스를 재시작하면 디스크에서 RAM 내용을 불러와 EC2 인스턴스 메모리로 가져옴

이렇게 동작하면 마치 EC2 인스턴스를 중지한 적이 없는 것처럼 빠르게 부팅됩니다.
(초기화에 많은 시간이 소요되는 서비스를 중단없이 재부팅하고 싶을 때 사용할 수 있음) 

AWS EC2 EBS

: AWS EC2 EBS(Elastic Block Store)는 인스턴스를 연결할 수 있는 일종의 네트워크 드라이브입니다. EBS 볼륨을 쓰는 이유는 EC2 인스턴스가 종료된 이후에도 본인의 데이터를 저장할 수 있기 때문입니다. 인스턴스를 재시작하더라도 EBS 볼륨을 인스턴스에 마운트하면 기존 데이터를 그대로 불러올 수 있습니다. EBS 볼륨의 특징을 정리하면 다음과 같습니다. 

EBS 특징

  • EBS 볼륨은 특정 AZ에 바인딩
  • CCP level은 하나의 EC2 인스턴스에만 마운트 가능하며, Associate level은 일부 EBS를 인스턴스에 다중연결 가능
  • 인스턴스와 독립적으로 생성할 수 있으며, 이후 용량 확장 가능

EBS 볼륨 종류

  • gp2/gp3: 범용 SSD 볼륨으로 다양한 워크로드에 대해 가격과 성능의 절충점이 되는 볼륨
  • io1/io2: 고성능 SSD 볼륨으로 미션 크리티컬이자 지연 시간이 낮고 대용량 워크로드가 부여될 때 주로 사용
  • st1: 저비용 HDD 볼륨으로 잦은 접근과 처리량이 많은 워크로드가 부여될 때 주로 사용(데이터베이스 워크로드)
  • sc1: 초저비용 HDD 볼륨으로 접근 빈도가 낮은 워크로드가 부여될 때 주로 사용

주의할점은 EC2 인스턴스에는 오직 gp2/gp3, io1/io2 EBS 볼륨만 부팅 볼륨으로 사용할 수 있습니다.

 

gp2/gp3 차이점

  • gp3는 기본 3,000 ~ 최대 16,000 IOPS, 기본 125 ~ 최대 1000 MB/s 처리량 제공하며 IOPS와 볼륨이 독립적이어서 각각 따로 설정할 수 있음
  • gp2는 최대 3,000 IOPS, 기본 125 ~ 최대 1000 MB/s 처리량 제공하며 IOPS와 볼륨이 연결되어 있어서 볼륨이 늘어나면 IOPS도 늘어남

Provisioned IOPS

  • 크리티컬한 애플리케이션이나 IOPS 성능이 일정해야하는 애플리케이션에 적절(데이터베이스 워크로드)
  • io1/io2 중 하나를 선택해야 한다면 io2가 동일한 가격에 더 많은 IOPS를 지원하므로 io2가 더 합리적임
  • 32,000 이상의 IOPS가 필요한 경우, io1 또는 io2 볼륨의 EC2 Nitro가 필요함

st1/sc1 차이점

  • st1은 빅데이터나 데이터 웨어하우징 로그 처리용으로 최대 500MB 처리량, 최대 500 IOPS 제공
  • sc1은 아카이브 데이터용으로 최대 처리량 250MB, 최대 250 IOPS 제공

AWS EC2 EBS Snapshot

: AWS EC2 EBS 스냅샷은 EBS 볼륨의 특정 시점에 대한 백업입니다. 윈도우 백업기능에서 특정시점을 기준으로 백업해주는 것을 떠올리면 이해가 쉽습니다. 스냅샷은 EBS와 달리 다른 AZ, 심지어 다른 리전에도 복사할 수 있습니다. 그래서 서울 리전에서 서비스하던 애플리케이션을 북미에서 서비스하고 싶을 때 스냅샷을 이용해 애플리케이션을 다른 지역으로 손쉽게 이전할 수 있습니다. EBS 스냅샷의 특징을 정리하면 다음과 같습니다.

 

EBS 스냅샷 특징

  • 스냅샷 아카이브: 75%까지 저렴한 아카이브 티어로 스냅샷을 다른 AZ나 리전으로 옮길 수 있는 기능(복원하는데 24시간~72시간 소요)
  • 스냅샷 휴지통: EBS 스냅샷을 영구삭제하는 대신에 휴지통에 보관할 수 있음(1일~1년까지 보관)
  • Fast 스냅샷 복원(FSR): 스냅샷을 초기화해 스냅샷 복원에 소요되는 지연시간을 없애는 기능

ebs 볼륨 생성 > 볼륨으로부터 스냅샷 생성 > 생성된 스냅샷을 인스턴스에 연결

AWS EC2 AMI

: AWS EC2 AMI(Amazon Machine Image)는 EC2 인스턴스를 통해 만든 이미지를 말합니다. AMI로 aws를 구축할 수도 있고 원하는 대로 변경할 수도 있습니다. Docker 이미지를 통해 서버를 세팅하는 것과 같이 사용자가 정의한 OS, 소프트웨어 등을 한번 패키징해 해놓으면 이미지만 불러와서 간편하게 서버를 세팅할 수 있습니다. 사실 우리는 EC2 인스턴스를 생성할 때 AWS측에서 미리 만들어 놓은 AMI(ubuntu 2020)을 불러와서 ubuntu 서버를 세팅했었습니다 :). 그렇다면 우리는 Docker에서 했던것처럼 내가 필요로하는 소프트웨어, 라이브러리등을 미리 패키징해놓은 Custom 이미지를 만들어 놓으면 손쉽게 새로운 서버를 세팅할 수 있을 것입니다.

 

Custom AMI 생성방법

  1. EC2 인스턴스를 생성하고 본인이 원하는 소프트웨어, 라이브러리등을 설치
  2. 인스턴스를 중지하여 데이터 무결성을 확보
  3. 설정이 완료된 인스턴스로 AMI를 구축
  4. Custom AMI를 불러와서 인스턴스 생성

AMI를 불러와 인스턴스 생성

위와 같이 인스턴스 생성시 내 AMI를 불러와서 생성하면 기존 설치했던 소프트웨어, 라이브러리 등을 다시 설치할 필요없이 손쉽게 세팅할 수 있습니다.  

AWS EFS란? 

: AWS EFS(Elastic File System)이란 EC2 인스턴스에 마운트될 수 있는 일종의 네트워크 파일 시스템입니다. EFS를 사용하는 가장 큰 이유는 여러 AZ에 있는 EC2 인스턴스에 마운트할 수 있기 때문입니다. EFS은 오직 리눅스 기반 AMI와 호환되기 때문에 윈도우 기반 AMI에서는 사용할 수 없습니다.

 

EFS 퍼포먼스 모드

  • 범용 모드: 지연시간에 민감한 애플리케이션에 사용(웹서버, CMS 등)
  • 최대 I/O 모드: 지연시간은 범용 모드보다 더 길지만 처리량이 높은 애플리케이션에 사용(빅데이터, 미디어 프로세싱)

EFS 처리량 모드

  • Bursting 모드
  • Provisioned 모드
  • Elastic 모드

EFS 스토리지 티어

  • Standard: 자주 액세스하는 파일을 위한 계층을 뜻함.
  • EFS-IA: 자주 액세스 하지 않는 파일을 위한 계층을 뜻함. 수명 주기 정책을 통해 Standard 계층에 있는 파일중 사용자가 정의한 기간 이상 액세스 하지 않는 경우 파일을 EFS-IA 계층으로 옮기면 비용을 절감할 수 있음

EFS 가용성 및 내구성

  • 다중-AZ: 하나의 AZ에서 문제가 발생하더라도 다른 AZ에 저장된 EFS를 불러올 수 있어서 프로덕션 단계의 애플리케이션에 적합
  • 단일-AZ: 개발용 EFS로 단일 AZ에 EFS를 설정하는 모드(다중 AZ와 비교하여 최대 90% 저렴)