

my-vpc
│
├── IGW (인터넷)
├── Public Subnet (외부 접속 가능 구역)
│ └── 여기에 EC2 배치 예정
└── Private Subnet (외부 접속 불가 구역)
단, 실무적으론 EC2를 Public Subnet이 아닌 Private Subnet에 넣어야 함!
외부 인터넷에서 EC2에 직접 접근하는 것이 보안상 좋지 않다.

| 리소스 | 자동 생성된 이름 | 설명 |
|---|---|---|
| VPC | my-vpc | 나만의 네트워크 |
| IGW | my-igw | 인터넷 정문 (자동 연결됨) |
| Public Subnet | my-subnet-public1-... | EC2 배치할 곳 |
| Private Subnet | my-subnet-private1-... | RDS 배치 예정 (Chapter 3) |
| Route Table | my-rtb-public | Public용 (IGW 경로 포함) |
| Route Table | my-rtb-private1-... | Private용 |
0.0.0.0/0 → IGW 경로가 있음private 서브넷 내의 서버에서 외부 인터넷으로부터 무언가를 가져와야 할때 사용
일방통행: EC2로부터 외부 인터넷으로 접근하는 것은 되지만, 인터넷에서 EC2로 뭔가 요청하는 것은 불가능

직접 Public Subnet에 NAT를 구성할 필요 없이, Regional NAT Gateway를 사용하면 됨
VPC 내부에서 외부 퍼블릭 인터넷을 거치지 않고, AWS 서비스(S3, DynamoDB 등)나 타사 서비스에 안전하게 비공개로 연결할 수 있는 가상 네트워크 장치

.pem 방식)
# 터미널에서 실행 (Mac/Linux/Windows Git Bash)
chmod 400 ~/{pem키경로}
# .pem 파일을 터미널에 드래그하면 경로가 자동 입력됨!
ssh -i [.pem 파일 드래그] ec2-user@{ec2의 public ip 주소}
# 처음 접속 시 fingerprint 확인 → yes 입력

현재 아무것도 없음
즉 이 EC2는 아직 어떤 AWS 서비스에도 접근할 수 없다

# EC2에 SSH 접속한 상태에서 실행
# 1. 웹 디렉토리 생성
cd ~
mkdir -p web && cd web
# 2. Python 서버 스크립트 생성
cat > server.py << 'PYEOF'
#!/usr/bin/env python3
from http.server import HTTPServer, BaseHTTPRequestHandler
from datetime import datetime
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
html = f'''<!DOCTYPE html>
<html>
<head>
<title>My First EC2</title>
<meta charset="utf-8">
</head>
<body>
<h1>Hello from EC2!</h1>
<p>서버 시간: {now}</p>
</body>
</html>'''
self.send_response(200)
self.send_header('Content-Type', 'text/html; charset=utf-8')
self.end_headers()
self.wfile.write(html.encode())
print('서버 시작: <http://0.0.0.0:80>')
HTTPServer(('', 80), MyHandler).serve_forever()
PYEOF
# 3. 스크립트 확인
cat server.py

기본 인바운드 규칙으론 HTTP 접속(80 포트)이 불가능하다. 따라서 보안그룹의 인바운드 규칙을 추가해주어야 한다.


타임아웃 -> 보안그룹 문제 가능성을 염두하자!
# 메모리 사용량
free -h
# 디스크 사용량
df -h
# CPU/메모리 실시간 모니터링
top
# q로 종료