Security Group
이 코드는 EC2의 보안 그룹(Security Group)이라는 가상 방화벽을 생성하고 설정하는 스크립트. 이 코드의 주요 역할은 EC2 인스턴스(서버)에 대한 네트워크 트래픽을 제어하여, 허용된 연결만 주고받을 수 있도록 보안을 강화하는 것.
# 백엔드를 위한 보안 그룹 (방화벽 규칙)
# 보안 그룹은 EC2 인스턴스에 대한 인바운드/아웃바운드 트래픽을 제어합니다
resource "aws_security_group" "backend_sg" {
# 보안 그룹 이름 - 프로젝트명-환경-sg 형식
name = "${var.project_name}-${var.environment}-sg"
# 보안 그룹 설명
description = "Security group for ${var.project_name} ${var.environment} environment"
# 이 보안 그룹이 속할 VPC ID
vpc_id = var.vpc_id
# ===== 인바운드 규칙 (외부 → EC2) =====
# SSH 접속 규칙 (포트 22)
# 주의: 프로덕션에서는 특정 IP만 허용하도록 설정 필요
ingress {
description = "SSH from allowed IPs"
from_port = 22 # 시작 포트
to_port = 22 # 종료 포트 (22-22 = 포트 22만)
protocol = "tcp" # TCP 프로토콜
cidr_blocks = var.ssh_allowed_ips # 허용할 IP 주소 목록
}
# HTTP 접속 규칙 (포트 80)
# 모든 IP에서 접속 가능 (웹 서비스)
ingress {
description = "HTTP from anywhere"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # 모든 IP 허용
}
# HTTPS 접속 규칙 (포트 443)
# SSL/TLS 암호화된 웹 트래픽
ingress {
description = "HTTPS from anywhere"
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # 모든 IP 허용
}
# ===== 아웃바운드 규칙 (EC2 → 외부) =====
# 모든 아웃바운드 트래픽 허용
# EC2가 외부 인터넷에 접속할 수 있도록 허용 (apt update, docker pull 등)
egress {
description = "Allow all outbound traffic"
from_port = 0 # 모든 포트
to_port = 0 # 모든 포트
protocol = "-1" # 모든 프로토콜
cidr_blocks = ["0.0.0.0/0"] # 모든 IP로
}
# 리소스 태그
tags = {
Name = "${var.project_name}-${var.environment}-sg" # 리소스 이름
Environment = var.environment # 환경 구분
Project = var.project_name # 프로젝트명
ManagedBy = "Terraform" # Terraform으로 관리됨
}
}
- ec2의 인바운드, 아웃바운드 규칙을 정의한다.
- 인바운드, 아웃바운드 규칙은 각각 서버로 들어오는 규칙, 서버에서 나가는 규칙을 정의한다.
- 위 코드에서는 ssh 접속을 위한 22번 포트의 허용 IP는 var에 정의되어 있다.
- 보통 ssh 접속은 내 로컬에서 하기에 내 로컬 ip만 열어두는 식으로 인바운드 규칙을 정할 수 있다.
- 아웃바운드에서는 모든 포트가 열려있는데, 보통은 백엔드 서버가 통신하는 api만 열어 놓는 식으로 해야 한다.