📄 2025.12.05 (Day 30) [AWS 컴퓨팅 서비스: 서버, 서버리스, 컨테이너]
1. 핵심 개념 정리 (Concepts & Theory)
| # | 핵심 개념 | 간결한 설명 |
|---|---|---|
| 1 | EC2 (Elastic Compute Cloud) | AWS 클라우드에서 제공하는 가상 서버 입니다. 운영체제(OS), CPU, 메모리, 스토리지 크기 등을 사용자 요구에 맞게 선택하여 구축 및 운영할 수 있습니다. 컴퓨팅 파워를 유연하게 확장/축소 할 수 있습니다. |
| 2 | Amazon EBS (Elastic Block Store) | EC2 인스턴스에 연결하여 사용하는 블록 레벨의 영구 스토리지 입니다. EC2 인스턴스와 별도로 독립적인 수명 주기를 가지며, 스냅샷 기능을 통해 데이터 백업 및 복구가 용이합니다. SSD/HDD 등 다양한 유형 선택이 가능합니다. |
| 3 | ELB (Elastic Load Balancing) | 여러 EC2 인스턴스 또는 컨테이너/Lambda에 걸쳐 들어오는 트래픽을 자동으로 분산 하는 서비스입니다. Application Load Balancer (ALB), Network Load Balancer (NLB), Gateway Load Balancer (GLB) 가 있습니다. |
| 4 | EC2 오토스케일링 (Auto Scaling) | 애플리케이션의 트래픽 변화에 따라 EC2 인스턴스의 수를 자동으로 조정 하는 기능입니다. 확장(Scale Out) 및 축소(Scale In) 규칙을 정의할 수 있으며, 최소/최대 인스턴스 수를 설정합니다. |
| 5 | 서버리스 (Serverless) 컴퓨팅 | 서버를 직접 프로비저닝, 관리하거나 유지할 필요 없이 코드를 실행할 수 있도록 하는 클라우드 컴퓨팅 모델입니다. 개발자는 코드를 작성하고 업로드만 하면 됩니다. 사용량에 따라 자동으로 확장 되고, 사용한 만큼만 비용을 지불합니다. |
| 6 | AWS Lambda | AWS의 대표적인 서버리스 FaaS(Function as a Service) 입니다. 이벤트에 응답하여 코드를 실행하며, 서버 관리가 필요 없습니다. 실행 시간에 비례하여 비용이 부과 됩니다. 수평 확장성이 매우 높습니다. |
| 7 | 컨테이너 (Container) | 코드, 런타임, 시스템 도구, 라이브러리 등 애플리케이션 실행에 필요한 모든 것을 포함 하는 경량의 독립적인 실행 단위입니다. OS 커널을 공유하여 가상 머신(VM)보다 가볍고 빠르게 배포됩니다. Docker가 대표적입니다. |
| 8 | AWS ECS (Elastic Container Service) | AWS에서 컨테이너화된 애플리케이션을 배포, 관리 및 확장 하는 완전 관리형 컨테이너 오케스트레이션 서비스입니다. EC2 기반 또는 서버리스인 AWS Fargate 기반으로 컨테이너를 실행할 수 있습니다. |
2. 실습 코드 & 응용 (Practice & Code Walkthrough)
(A) EC2 인스턴스 생성 및 접근 제어
EC2 인스턴스 생성 (AWS CLI):
# 1. 키 페어 생성 (SSH 접근용)
aws ec2 create-key-pair \
--key-name MyKeyPair \
--query 'KeyMaterial' \
--output text > MyKeyPair.pem
chmod 400 MyKeyPair.pem
# 2. 보안 그룹 생성 (SSH, HTTP 허용)
aws ec2 create-security-group \
--group-name WebAccessSG \
--description "Allow SSH and HTTP access"
# SSH 인바운드 규칙 추가 (특정 IP에서만)
aws ec2 authorize-security-group-ingress \
--group-name WebAccessSG \
--protocol tcp \
--port 22 \
--cidr 203.0.113.0/32 # 본인의 IP로 변경
# HTTP 인바운드 규칙 추가 (전체 인터넷에서)
aws ec2 authorize-security-group-ingress \
--group-name WebAccessSG \
--protocol tcp \
--port 80 \
--cidr 0.0.0.0/0
# 3. 인스턴스 실행 (Public Subnet에)
aws ec2 run-instances \
--image-id ami-0abcdef1234567890 \
--count 1 \
--instance-type t2.micro \
--key-name MyKeyPair \
--security-group-ids sg-0securitygroupid \
--subnet-id subnet-0publicsubnetid \
--associate-public-ip-address # Public IP 자동 할당
EC2 외부 접근 (SSH):
# Public IP 주소 또는 Public DNS 이름 확인 후 접속
ssh -i "MyKeyPair.pem" ec2-user@<EC2_Public_IP>
(B) Amazon EBS 스냅샷 및 볼륨 생성
EBS 볼륨 생성 및 연결:
# 1. 새 EBS 볼륨 생성 (ap-northeast-2a에 10GiB gp3)
aws ec2 create-volume \
--availability-zone ap-northeast-2a \
--size 10 \
--volume-type gp3
# 2. 생성된 볼륨을 EC2 인스턴스에 연결
aws ec2 attach-volume \
--volume-id vol-0volumeid \
--instance-id i-0instanceid \
--device /dev/sdf
EBS 스냅샷 (백업) 생성:
# 특정 볼륨의 스냅샷 생성
aws ec2 create-snapshot \
--volume-id vol-0volumeid \
--description "Daily backup of application data"
# 스냅샷으로 새 볼륨 생성 (복원)
aws ec2 create-volume \
--snapshot-id snap-0snapshotid \
--availability-zone ap-northeast-2c # 다른 AZ로 복원하여 재해 복구 준비
(C) Elastic Load Balancing (ALB) 및 EC2 Auto Scaling
ELB (ALB) 생성 흐름:
- 대상 그룹(Target Group) 생성: 트래픽을 받을 EC2 인스턴스들의 포트, 프로토콜 정의 (Health Check 설정 포함).
- EC2 인스턴스를 대상 그룹에 등록.
- 로드 밸런서(ALB) 생성: Public Subnet에 배포, 리스너(Listener, 80/443) 구성, 대상 그룹 연결.
- ALB DNS 이름을 통해 서비스 접근.
EC2 Auto Scaling Group 설정 흐름:
- 시작 템플릿(Launch Template) 생성: EC2 인스턴스 구성 정보(AMI, 인스턴스 유형, 키 페어, 보안 그룹 등) 정의.
- 오토스케일링 그룹(ASG) 생성:
- 시작 템플릿 지정.
- 최소/최대/희망 용량 설정.
- Multi-AZ의 서브넷 지정.
- 연결할 ELB 대상 그룹 지정.
- 조정 정책(Scaling Policy) 설정: CPU 사용률 60% 이상 시 확장, 30% 이하 시 축소.
(D) AWS Lambda 함수 생성 및 실행
Lambda 함수 생성 (Node.js 예시):
// index.js
exports.handler = async (event) => {
// 1. 이벤트 데이터 처리 (예: API Gateway 요청)
const name = event.queryStringParameters && event.queryStringParameters.name ? event.queryStringParameters.name : 'World';
// 2. 비즈니스 로직
const message = `Hello, ${name}! This is a Serverless function.`;
// 3. 응답 반환
const response = {
statusCode: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ message: message }),
};
return response;
};
Lambda 함수 생성 (AWS CLI):
# 1. Lambda 실행 역할 생성 (S3 접근 권한 등 최소 권한 부여)
aws iam create-role --role-name lambda-basic-execution-role ...
# 2. 코드 패키징 (ZIP)
zip function.zip index.js
# 3. 함수 생성
aws lambda create-function \
--function-name HelloWorldLambda \
--runtime nodejs18.x \
--role arn:aws:iam::123456789012:role/lambda-basic-execution-role \
--handler index.handler \
--zip-file fileb://function.zip \
--timeout 30 \
--memory-size 128
# 4. 함수 호출 (테스트)
aws lambda invoke \
--function-name HelloWorldLambda \
--cli-binary-format raw-in-base64-out \
--payload '{"queryStringParameters": {"name": "AWS"}}' \
output.txt
(E) AWS ECS (Fargate) 서비스 배포
Fargate 기반 ECS 서비스 배포 흐름:
- Docker 이미지 생성 및 ECR(Elastic Container Registry)에 푸시.
- ECS 클러스터 생성.
- 작업 정의(Task Definition) 생성: 실행할 컨테이너 이미지, CPU/메모리, 포트 매핑, 환경 변수 등 정의. (Fargate: 네트워크 모드 aws-vpc)
- 서비스 생성:
- 작업 정의 지정.
- 실행할 작업 수, ELB 연결 정보 지정.
- 서브넷(Private Subnet 권장) 및 보안 그룹 지정.
- Auto Scaling 정책 설정 (CPU, 메모리 사용률 기반).
3. 실무/보안 관점 분석 (Insight & Scenario Mapping)
| 분야 | 적용 시나리오 |
|---|---|
| 컴퓨팅 유형 선택 | EC2 (VM): 장기적으로 꾸준한 부하, OS 레벨의 완전한 제어(GPU 등), 레거시 애플리케이션, 온프레미스 마이그레이션 시 적합. Lambda (서버리스): 짧은 실행 시간, 간헐적 트래픽, 이벤트 기반 데이터 처리(이미지 리사이징, 로그 분석), API 백엔드에 적합. ECS/Fargate (컨테이너): 마이크로서비스, 일관된 배포 환경, 빠른 배포/롤백, CI/CD에 적합. 운영 부담은 Lambda와 EC2의 중간. |
| 확장성 및 고가용성 | EC2: Auto Scaling Group 과 ELB 를 사용하여 고가용성 및 수평 확장(Scale-out) 구현. 최소 2개 이상의 AZ에 분산 배치. Lambda: 기본적으로 무제한에 가깝게 자동 수평 확장 됩니다. 동시 실행 한도(기본 1,000개) 관리가 중요합니다. ECS/Fargate: ECS Service Auto Scaling 을 사용하여 컨테이너 인스턴스(Task) 수를 조정. |
| 보안 강화 전략 | EC2: 보안 그룹 으로 인스턴스 방화벽, IAM Role 을 인스턴스에 할당하여 AWS API 접근 권한 제어. EBS 볼륨 암호화 를 통해 미사용 데이터 보호. 정기적인 OS 및 애플리케이션 패치 실행. Lambda: 함수에 할당된 실행 역할(IAM Role) 에 최소 권한 원칙 적용. 민감 정보는 AWS Secrets Manager 를 통해 관리. ECS/Fargate: 작업 실행 역할 (컨테이너 인스턴스 역할)과 작업 역할 (애플리케이션 역할)을 분리하여 최소 권한 적용. |
| 비용 최적화 | EC2: Auto Scaling 을 통한 인스턴스 수 조절로 유휴 리소스 비용 절감. Reserved Instance(RI) 또는 Savings Plan 을 통한 장기 사용 할인. Spot Instance 를 통한 비핵심 워크로드 비용 절감. Lambda: 실행 횟수 + 실행 시간 (ms 단위) 기반 과금. 유휴 비용 0. 짧게 실행될수록 저렴. ECS/Fargate: Fargate 사용 시 EC2 인스턴스 관리 비용 없이 컨테이너의 CPU/메모리 사용량 에 대해서만 과금. |
| 모니터링 & 로깅 | EC2: CloudWatch 로 CPU, 네트워크, 디스크 I/O 등 기본 메트릭 모니터링. CloudWatch Agent 로 OS 레벨 지표(메모리, 디스크 사용률) 수집. Lambda: CloudWatch Logs 에 함수 실행 로그 및 성능 지표 자동 저장. X-Ray 를 통해 분산 추적 활성화. ECS/Fargate: 컨테이너 로그를 CloudWatch Logs 로 통합. |
4. 개인 인사이트 및 다음 단계 (Reflection & Next Steps)
배운 점/느낀 점:
- 컴퓨팅의 패러다임 변화: 전통적인 서버 관리(EC2)부터 인프라 관리 부담을 완전히 덜어낸 서버리스(Lambda), 그리고 그 중간 단계인 컨테이너(ECS/Fargate)까지, AWS는 모든 컴퓨팅 요구사항을 만족시킬 수 있는 다양한 옵션을 제공함을 이해했습니다.
- 책임 공유 모델의 이해: 특히 EC2와 Lambda에서 AWS와 사용자 간의 책임 영역(OS 패치, 런타임 관리 등)이 명확히 구분되는 것을 파악했습니다. 서버리스는 보안 관리 부담을 크게 줄여줍니다.
- Auto Scaling의 중요성: 고가용성, 비용 최적화, 성능 유지라는 세 마리 토끼를 잡기 위해 Auto Scaling과 ELB의 연동이 필수적임을 깨달았습니다.
- EBS의 영속성: EC2와 EBS의 생명 주기가 분리된다는 점을 통해 인스턴스가 종료되어도 데이터가 보존되는 원리를 이해했습니다. 스냅샷을 통한 백업 및 재해 복구 시나리오가 실질적인 가치를 제공합니다.
심화 방향:
- EC2 & Auto Scaling 실습 심화: 시작 템플릿에 사용자 데이터(User Data)를 사용하여 초기 배포 스크립트 실행 실습. 다양한 조정 정책(Step Scaling, Target Tracking) 설정 및 부하 테스트.
- Lambda 함수 심화: Lambda를 VPC 내 Private Subnet에 배포하여 RDS 같은 내부 리소스에 접근하는 실습. API Gateway와 Lambda 연동하여 Restful API 백엔드 구성.
- ECS/Fargate 실습: Dockerfile 작성부터 ECR 푸시, Task Definition, Service 생성까지 CI/CD 파이프라인(CodePipeline, CodeBuild)과 연동하여 자동 배포 환경 구축.
- 컴퓨팅 비용 비교 분석: 동일한 워크로드(예: 웹 서비스)를 EC2, Lambda, Fargate로 각각 구성했을 때의 성능, 관리 복잡도, 최종 비용을 비교 분석하는 프로젝트 수행.
5. 추가 참고사항 (Quick Reference)
EC2 인스턴스 유형 (Family)
| Family | 용도 | 예시 |
|---|---|---|
| T | 범용 버스터블(Burstable) | T2, T3, T4g |
| M | 범용 (균형 잡힌 자원) | M5, M6g |
| C | 컴퓨팅 최적화 (CPU 집중) | C5, C6g |
| R | 메모리 최적화 (RAM 집중) | R5, R6g |
| P/G | 가속 컴퓨팅 (GPU) | P3, P4, G4 |
| I | 스토리지 최적화 (NVMe SSD) | I3, I4i |
ELB 유형 비교
| 유형 | 계층 | 주요 특징 | 사용 사례 |
|---|---|---|---|
| ALB | L7 (HTTP/HTTPS) | 경로/호스트 기반 라우팅, 컨테이너, Lambda 지원 | 마이크로서비스, 웹 애플리케이션 |
| NLB | L4 (TCP/UDP/TLS) | 초고성능, 고정 IP 주소, 낮은 지연시간 | 극단적인 성능 요구사항, 게임, IoT |
| GLB | L3 (IP) | 서드파티 가상 어플라이언스 체이닝 | 방화벽, 침입 탐지 시스템 (IDS) |
| CLB | L4/L7 혼합 | 레거시(새 워크로드에는 권장하지 않음) | 이전 버전과의 호환성 |
Lambda 제한 사항 (기본값)
| 항목 | 기본 제한 |
|---|---|
| 메모리 크기 | 128MB ~ 10,240MB |
| 실행 시간(Timeout) | 최대 15분 (900초) |
| 동시 실행 수 | 리전당 1,000개 |
| 배포 패키지 크기 | 50MB (압축) |
| 환경 변수 크기 | 4KB |
컨테이너 서비스 비교
| 서비스 | 기반 환경 | 특징 | 적합한 사용 사례 |
|---|---|---|---|
| ECS (EC2) | 사용자 관리형 EC2 | 서버와 컨테이너를 모두 제어, 더 많은 사용자 정의 | 저렴한 비용(Spot), OS 레벨 접근 필요 |
| ECS (Fargate) | AWS 관리형 서버리스 | 서버 관리 불필요, 컨테이너에 집중 | 운영 복잡도 최소화, 유연한 확장성 |
| EKS | 사용자 관리형/AWS 관리형 | Kubernetes 기반, 표준 컨테이너 오케스트레이션 | Kubernetes 전문가, 멀티 클라우드 전략 |
| App Runner | 완전 관리형 | 소스 코드 또는 컨테이너 이미지에서 바로 웹 앱 배포 | 개발 속도 우선, 간단한 웹 앱/API |