
개요
클라우드 인프라는 단순한 서버 호스팅을 넘어 네트워킹, 아이덴티티, 스토리지, 관측성까지 포함하는 시스템 설계의 집합입니다. 안정성, 비용, 보안, 운영 편의성 사이의 균형을 이해하면 현실적인 아키텍처를 만들 수 있습니다. 아래에서는 핵심 개념, 주요 트레이드오프를 설명하고, Terraform을 사용한 실무 예제를 통해 적용 방법을 제시합니다.
핵심 개념(Stable Concepts)
클라우드 설계에서 장기적으로 변하지 않는 개념들:
- 영역과 가용영역(Region & Availability Zone): 지리적 분리 및 장애 도메인으로서의 역할. 복제와 데이터 주권 설계를 위해 고려.
- 네트워킹(VPC, 서브넷, 라우팅): 세분화된 트래픽 제어와 퍼블릭/프라이빗 분리, 보안 경계 설정.
- 아이덴티티와 액세스 관리(IAM): 최소 권한 원칙으로 권한 범위를 제한하고 감사 가능하게 유지.
- 인프라 코드(IaC): 선언적 구성(예: Terraform)으로 재현성, 검토, 자동화를 확보.
- 관측성(모니터링, 로깅, 추적): SLA 검증과 문제 탐지·대응을 위한 필수 요소.
- 관리형 서비스 vs 직접 운영: 데이터베이스, 쿠버네티스 등은 운영 부담과 제어 수준 간의 트레이드오프가 존재.
주요 트레이드오프
설계 결정을 내릴 때 흔히 만나는 트레이드오프들:
- 가용성 vs 비용: 다중 AZ/Region 복제는 가용성을 높이지만 비용과 운영 복잡도가 증가합니다. RTO/RPO 목표를 기준으로 필요한 수준을 정해야 합니다.
- 관리형 서비스 vs 자가관리: 관리형 서비스는 운영 난이도를 낮추지만 특정 동작이나 비용 제어에서 제약이 생깁니다. 규제·성능 특성에 따라 선택합니다.
- 일관성 vs 지연(latency): 지리적으로 분산된 시스템은 응답성 관점에서 로컬 복제가 유리하지만 데이터 일관성 확보 비용이 발생합니다.
- 안전성(immutable 인프라) vs 운영 유연성: 불변 인프라 패턴은 예측 가능성을 제공하지만 긴급 수정이 필요한 경우 대응 패턴(블루/그린, 롤링 등)을 준비해야 합니다.
- 단일 클라우드 vs 멀티 클라우드: 공급자 종속성(lock-in)을 줄이려면 멀티 클라우드 전략을 고려하지만, 네트워크·운영 표준화와 비용이 크게 증가합니다.
실무 예제: Terraform으로 기본 클라우드 인프라 구성
아래 예제는 이상적인 최소 구성으로, VPC(또는 VNet) 내에 퍼블릭/프라이빗 서브넷을 만들고, 두 개의 가용영역에 걸쳐 애플리케이션 인스턴스를 배포하며, 관리형 데이터베이스를 프라이빗 서브넷에 둔 패턴을 보여줍니다. 이 패턴은 가용성과 보안의 균형을 고려한 출발점입니다.
다음 코드는 교육 목적의 간단한 Terraform 구조입니다(프로바이더 설정, 변수, 상태 백엔드 등은 실제 환경에 맞춰 추가하세요).
provider "aws" {
region = "us-west-2"
}
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = { Name = "example-vpc" }
}
resource "aws_subnet" "private_a" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "us-west-2a"
tags = { Name = "private-a" }
}
resource "aws_subnet" "private_b" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.2.0/24"
availability_zone = "us-west-2b"
tags = { Name = "private-b" }
}
resource "aws_subnet" "public_a" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.101.0/24"
availability_zone = "us-west-2a"
map_public_ip_on_launch = true
tags = { Name = "public-a" }
}
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main.id
}
# 간단한 보안 그룹: HTTP만 허용 (예시)
resource "aws_security_group" "app_sg" {
name = "app-sg"
vpc_id = aws_vpc.main.id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
# 간단한 Autoscaling을 위한 Launch Template / ASG 패턴은 실제로 추가 구현 필요
# 관리형 RDS(프라이빗 서브넷에 배치) 예시
resource "aws_db_subnet_group" "db_subnets" {
name = "example-db-subnets"
subnet_ids = [aws_subnet.private_a.id, aws_subnet.private_b.id]
}
resource "aws_db_instance" "app_db" {
engine = "postgres"
instance_class = "db.t3.micro"
allocated_storage = 20
username = "dbuser"
password = "change_me"
db_subnet_group_name = aws_db_subnet_group.db_subnets.name
skip_final_snapshot = true
publicly_accessible = false
}
이 예제에서 보듯이:
- 애플리케이션은 퍼블릭 서브넷의 로드밸런서(또는 NAT)를 통해 외부와 통신하고, 실제 인스턴스와 데이터베이스는 프라이빗 서브넷에 두어 공격 표면을 줄입니다.
- 두 개 이상의 가용영역에 리소스를 분산시켜 AZ 수준 장애를 견디게 합니다.
- 비용을 절감하려면 인스턴스 클래스 및 레플리카 수, 자동 스케일링 정책을 비즈니스 요구에 맞춰 조정해야 합니다.
운영 고려사항
설계 이후 운영 단계에서 반드시 고려해야 할 항목들:
- 자동화와 CI/CD: 인프라 변경은 코드 리뷰와 자동화 파이프라인을 통해 배포해야 합니다. 롤백 전략을 준비하세요.
- 비용 모니터링: 리소스 태깅, 예산 알림, 예약 인스턴스/절약 플랜 등의 비용 제어 수단을 도입하세요.
- 보안·감사: IAM 정책, 네트워크 ACL, 보안 그룹을 최소 권한 원칙으로 설계하고 로깅(Audit Trail)을 활성화하세요.
- 테스트와 복구: 장애 시나리오를 정기적으로 연습하고, 백업과 복구 절차가 운영 문서로 정리되어 있어야 합니다.
- 관측성: 메트릭, 로그, 트레이스가 서로 연결되어 문제의 근본 원인을 빠르게 찾을 수 있어야 합니다.
결론
클라우드 인프라는 단순한 기술이 아니라 조직의 요구에 맞춘 설계 철학입니다. 핵심 개념을 이해하고, 중요한 트레이드오프(가용성·비용·운영성)를 명확히 하며, 인프라 코드를 통해 자동화·재현성을 확보하면 현실적인 아키텍처를 만들 수 있습니다. 실무 예제는 출발점일 뿐이며, 실제 환경에서는 보안 요구사항, 규제, 성능 요구를 반영해 세부 설계를 조정해야 합니다.