공식 문서: Get started with Amazon EC2
Amazon EC2(Elastic Compute Cloud) 는 AWS에서 가상 서버를 실행하는 서비스이다. EC2 instance는 AWS Cloud 위에서 동작하는 virtual server라고 이해하면 된다.

이미지 출처: AWS EC2 User Guide
EC2를 처음 사용할 때는 다음 요소를 이해해야 한다.
| 구성 요소 | 의미 |
|---|---|
| AMI | instance의 OS와 초기 software template |
| Instance type | CPU, memory, network 성능 조합 |
| Key pair | SSH 접속에 사용하는 인증 키 |
| VPC/Subnet | instance가 위치하는 network |
| Security group | inbound/outbound traffic을 제어하는 virtual firewall |
| EBS volume | instance에 붙는 block storage |
EC2를 언제 쓰는가
EC2는 직접 서버를 운영해야 할 때 사용한다. Container platform이나 serverless보다 관리할 것이 많지만, 그만큼 자유도가 높다.
대표적인 사용 사례는 다음과 같다.
| 사용 사례 | 설명 |
|---|---|
| 웹 서버 | Nginx, Node.js, Django, Spring Boot 배포 |
| 실험 서버 | ML 실험, 시뮬레이션, batch job |
| bastion host | private subnet 접근용 SSH gateway |
| self-hosted tool | 직접 관리하는 DB, monitoring, CI runner |
| legacy app | container/serverless로 옮기기 어려운 application |
처음 학습할 때는 작은 Linux instance를 띄우고 SSH로 접속해보는 것이 가장 좋다.
Instance 생성 흐름
AWS Console 기준으로 EC2 instance 생성 흐름은 다음과 같다.
- EC2 console로 이동한다.
Launch instance를 선택한다.- Name을 입력한다.
- AMI를 선택한다.
- Instance type을 선택한다.
- Key pair를 만들거나 선택한다.
- Network와 subnet을 선택한다.
- Security group을 설정한다.
- Storage를 설정한다.
- Instance를 launch한다.
처음 실습이면 Amazon Linux 계열 AMI와 free tier eligible instance type을 고르면 된다. 단, free tier 조건은 계정 생성 시점과 사용량에 따라 다를 수 있으므로 Billing과 Free Tier usage를 확인해야 한다.
AMI
AMI(Amazon Machine Image)는 instance의 시작 template이다. 어떤 OS와 기본 software로 시작할지 결정한다.
예시는 다음과 같다.
| AMI | 용도 |
|---|---|
| Amazon Linux | AWS 기본 Linux 환경 |
| Ubuntu Server | Ubuntu 기반 서버 |
| Windows Server | Windows 서버 환경 |
| Deep Learning AMI | ML framework가 미리 설치된 환경 |
AMI를 선택하면 root volume도 그 이미지에 맞춰 생성된다. 나중에 직접 설정한 서버 상태를 AMI로 만들어 재사용할 수도 있다.
Instance Type
Instance type은 CPU, memory, storage, network 성능 조합이다.
예를 들어 t3.micro, t4g.micro, m7i.large 같은 이름을 가진다.
처음에는 작은 instance로 시작하고, 부하가 커지면 scale up하는 것이 안전하다.
| 계열 | 특징 |
|---|---|
| t 계열 | burstable general purpose |
| m 계열 | balanced general purpose |
| c 계열 | compute optimized |
| r 계열 | memory optimized |
| g/p 계열 | GPU workload |
Instance type을 고를 때는 다음을 확인한다.
CPU가 병목인가?
메모리가 병목인가?
네트워크가 중요한가?
ARM 기반 Graviton을 써도 되는가?
Free Tier 대상인가?
Key Pair
Linux instance에 SSH로 접속하려면 key pair가 필요하다. Key pair는 public key와 private key로 구성된다.
| 키 | 위치 |
|---|---|
| Public key | EC2 instance에 등록 |
| Private key | 내 로컬 컴퓨터에 보관 |
Private key는 절대 공유하면 안 된다.
다운로드한 .pem 파일은 권한을 제한해야 한다.
chmod 400 my-key.pem
접속은 다음처럼 한다.
ssh -i my-key.pem ec2-user@<public-ip>
Ubuntu AMI라면 user가 ubuntu인 경우가 많다.
ssh -i my-key.pem ubuntu@<public-ip>
AMI마다 기본 username이 다를 수 있으므로 launch 후 연결 안내를 확인하는 것이 좋다.
Security Group
Security group은 EC2 instance 앞의 virtual firewall이다. Inbound와 outbound rule을 제어한다.
처음 SSH 접속을 위해 흔히 다음 inbound rule을 연다.
| Type | Port | Source |
|---|---|---|
| SSH | 22 | 내 IP |
중요한 것은 source를 0.0.0.0/0로 열지 않는 것이다.
이렇게 하면 전 세계 어디서든 SSH 접근 시도가 가능해진다.
좋은 설정은 내 현재 IP만 허용하는 것이다.
SSH 22 -> my-ip/32
웹 서버를 운영한다면 HTTP/HTTPS만 공개한다.
| Type | Port | Source |
|---|---|---|
| HTTP | 80 | 0.0.0.0/0 |
| HTTPS | 443 | 0.0.0.0/0 |
| SSH | 22 | my-ip/32 |
Security group은 stateful이다. Inbound request가 허용되면 그에 대한 response traffic은 자동으로 허용된다.
EBS Volume
EC2 instance의 root disk는 보통 EBS volume으로 제공된다. EBS는 EC2에 붙이는 block storage이다.
| 항목 | 설명 |
|---|---|
| Root volume | OS가 설치되는 기본 disk |
| Data volume | 추가로 붙이는 disk |
| Snapshot | EBS volume backup |
Instance를 terminate할 때 root volume이 같이 삭제될 수 있다. 중요한 데이터는 별도 EBS volume, S3, RDS 같은 persistent storage에 보관하는 것이 좋다.
서버에서 생성된 파일을 instance 안에만 두면 instance 삭제와 함께 사라질 수 있다.
SSH 접속 후 기본 설정
Instance에 접속했다면 먼저 package를 업데이트한다.
Amazon Linux 계열:
sudo dnf update -y
Ubuntu 계열:
sudo apt-get update
sudo apt-get upgrade -y
Node.js 서버를 올린다면 예를 들어 다음 흐름이 된다.
git clone <repo-url>
cd <repo>
npm install
npm run build
npm run start
실제 운영에서는 process manager를 사용한다.
npm install -g pm2
pm2 start dist/server.js --name app
pm2 save
Systemd service로 관리하는 방법도 있다.
웹 서버 열기
EC2에서 서버를 실행했는데 브라우저에서 접속이 안 된다면 보통 세 가지를 확인해야 한다.
- Application이 올바른 host와 port로 listen하고 있는가?
- Security group inbound rule이 열려 있는가?
- OS firewall이나 Nginx 설정이 막고 있지 않은가?
Node.js 서버라면 local only가 아니라 외부 접근 가능한 host로 listen해야 한다.
app.listen(3000, '0.0.0.0')
Security group에는 필요한 port를 열어야 한다.
| 서버 | Port |
|---|---|
| 개발용 Node 서버 | 3000 |
| HTTP | 80 |
| HTTPS | 443 |
운영에서는 보통 application port를 직접 공개하지 않고 Nginx를 앞에 둔다.
Browser -> Nginx : 80/443
Nginx -> App : localhost:3000
Elastic IP
기본 public IP는 instance를 stop/start하면 바뀔 수 있다. 고정 IP가 필요하면 Elastic IP를 사용할 수 있다.
다만 Elastic IP도 비용 정책을 확인해야 한다. 특히 할당만 해두고 사용하지 않는 Elastic IP는 비용이 발생할 수 있다.
고정 domain을 연결하려면 보통 다음 흐름이다.
Elastic IP -> EC2 instance
DNS A record -> Elastic IP
운영에서는 Load Balancer를 앞에 두고 DNS를 Load Balancer로 연결하는 구조도 많이 쓴다.
Instance 중지와 종료
EC2에서 stop과 terminate는 다르다.
| 동작 | 의미 |
|---|---|
| Stop | instance를 중지한다. 다시 시작할 수 있다. |
| Reboot | instance를 재부팅한다. |
| Terminate | instance를 삭제한다. 복구하기 어렵다. |
실습 후 비용을 막으려면 terminate가 필요할 수 있다. 다만 중요한 데이터가 instance 안에 있으면 먼저 백업해야 한다.
또한 EBS volume, Elastic IP, snapshot 같은 관련 리소스가 남아 있을 수 있으므로 함께 확인해야 한다.
초보자 체크리스트
EC2를 만들 때는 다음을 체크하면 실수를 줄일 수 있다.
Region이 맞는가?
Free Tier 대상인지 확인했는가?
Key pair private key를 안전하게 보관했는가?
Security group에서 SSH source를 내 IP로 제한했는가?
필요한 web port만 열었는가?
중요한 데이터는 EBS/S3/RDS에 분리했는가?
실습 후 terminate와 관련 리소스 정리를 했는가?
정리
EC2는 AWS에서 직접 server를 운영할 수 있게 해주는 기본 compute service이다. 처음 사용할 때는 다음 구조만 확실히 이해하면 된다.
AMI로 OS를 고른다.
Instance type으로 성능을 고른다.
Key pair로 SSH 접속을 준비한다.
Security group으로 traffic을 제한한다.
EBS volume에 disk가 붙는다.
필요 없으면 terminate해서 비용을 정리한다.
EC2는 자유도가 높은 만큼 운영 책임도 크다. 보안 업데이트, SSH 관리, disk 백업, process 관리, 비용 정리를 직접 신경 써야 한다.