AWS 기본 구성하기 – 가난한 개발자의 AWS Free tier 최대활용해서 웹서비스 구축 도전기 – 1

가난한 개발자에게 AWS Free Tier는 그야말로 축복 같은 존재입니다. 무료로 클라우드 인프라를 경험하고, 실제로 서비스까지 구축해볼 수 있는 기회죠. 하지만, 이 Free Tier의 ‘뽕’을 제대로 뽑아보겠다는 마음으로 시작하면 예상치 못한 난관이 곳곳에 도사리고 있습니다.

AWS는 웹서비스를 쉽게 구축할 수 있는 다양한 옵션을 제공합니다. 그중 Lightsail은 단순한 워드프레스 블로그나 포트폴리오 사이트를 올리기에 적합합니다. 그러나 확장성과 성능 측면에서 한계가 명확하죠. 서비스가 성장하며 트래픽이 늘어날수록 Lightsail은 개발자의 발목을 잡게 됩니다.

다음으로 떠오르는 선택지는 AWS의 대표 서비스인 **EC2(Elastic Compute Cloud)**입니다. EC2는 웹 서버, 애플리케이션 코드, 데이터베이스(DB), 스토리지 등을 자유롭게 구성할 수 있는 강력한 도구입니다. 그러나 Free Tier의 t2.micro 인스턴스(1 vCPU, 1GB RAM) 하나로 웹 서버와 DB를 함께 돌리는 건 상당히 도전적인 일입니다. 1GB의 메모리는 웹서버와 DB의 동시 실행을 버티기에는 턱없이 부족하죠.

“그럼 여러 개의 Free Tier EC2 인스턴스를 만들면 되지 않을까?”

물론 가능합니다. 하지만 AWS는 단순히 ‘무료로 서버 여러 대를 돌려보는 곳’이 아닌, 확장성과 유연성을 고려한 클라우드 인프라 설계를 위한 서비스입니다. 우리는 ‘최소한의 비용으로 최대한 AWS의 강점을 활용할 수 있는 구조’를 고민해야 합니다.


1. WordPress 구축을 위한 AWS Free Tier 활용 전략

이 글에서는 AWS Free Tier를 최대한 활용하여 WordPress를 구축한 경험을 공유하려 합니다. WordPress를 설치하고 운영하기 위해서는 다음과 같은 서비스가 필요합니다.

(1) WordPress 구축에 필요한 주요 구성 요소

  • Nginx – 웹 서버
  • PHP – WordPress 실행 환경
  • WordPress – 콘텐츠 관리 시스템(CMS)
  • MariaDB – 데이터베이스
  • Docker를 설치하여 운영 환경을 구축할 예정

이러한 서비스를 실행하기 위해 AWS에서 제공하는 Free Tier 리소스를 최대한 활용했습니다.

(2) AWS Free Tier에서 활용한 서비스

서비스 이름역할Free Tier 제공량
EC2웹 서버(Nginx, PHP, WordPress)t3.micro 750시간 (Ubuntu 24.04.1 LTS)
RDS데이터베이스 (MySQL)db.t3.micro 750시간
S3정적 파일 저장5GB 저장소
CloudFront콘텐츠 전송 최적화50GB 데이터 전송 / 200만 요청
Route 53도메인 관리❌ Free Tier 없음
ACMSSL 인증서 발급✅ CloudFront와 함께 사용 시 무료

💡 Route 53은 Free Tier가 제공되지 않지만, 도메인 등록과 DNS 관리가 필요하기 때문에 추가 비용이 발생할 수 있습니다.

  • Route53 기본 호스팅존 : $0.50/월
  • Route53 쿼리 요청 비용: $0.40~0.60/100만 쿼리

Route53 가격은 위 처럼 상당히 저렴합니다.(Route53 가격 확인하기 🔗) 쿼리가 얼마나 많아질지는 모르겠지만 초기 웹서비스 구축 단계에서는 상당히 저렴할 것으로 생각됩니다.


2. VPC, EC2 그리고 RDS 시작하기

그렇다면, 어떻게 설계를 하지? 웹서비스를 구축할 때 가장 먼저 고민해야 할 부분은 네트워크 설계입니다. 특히, 보안과 확장성을 고려한 VPC(가상 사설 클라우드) 구성이 중요합니다.

(1) VPC 및 Subnet 구성

먼저, VPC 내부의 Subnet을 어떻게 나눌지 고민했습니다.

  • EC2(Nginx Web Server)Public Subnet에 배치
  • RDS(MariaDB)Private Subnet에 배치

여기서 중요한 점은 웹 서버(EC2)는 인터넷과 연결되어야 하지만, DB(RDS)는 외부에서 직접 접근할 필요가 없다는 것입니다.

(2) Internet Gateway 설정

웹 서버는 인터넷과 통신해야 하므로, Public Subnet을 **Internet Gateway(IGW)**와 연결합니다. 반면, RDS가 위치할 Private Subnet은 외부 네트워크와 직접 연결되지 않도록 구성합니다.

(3) EC2와 RDS 간 통신

웹 서버(Nginx)와 데이터베이스(MariaDB)가 정상적으로 통신할 수 있도록 설정해야 합니다. 이를 위해:

  • EC2와 RDS를 같은 Route Table에 연결
  • 두 인스턴스에 같은 보안 그룹(Security Group) 적용
  • EC2의 Shell을 통해서만 RDS에 접근 가능하도록 설정

이렇게 하면 외부에서는 직접 RDS에 접근할 수 없고, 오직 EC2를 통해서만 데이터베이스에 연결할 수 있는 구조가 됩니다. 즉, 웹 서버가 해킹당해도 DB 자체가 바로 노출되지 않아 보안성을 확보할 수 있습니다.


3. EC2 Free Tier에서 Docker 설치하기

(1) EC2 Free Tier에서 Docker, 과연 가능할까?

다음 단계로 Docker를 활용해 웹 서비스를 구성해보았습니다. 하지만 고민이 하나 있었습니다.

과연 EC2 Free Tier(t2.micro)에서 Docker가 원활하게 실행될 수 있을까?

t2.micro 인스턴스는 1 vCPU, 1GB RAM을 제공하는 가장 기본적인 무료 인스턴스입니다. 여기서 Docker를 사용해 Nginx와 WordPress를 컨테이너로 운영하려고 했습니다. 하지만 사양을 고려했을 때 몇 가지 문제점이 예상되었습니다.

  • 메모리 부족: 1GB RAM은 WordPress와 Nginx 컨테이너를 실행하기에 충분하지 않을 가능성이 높음.
  • 응답 지연: 트래픽 증가 시 메모리 부족으로 인해 속도가 느려지고, 컨테이너가 비정상적으로 종료될 가능성 있음.
  • DB 부담 감소: RDS(MariaDB)를 사용해 DB를 EC2에서 분리했지만, 여전히 웹서버의 컴퓨팅 리소스가 부족할 수 있음.

(2) 해결책: 스왑 메모리 설정!

메모리 부족 문제를 해결하기 위해 스왑 메모리(Swap Memory) 를 설정했습니다.

스왑 메모리를 쉽게 설명하면, RAM이 주방 테이블이라면, 스왑 메모리는 냉장고와 같습니다.

주방 테이블에서 요리 재료를 바로 손질하면 빠르지만, 공간이 한정적이죠. 공간이 부족할 때는 재료를 냉장고에 넣어 두었다가 필요할 때 다시 꺼내서 사용할 수 있습니다.

마찬가지로, RAM이 부족하면 일부 데이터를 스왑 메모리(디스크)로 옮겼다가 필요할 때 다시 불러오는 방식으로 운영됩니다. 다만, 냉장고에서 재료를 꺼내는 과정이 테이블 위에서 바로 손질하는 것보다 시간이 걸리듯, 스왑 메모리는 RAM보다 속도가 느리다는 단점이 있습니다.

이런 방식으로 EC2의 부족한 메모리를 보완해 Docker 컨테이너가 안정적으로 실행될 수 있도록 설정했습니다.

AWS Free Tier에서 제공하는 t2.micro 인스턴스는 기본적으로 8GB의 EBS 스토리지를 제공합니다. 이를 활용해 2GB의 스왑 메모리를 생성했습니다.

# 2GB 스왑 파일 생성
sudo fallocate -l 2G /swapfile
# 권한 변경(보안 설정)
sudo chmod 600 /swapfile
# 스왑 활성화
sudo mkswap /swapfile
sudo swapon /swapfile
# 재부팅 후에도 유지되도록 설정
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
# 스왑 활성화 확인
free -h

(3) Docker 설치하기

이전 단계에서 RAM 부족 문제를 해결하기 위해 스왑 메모리를 설정했습니다. 이제 본격적으로 Docker를 설치해보겠습니다.

우분투 24.04.1에서는 기본 패키지 관리자(apt)를 통해 Docker를 설치할 수 있습니다. 하지만, 안정적인 운영을 위해 공식 저장소에서 최신 버전의 Docker를 설치하는 방법을 선택했습니다.

1) 패키지 업데이트 및 의존성 설치

Docker 설치 전에 시스템 패키지를 최신 상태로 업데이트하고, Docker 실행에 필요한 의존성 패키지를 먼저 설치합니다.

sudo apt update -y && sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg

2) Docker 공식 GPG 키 등록

Docker의 공식 저장소를 신뢰할 수 있도록 GPG 키를 등록합니다.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

등록된 GPG 키가 정상적으로 추가되었는지 확인하려면 다음 명령어를 실행합니다.

gpg --show-keys /usr/share/keyrings/docker-archive-keyring.gpg

3) Docker 공식 저장소 등록

공식 Docker 패키지를 설치할 수 있도록 Docker 저장소를 시스템에 추가합니다.

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
  https://download.docker.com/linux/ubuntu noble stable" | sudo tee /etc/apt/sources.list.d/docker.list

4) Docker 엔진 설치

Docker 엔진 및 관련 패키지를 설치합니다.

sudo apt update -y
sudo apt install -y docker-ce docker-ce-cli containerd.io

5) Docker 서비스 시작 및 자동 실행 등록

Docker를 설치한 후, 서비스를 시작하고 부팅 시 자동으로 실행되도록 설정합니다.

sudo systemctl start docker
sudo systemctl enable docker

6) Docker 설치 확인

설치된 Docker의 버전 및 실행 정보를 확인합니다.

docker --version
docker info

7) Docker 권한 설정(루트 권한 없이 실행)

기본적으로 Docker는 루트(root) 사용자 권한이 필요합니다. 하지만 매번 sudo를 입력하지 않도록, 현재 사용자를 Docker 그룹에 추가하여 일반 사용자 권한으로 실행할 수 있도록 설정합니다.

# 현재 사용자 확인
whoami

# docker 그룹에 사용자 추가
sudo usermod -aG docker $(whoami)

# 변경 사항 반영을 위해 로그아웃 후 재로그인 필요
exec sudo su -l $(whoami)

# docker 명령어 테스트
docker ps

8) Docker Compose 설치

WordPress를 컨테이너 기반으로 운영하려면 Docker Compose가 필요합니다.

Docker Compose는 여러 컨테이너를 손쉽게 관리할 수 있도록 도와주는 도구입니다.

# 최신 버전 설치
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" \
  -o /usr/local/bin/docker-compose

# 실행 권한 부여
sudo chmod +x /usr/local/bin/docker-compose

# 설치 확인
docker-compose --version

이것으로 EC2의 설정은 끝났습니다. 이제 RDS를 준비해야합니다.


4. AWS RDS Free tier로 MariaDB 생성하기

웹 서비스의 데이터베이스로 Amazon RDS의 MariaDB를 사용합니다. AWS Free Tier를 활용하기 위해 RDS Console에서 데이터베이스를 생성할 때 다음과 같은 설정을 적용했습니다.

(1) Free Tier 템플릿 선택

RDS 콘솔에서 “Create database” 버튼을 클릭합니다. Templates 옵션에서 “Free tier” 를 선택하여 무료 사용 혜택을 적용합니다.

(2)EC2에서만 DB 접근 가능하도록 설정

보안을 강화하기 위해 데이터베이스가 웹 서버(EC2)에서만 접근 가능하도록 구성합니다.

  • “Connect to an EC2 compute resource” 옵션 선택
  • RDS와 EC2가 동일한 VPC 내에서 안전하게 연결됨

(3) 외부 접근 차단 (Public Access: No)

데이터베이스를 외부에서 직접 접근할 수 없도록 설정합니다.

  • “Public access” 옵션을 “No” 로 설정
  • 이 설정을 통해 RDS는 인터넷에서 직접 접속할 수 없으며, EC2에서만 접근 가능

이제 MariaDB가 안전하게 EC2와 연결되었으며, 외부에서는 접근할 수 없는 구조가 완성되었습니다.

다음 단계에서는 EC2에서 MariaDB에 연결하고 Docker를 사용하여 WordPress와 연동하는 과정을 살펴보겠습니다! 


이 모든 것을 Free Tier 내에서 구현하며, 확장성까지 고려한 인프라 설계를 함께 살펴보겠습니다. 무료지만 제대로, 가난하지만 스마트하게 AWS 클라우드 서비스의 진수를 경험해보시죠!

Comments

Leave a Reply