# EC2 - Fundamentals

### 키워드

- EC2

- EC2 유저 데이터

- EC2 인스턴스 타입

- 보안 그룹

- 인스턴스 구매 옵션

- 스팟 인스턴스

- 스팟 블럭

---

### EC2란?

EC2(Elastic Compute Cloud)는 Intrastructure as a Service(IaaS)이다. EC2는 한 서비스가 아니고 여러 서비스들을 통합한 상위 개념의 서비스이다.

- Renting virtual machines (EC2 Instances)

- Storing data on virtual drives (EBS)

- Distributing load across machines (ELB)

- Scaling the services using an auto-scaling group (ASG)

EC2를 사용하려면 몇 가지 구성요소를 선택해야 하는데,

- 운영체제: 리눅스, 윈도우, 맥 OS

- CPU & RAM

- 저장 공간

    - 네트워크에서 필요한 만큼 할당 받음 (EBS & EFS)

    - 정해진 크기를 할당 받음 (EC2 Instance Store)

- 네트워크 카드: 속도, 공인 IP 주소

- 방화벽 규칙: 보안 그룹

- 부트스트랩 스크립트: EC2 유저 데이터

### EC2 유저 데이터

부트스트랩(bootstrap)은 기계가 처음 동작할 때 명령어들을 실행하는 것을 의미한다. 시작할 때 딱 한 번만 실행되며 루트 계정에서 돌아간다. 소프트웨어 업데이트, 설정 파일 다운받기 등의 작업을 자동으로 실행한다.

## EC2 인스턴스 타입

AWS는 다양한 스펙의 EC2 Instance를 제공해준다. ([링크](https://aws.amazon.com/ko/ec2/instance-types/))

### 인스턴스 타입 이름 짓기

> m5.2xlarge

- m: 인스턴스 클래스

- 5: 세대 (계속 증가할 거다)

- 2xlarge:  인스턴스 클래스의 사이즈

### 인스턴스 타입 종류

- **범용** - 균형 있는 컴퓨팅, 메모리, 네트워크 리소스를 제공한다.

- **컴퓨팅 최적화** - 머신 러닝 등 고성능 프로세서를 활용하는 워크로드에 적합

- **메모리 최적화** - 메모리에서 대규모 데이터 세트를 처리하는 워크로드에 적합.

- **스토리지 최적화** - 읽고 쓰기가 많은 워크로드에 적합.

## 보안 그룹

보안 그룹은 EC2 인스턴스의 들어오고 나가는 네트워크 트래픽을 허용하는 방화벽의 역할을 한다. (허용밖에 못 한다) Port, IP, 인바운드/아웃바운드를 통제하며 한 인스턴스에 여러 보안 그룹이 붙을 수 있다. 보안 그룹은 리전/VPC에 종속되어 있어 리전을 바꾸면 보안 그룹도 다시 만들어야 한다.

- **인바운드 :** 외부 컴퓨터에서 EC2 인스턴스로 접근하는 트래픽

- **아웃바운드 :** EC2 인스턴스가 외부 컴퓨터로 접근하는 트래픽

기본적으로 모든 인바운드는 차단되어 있고, 모든 아웃바운드는 허용되어 있다.

### 일반적인 공개 포트

- 22 = SSH - 리눅스 인스턴스에 로그인

- 21 = FTP - 공유 폴더에 파일 업로드

- 22 = SFTP - SSH를 이용해 파일 업로드

- 80 = HTTP - 비보안 사이트에 접근

- 443 = HTTPS - 보안 사이트에 접근

- 3389 = RDP (Remote Desktop Protocol) - 윈도우 인스턴스에 로그인

### SSH

어떻게 EC2 인스턴스에 접근해서 조작할 수 있는가?에 대한 대답이다.

SSH는 Mac, Linux, 그리고 Windows 10이상에서 접근하는 방법이다. Windows 10 미만이면 putty를 사용해야 한다. 그리고 OS에 상관없이 웹사이트를 통해 접근하는 방법이 있는데, EC2 Instance Connect라 한다.

~SSM Session Manager로 접근할 수도 있지만 시험엔 안나온다.~

---

## EC2 인스턴스 구매 옵션

> 상황을 주고 어떤 옵션이 가장 적합하냐라고 묻는 문제가 출제될 수 있다. 또한 Scheduled Reserved는 실제로는 더이상 지원하지 않지만 시험에는 나올 수 있다.

- 온디맨드 - 사용하는 만큼

리눅스, 윈도우는 초당 지불, 다른 OS는 시간당 지불하며 시간외 추가금이 없어서 비용 예측이 쉽다. 짧게 쓰기 좋다.

- 예약(1~3년) - 온디맨드보다 많이 할인

    - Reserved - DB같이 계속 써야 하는 상황에 유리

    - Convertible Reserved - 인스턴스 타입이 잘 바뀐다.

    - Scheduled Reserved - 특정 시간대에만 필요할 때

- 스팟 인스턴스 - 싸고(90%) 불안정한 인스턴스, 분산 컴퓨팅 때도 좋다. 실패하면 다른 인스턴스로 다시하면 되니까

- 전용 호스트 - 물리적인 서버를 예약해 SW 라이센스의 범위를 규정한다(Compliance Requirements)

- 전용 인스턴스 - 실행될 동안 물리적인 이동이 없음을 보장한다.(?)

## 스팟 인스턴스

스팟 인스턴스의 가격은 실시간으로 변동된다. 이 가격이 우리가 설정해놓은 가격보다 낮으면 인스턴스는 할당되고 설정해놓은 가격만큼 청구된다. 만약 가격이 높아지면, 멈췄다가 가격이 적합해질 때 다시 실행하거나(persistent) 아예 종료한다(one-time).

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/133955_YPqxpXbF8CV857fgXy?q=80&s=1280x180&t=outside&f=webp)

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/133956_LgpoKe5HAyBBt1Nkre?q=80&s=1280x180&t=outside&f=webp)

### Spot Fleet

Spot Fleet = set of Spot Instances + (optional) On-Demand Instances

스팟 플릿은 최대 가격과 목표 용량을 설정해 놓고 이 목표에 맞게 유동적으로 스팟 인스턴스와 온디맨드 인스턴스를 조합하는 방식이다. 이 조합은 사전에 인스턴스 타입 풀을 만들어 놓고 각 풀에서 꺼내서 쓴다.

- **lowestPrice**(최저 가격) - 가장 싼 거 가져오기

- **diversified**(다각화) - 여러 풀에서 적절히 가져오기

- **capacityOptimized**(용량최적화) - 목표 용량에 최대한 맞게 가져오기

### Spot Block

지속 시간이 정의된 스팟 인스턴스이다. 더이상 지원하지는 않지만 시험에는 나올 수 있다.

---

### 실습 1. 리눅스 환경에서 EC2 시작하기

AWS 콘솔에서 첫 가상 서버를 만들고 아래 유저 데이터 스크립트를 실행시킬 거다.

```
#!/bin/bash
sudo yum update -y
sudo yum install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd
sudo chown -R $USER:$USER /var/www
echo "<h1>Hello World from $(hostname -f)</h1>" > /var/www/html/index.html
```

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/133959_6MmPucrCJAFTWkViJZ?q=80&s=1280x180&t=outside&f=webp)

### 실습 2. SSH로 인스턴스에 접근하기

아래의 명령을 입력해 주면 된다. Private key는 이전 실습에서 다운 받은 파일이고 퍼블릭 IP는 인스턴스의 IP이다. 뭔가 잘 안되면 구글링😉

```
ssh -i {Private key} ec2-user@{Your Public IP}
chmod 0400 {Private Key} # UNPROTECTED PRIVATE KEY FILE 에러가 뜰 때 실행 
```

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/134002_bRC2qtr92tkrIVRV5O?q=80&s=1280x180&t=outside&f=webp)

### 실습 3. EC2에 IAM Role 할당하기

EC2 등의 서비스에서 다른 서비스에 접근하려면 무조건 IAM 

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/134003_0BbQp35mb6EdnxCgOY?q=80&s=1280x180&t=outside&f=webp)

For the site tree, see the [root Markdown](https://slashpage.com/kaonmir.md).
