Spring 심화 (AWS 실습)

KimGwangmin·2026년 9월 28일

AWS 홈페이지

사전 준비

  • 리전 설정: 서울
  • 예산 설정: 실습 과정 중 실수를 하더라도 예산 이상의 요금이 나오지 않게 설정

VPC 생성

  • 디폴트로 생성된 VPC는 제거 (기본 설정이 실무용으로 적합하지 않음)

생성할 VPC 구조

my-vpc
│
├── IGW (인터넷)
├── Public Subnet (외부 접속 가능 구역)
│   └── 여기에 EC2 배치 예정
└── Private Subnet (외부 접속 불가 구역)

단, 실무적으론 EC2를 Public Subnet이 아닌 Private Subnet에 넣어야 함!
외부 인터넷에서 EC2에 직접 접근하는 것이 보안상 좋지 않다.

생성 결과

리소스자동 생성된 이름설명
VPCmy-vpc나만의 네트워크
IGWmy-igw인터넷 정문 (자동 연결됨)
Public Subnetmy-subnet-public1-...EC2 배치할 곳
Private Subnetmy-subnet-private1-...RDS 배치 예정 (Chapter 3)
Route Tablemy-rtb-publicPublic용 (IGW 경로 포함)
Route Tablemy-rtb-private1-...Private용
  • IGW가 VPC에 연결됨
  • Public Subnet의 Route Table에 0.0.0.0/0 → IGW 경로가 있음
  • Private Subnet은 IGW 경로가 없어서 외부 접근 불가

NAT 게이트웨이

private 서브넷 내의 서버에서 외부 인터넷으로부터 무언가를 가져와야 할때 사용
일방통행: EC2로부터 외부 인터넷으로 접근하는 것은 되지만, 인터넷에서 EC2로 뭔가 요청하는 것은 불가능

  • Zonal NAT Gateway
    • 기존에 있던 방식
    • AZ마다 설정해주어야 함
  • Regional NAT Gateway
    • 최신 버전
    • Region 전체를 커버하는 NAT Gateway
    • 하나만 만들면 별다른 설정 없이도 AWS가 AZ별로 알아서 확장해줌

직접 Public Subnet에 NAT를 구성할 필요 없이, Regional NAT Gateway를 사용하면 됨

VPC 엔드포인트

VPC 내부에서 외부 퍼블릭 인터넷을 거치지 않고, AWS 서비스(S3, DynamoDB 등)나 타사 서비스에 안전하게 비공개로 연결할 수 있는 가상 네트워크 장치

  • 엔드포인트가 없다면 VPC 내부 서버가 S3(파일 저장소)에 접근할 때, 일단 인터넷(NAT Gateway)으로 나갔다가 다시 AWS의 S3 서버로 찾아가야 함
  • 엔드포인트가 있다면, 인터넷을 거치지 않고 AWS 내부 네트워크망을 통해 S3로 직접 연결됨
  • 보안 이점(내부망)
  • 속도 빠름
  • 데이터 전송 비용 무료

EC2 생성

  • Amazon Linux AMI(이미지)
  • ARM 아키텍쳐
  • t4g.small
  • 키 페어 생성(RSA, .pem 방식)
    • 키 유실 주의
  • 퍼블릭 서브넷 선택(그래야 접속 가능)
  • Public IP 자동 할당

EC2 접속

  • 키 페어 파일에 보안 권한 설정
  • ssh 접속
# 터미널에서 실행 (Mac/Linux/Windows Git Bash)
chmod 400 ~/{pem키경로}

# .pem 파일을 터미널에 드래그하면 경로가 자동 입력됨!
ssh -i [.pem 파일 드래그] ec2-user@{ec2의 public ip 주소}

# 처음 접속 시 fingerprint 확인 → yes 입력

IAM 역할 확인

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

간단한 HTTP 서버 코드 실행

# 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로 종료

0개의 댓글