[AWS 입문 시리즈] AWS EC2 편

입문자분들을 위해 AWS EC2에 대해 정리한 글입니다.
2022.02.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

안녕하세요 클래스메소드의 수재입니다.
이번에 부서에서 AWS 입문 시리즈를 작성하게 되었습니다. 클래스메소드 블로그에 더 많은 서비스의 입문글이 있으니 참고해주세요.
가장 기본적인 서비스이기 때문에 연관된 서비스도 상당히 많습니다. 부가적인 서비스에 대해선 간략하게 기재하였으며 관련 문서를 링크해두었으니 필요에 따라 참고해주세요.

EC2란?

Amazon Elastic Compute Cloud(Amazon EC2)는 클라우드에서 컴퓨팅 파워의 규모를 자유자재로 변경할 수 있는 웹 서비스입니다. 개발자가 보다 쉽게 웹 규모의 컴퓨팅 작업을 수행할 수 있도록 설계되었습니다. - EC2 FAQ

쉽게 말해 가상 공간(클라우드)에 컴퓨터(인스턴스)를 만들어서 빌리는 서비스입니다.
간단하게 생성 및 삭제를 할 수 있고, 작업은 수 분 이내로 완료됩니다.

특징

이점

EC2를 사용하여 얻을 수 있는 이점은 대략적으로 다음과 같습니다.

  • 요구에 맞춰 컴퓨팅 용량을 빠르게 변화 가능(탄력성)
  • 이미 준비되어 있는 환경의 이미지(AMI)를 그대로 사용하여 빠르게 인스턴스를 프로비저닝 할 수 있다
  • 사용한 만큼의 요금 또는 장기 계약 등 필요에 맞춘 비용 관리가 가능하다
  • I/O, 네트워크, 스토리지 타입, 컴퓨팅이나 그래픽 등 요구 사항에 맞춰 다양한 인스턴스 타입을 선택할 수 있다

이 외에도 관리나 보안 등 다양한 이점이 있습니다.

주요 기능

EC2의 주요 기능을 알아봅니다.

인스턴스

EC2에서 관리하는 하나의 서버 단위를 인스턴스 라고 합니다.
인스턴스를 생성할 때 AMI(Amazon Machine Image)와 인스턴스 타입, 네트워크 설정, 볼륨, 태그 등 다양한 옵션을 선택하여 생성합니다.

AMI

인스턴스의 기동이나 활용에 필요한 운영 체제 및 어플리케이션 서버, 여러 소프트웨어들이 구성된 상태로 제공되는 템플릿과 같습니다.
같은 구성을 가진 여러대의 인스턴스를 생성해야 할 때 AMI를 이용하면 빠르게 해결할 수 있습니다.
이러한 AMI는 AWS나 각 소프트웨어 공급자들이 제공하는 것을 이용하거나 사용자가 직접 EC2에 필요한 구성을 구축한 후 이를 이미지로 등록하여 사용할 수도 있습니다(일종의 백업입니다).

인스턴스 타입

EC2는 사용자의 요구 사항(범용, 컴퓨팅, 메모리 등)에 맞춰 CPU, 메모리, 스토리지 및 네트워킹 용량의 다양한 조합으로 구성된 다양한 인스턴스 타입을 선택하여 인스턴스를 생성합니다.
인스턴스 타입 이름에 해당 인스턴스의 타입이나 사이즈 등이 표현됩니다.

용도에 맞춰 적당한 인스턴스 타입을 선택하는 것이 성능이나 비용적으로 효율적인 운용이 가능합니다.
현재 이용 가능한 인스턴스 타입은 공식 페이지를 참고해주세요.

인스턴스 타입에 따라 성능 순간 확장(버스트)이 가능합니다.
버스트 기능이란 순간적으로 성능의 확장이 필요한 순간에만 인스턴스의 기본 성능 이상으로 성능을 확장하는 기능입니다.
이를 이용하여 평상시에는 기본 성능으로만 사용하고 필요시에만 확장하여 비용 최적화가 가능합니다.
버스트기능을 이용하면 기준 CPU와 추가 버스트 CPU 사용량에 대해서만 비용을 지불하면 되므로 컴퓨팅 비용이 절감됩니다.

볼륨

인스턴스는 로컬 인스턴스 스토리지와 EBS(Elastic Bloc Store)라는 외부 스토리지로 구성되어 있습니다.
인스턴스의 로컬 스토리지는 인스턴스 타입마다 제공하는 디스크 유형(HDD, SSD, NvMe SSD)이나 사이즈에 차이가 있습니다.
따라서 해당 타입을 이용할 때 디스크 유형도 필요한 작업에 적합한지를 확인하고 타입을 선택하여야 합니다.
타입별 볼륨에 대한 정보는 공식 문서를 참고해주세요.

로컬 스토리지에 저장된 데이터는 인스턴스 수명에 따라 삭제되지만 EBS에 저장된 데이터는 수명과 상관없이 데이터가 유지됩니다.
따라서 인스턴스를 삭제하더라도 삭제 전에 외부 스토리지만 분리하여 다른 인스턴스에서 활용할 수 있습니다.
이러한 EBS 볼륨은 암호화가 가능하며 snapshot을 생성하여 AMI와 같이 백업도 가능합니다.

네트워크

AWS VPC 라는 AWS 전용 가상 네트워크를 이용합니다.
VPC의 cidr 범위에서 더 세밀하게 공간을 나눈 서브넷에 EC2를 작성합니다.
각 서브넷은 가용 영역을 다르게 사용할 수 있으며 유저가 어플리케이션을 운용할 때 복수의 EC2 인스턴스를 여러 가용영역에 걸쳐 생성함으로써 높은 가용성을 확보할 수 있습니다.

기본적으로 인스턴스의 IP 주소는 VPC내에서만 통신이 가능한 프라이빗 IP가 지정됩니다.
인스턴스가 외부 인터넷과 통신하기 위해서는 외부 트래픽의 접근과 외부로의 발신 양쪽을 허용하는 인터넷 게이트웨이를 서브넷에 연결하거나 발신만을 허용하는 넷 게이트웨이(NAT Gateway) 등을 이용하여 통신할 수 있습니다. 1
인터넷 통신을 위한 퍼블릭 IP는 인스턴스 생성시에 자동으로 생성하거나 작성한 탄력적 IP 주소(Elastic IP address)를 인스턴스에 연결하여 부여할 수 있습니다.

대역폭은 인스턴스의 vCPU에 따라 달라집니다.

인스턴스의 사용 가능한 네트워크 대역폭은 인스턴스가 보유한 vCPU 수에 따라 달라집니다. 예를 들어,m5.8xlarge 인스턴스는 32개의 vCPU 및 10Gbps의 네트워크 대역폭을 보유하고 m5.16xlarge 인스턴스는 64개의 vCPU 및 20Gbps의 네트워크 대역폭을 보유합니다. 하지만 초당 패킷 수 또는 추적된 연결 수와 같은 인스턴스 수준의 네트워크 허용량을 초과하는 경우 인스턴스에서 이러한 대역폭을 달성하지 못할 수 있습니다. 트래픽에 활용할 수 있는 대역폭의 양은 vCPU 수와 대상에 따라 다릅니다. 예를 들어 m5.16xlarge 인스턴스에는 64개의 vCPU가 있으므로 리전의 다른 인스턴스로 전송되는 트래픽은 전체 가용 대역폭(20Gbps)을 활용할 수 있습니다. 하지만 다른 리전의 다른 인스턴스로 전송되는 트래픽에는 가용 대역폭의 50%(10Gbps)만 활용할 수 있습니다. - 공식 문서

기계 학습과 같이 기본 TCP 이상의 네트워크 성능이 필요한 경우 EFA(Elastic Fabric Adapter)를 연결하여 TCP 전송보다 지연율이 낮고 일정하며 더 높은 처리량을 얻을 수 있습니다.
EFA를 지원하지 않는 인스턴스 타입도 있기 때문에 EFA가 필요한 경우 사전에 확인할 필요가 있습니다.

보안

AWS 서비스는 기본적으로 AWS와 고객의 공동 책임 모델을 따릅니다.
따라서 하드웨어적인 부분은 AWS에서 책임을 지고 보안을 유지하지만 클라우드 내부의 보안은 고객이 관리할 필요가 있습니다.

고객이 EC2의 보안을 강화할 수 있는 방법으로는 우선 네트워크 ACL(액세스 제한 목록)과 보안 그룹이 있습니다.
네트워크 ACL과 보안 그룹은 서버의 방화벽과 같은 기능을 하며 인스턴스의 수신 발신 트래픽을 제한할 수 있습니다.
ACL이 먼저 적용된 후 보안 그룹으로 적용됩니다.
ACL에 대한 자세한 내용은 공식 문서를 참고해주세요.
보안 그룹에 대한 자세한 내용은 공식 문서를 참고해주세요.

만약 인터넷으로의 트래픽 발신은 필요없지만 AWS의 다른 서비스와 연결이 필요한 경우 VPC 엔드포인트를 이용하면 이러한 문제를 해결할 수 있습니다.
VPC 엔드포인트를 이용하면 다음 이미지와 같이 다른 AWS 서비스와의 통신을 AWS 내부로 제한할 수 있습니다.
본 글에선 S3 엔드포인트로 예를 들겠습니다.
- 게이트웨이 엔드포인트를 이용해서 Private EC2 인스턴스에서 S3로 통신

또한 IAM을 이용하여 인스턴스에 접근할 수 있는 유저나 서비스 등을 제한할 수 있으며 반대로 인스턴스가 접근할 수 있는 서비스 등도 제한할 수 있습니다.
AWS 콘솔에서 인스턴스를 관리하기 위한 AWS SSM(SystemsManager)이나 로깅을 위한 AWS Cloudwatch 등을 활용하기 위해선 해당 인스턴스에 적절한 권한이 부여된 IAM 역할을 설정할 필요가 있습니다.
EC2와 IAM에 대한 더 자세한 내용은 공식 문서를 참고해주세요.

이 외에 보안을 강화하기 위해서 인스턴스 내부의 소프트웨어를 업데이트하거나 인스턴스 접근에 필요한 계정 정보 및 키페어를 관리합니다.
또한 모니터링을 위해 VPC 흐름 로그를 활성화 하여 CloudWatch와 연계 도 할 수 있습니다.

요금

EC2 인스턴스를 구매하는 방법에는 온디맨드, Savings Plans, 예약 인스턴스, 스팟 인스턴스를 비롯하여 5가지 방법이 있습니다. 또한, 고객 전용 물리적 서버에 EC2 인스턴스 용량을 제공하는 전용 호스팅을 구매할 수도 있습니다. - 공식 문서

단순히 온디맨드로 서버를 유지하는 것이 아닌 일정 시간 동안만 인스턴스를 유지하거나 장기간(1년 이상) 인스턴스를 유지하는 등 용도에 맞춘 구매 플랜을 활용하여 서비스 비용을 최적화 할 수 있습니다.
각 구매 플랜에 대해 설명하자면

  • 온디맨드
    • 온디맨드 인스턴스에서는 실행하는 인스턴스에 따라 시간당 또는 초당 컴퓨팅 파워에 대한 비용을 지불합니다. 장기 약정이나 선결제 금액은 필요 없습니다. 애플리케이션 수요에 따라 컴퓨팅 파워를 늘리거나 줄일 수 있으며 사용한 인스턴스에 대해 지정된 시간당 요금만 지불하면 됩니다.
  • 스팟 인스턴스
    • 온디맨드 요금보다 최대 90% 할인된 가격으로 예비 Amazon EC2 컴퓨팅 용량을 요청할 수 있습니다. 단, 요청할 수 있는 인스턴스가 시간별로 인스턴스가 제한되어 있고 항상 유지할 수 있는 것이 아니기 때문에 주의가 필요합니다.
  • Savings Plans
    • Savings Plans는 1년 또는 3년 기간의 일정 사용량 약정(시간당 요금을 기준으로 측정)을 조건으로 EC2 및 Fargate 사용량에 대해 저렴한 요금을 제공하는 유연한 요금 모델입니다.
  • 예약 인스턴스
    • Amazon EC2 RI(예약 인스턴스)는 온디맨드 요금과 비교하여 상당한 할인 혜택(최대 72%)을 제공하며 특정 가용 영역에서 사용하는 경우에는 용량 예약을 제공합니다. 단, 1년 및 3년 간격으로 계약이 가능하며 선불금액에 따라 할인율이 달라집니다.
  • 전용 호스팅
    • 전용 호스팅은 고객 전용의 물리적 EC2 서버입니다.

또한 인스턴스 타입에 따라 요금이 다르므로 적절한 인스턴스 타입을 이용하는 것도 비용을 절약할 수 있습니다.
각 타입의 구매 타입별 요금은 요금 페이지를 참고해주세요.

만들어보기

간단한 설정의 인스턴스를 작성해보겠습니다.
VPC와 서브넷 등은 모두 작성되어있는 상태입니다.
다음과 같은 설정의 EC2를 만들겠습니다.

  • 인스턴스 1 대
  • OS는 Amazon Linux 2
  • 타입은 t2.medium 볼륨은 50 GB
  • 퍼블릭 서브넷에 생성
  • 탄력적 IP 연결
  • 본인 환경에서 SSH 연결을 허용
  • 모든 환경에서 HTTP 연결 허용
  • 키페어 이름은 "TestEC2"

EC2를 생성하려면 AWS 콘솔에서 EC2 서비스로 들어갑니다.
이 후 인스턴스 시작을 눌러 인스턴스를 생성합니다.
AMI는 Amazon Linux 2를 선택합니다.

이 후 타입을 선택하고 세부 정보 구성으로 넘어갑니다.

다음 화면에서 인스턴스의 상세 설정을 합니다.
인스턴스 수는 1대로 설정합니다.
그리고 생성해 둔 VPC와 인터넷 게이트웨이가 연결되어 있는 서브넷을 선택합니다.
탄력적 IP를 생성하여 연결하기 때문에 퍼블릭 IP 자동 생성은 하지 않습니다.
사용자 데이터(user data)에는 인스턴스를 작성한 후에 자동으로 실행할 커맨드를 설정합니다.

# 예시
#!/bin/bash
yum update -y
amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
yum install -y httpd mariadb-server
systemctl start httpd
systemctl enable httpd
usermod -a -G apache ec2-user
chown -R ec2-user:apache /var/www
chmod 2775 /var/www
find /var/www -type d -exec chmod 2775 {} \;
find /var/www -type f -exec chmod 0664 {} \;
echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

이 외에도 인스턴스를 종료했을 때의 동작이나 IAM 역할 등 다양한 옵션을 설정할 수 있습니다.
이번 글에서는 간단한 설정으로 생성하겠습니다.
다음 화면에서 볼륨을 생성합니다.
사이즈 이외의 옵션은 기본값으로 놔둡니다.(SSD인 gp2, 암호화 없음)
다음 화면에서 필요에 따라 태그를 지정합니다.
참고로 [Name] 태그를 지정한다면 인스턴스에 이름을 지정할 수 있습니다.(인스턴스 생성 후에 이름 지정도 가능합니다.)
본 글에서는 그냥 넘어가겠습니다.
태그 설정 후 다음 화면에서 보안 그룹을 설정합니다.
기존에 작성해 둔 보안 그룹이 있다면 그대로 사용해도 됩니다.
이번에는 인스턴스와 함께 이미지와 같이 작성하도록 하겠습니다.
설정 값을 확인한 후 EC2를 생성합니다.
그럼 다음과 같이 키페어를 설정하는 화면이 나옵니다.
기존에 사용하던 키페어가 있다면 그대로 사용하거나 새 키페어를 작성합니다.
새 키페어를 사용한다면 다운로드를 눌러야 인스턴스 생성이 활성화 됩니다.
생성 후 인스턴스 목록을 보면 새로운 인스턴스가 생성 중임을 확인할 수 있습니다.

마지막으로 탄력적 IP를 연결하여 인터넷과 통신하기 위한 고정 IP를 부여합니다.
EC2 콘솔의 [탄력적 IP(Elastic IPs)]탭에서 [탄력적 IP 주소 할당(Allocate Elastic IP address]를 클릭해서 퍼블릭 주소를 작성합니다.(설정 값은 디폴트로 합니다)
그리고 작성한 주소를 체크하고 [탄력적 IP 주소 연결(Associate Elastic IP address)]을 클릭합니다.

그리고 작성한 인스턴스를 고르고 [연결(Associate)]을 클릭하여 퍼블릭 주소를 부여합니다.

마치며

이상으로 AWS의 기본적인 서비스인 EC2에 대하여 알아보았습니다.
간단한 사용 방법 및 구성이었기 때문에 어려운 내용은 없었지만 사용 용도에 따라 다양한 옵션과 구성이 있으므로 요구 사항에 맞추어 다양한 인스턴스를 생성해봅시다.
또한 키페어는 분실하면 똑같은 키페어를 재발급 받을 수 없기 때문에 취급에 주의합시다.

긴 글 읽어주셔서 감사합니다.
오탈자 및 내용 피드백은 언제나 환영합니다. must01940 지메일로 연락 주시면 감사합니다!


본 블로그 게시글을 보시고 문의 사항이 있으신 분들은
클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !


  1. 정확하게는 NAT Gateway를 이용하더라도 외부 트래픽으로의 요청에 대해 응답을 받을 수 있습니다. 외부에서 인스턴스로의 요청이 되지 않습니다.