AWS 프리티어의 공포
백엔드 개발자로 사이드 프로젝트를 해본 경험이 있다면, 프리티어를 통해 AWS 클라우드를 사용해 본 경험이 한 번쯤은 있을 것이다. AWS에서는 1년 동안 EC2, RDS, S3 등 핵심 제품에 대해 무료 제공을 지원한다. 프리 티어를 사용한다면, 큰 추가 지출 없이 가벼운 서비스를 클라우드 환경에서 운영할 수 있다.
그러나 프리티어는 1년이 지난 후부터 자동으로 비용이 지불되며, 프리티어 기간 동안에도 무료가 아닌 서비스를 이용하거나 계정 또는 서버에 접근하기 위한 정보들을 탈취당하는 경우 과금이 청구될 수 있다
. (AWS 과금 괴담은 많은 개발자들을 두려움에 떨게 하는 이야기이다.)
과금 괴담만이 아니더라도 프리티어 기간이 종료되고 나면 지불 비용이 은근히 쎄다. EC2, RDS만을 사용하는 아주 간단한 서비스를 운영한다고 가정하자. EC2는 프리티어 제공 스펙 인스턴스인 t2.micro를, RDS도 프리티어 제공 스펙인 db.t2.micro을 사용한다.
서울 리전 기준 EC2 가격은 한 달에 약 만원, RDS 가격은 약 2만 4천원이다. 도합 3만원이 넘는다.
이러한 이유로 프리티어 기간이 종료되면 눈물을 머금고 서비스를 내리는 많은 개발자들이 있고, 나 역시 그들 중 하나였다.
그러나 나에게는 깊은 애정을 가진 개인 프로젝트 친구가 있고, 이 친구는 계속 세상에 보여주고 싶었다. 이 친구를 어떻게 하면 최대한 적은 지출로 유지할 수 있을까에 대해 고민하다가 알게된 대안이 바로 오라클사에서 운영하는 오라클 클라우드(Oracle Cloud)이다.
주의. “AWS 쓰지 마세요” 가 아니다!
본격적인 내용을 시작하기 전에 짚고 넘어갈 것이 있다.
어쨌든 AWS는 클라우드 시장에서 압도적인 점유율을 가진 서비스고, 대부분은 실무에서도 AWS를 활발히 사용하게 될 것이다. AWS에 익숙하지 않다면, 학습 차원에서 약간의 비용을 감수하더라도 AWS를 이용해보는 편이 좋다. (본 글에는 독자가 이미 AWS를 이미 이용해보았다고 가정하고, AWS에 빗대어 설명하는 부분이 여럿 포함되어 있다.)
그리고 AWS는 공식 문서가 아주 친절하며, 레퍼런스도 많다. 문제가 생겨 막혔을 때 도움을 받을 곳이 아주 많다는 이야기다. 그렇기 때문에 다시 한 번, 클라우드에 익숙하지 않거나 AWS 프리티어 사용 경험이 없는 경우에는 AWS를 먼저 이용해보는 것을 권장한다.
저렴한 대안, 오라클 클라우드
그럼 이제 오라클 클라우드 프리티어에 대해 알아보자.
오라클의 프리티어는 한달 제공 기능과 상시 제공 기능으로 나뉜다. 이 글에서는 한달 제공 기능은 제공 기간이 너무 짧으므로 생략하고, 상시 무료 제공 기능을 중점으로 살펴보자.
상시 무료 제공 기능에서 가장 중요한 옵션은 바로 AMD 컴퓨팅 VM 2개
이다. AWS 프리티어 인스턴스(t2.micro, 1CPU 1GB RAM)와 동일한 스펙의 서버를 2대나 무료로 운영할 수 있다.
데이터베이스는 Oracle에 한해 무료이다. 대부분의 사이드 프로젝트에서는 RDB를 이용한다고 해도 보통 MySQL을 사용하므로, 이 부분에서 큰 혜택을 누리긴 어려울 것 같다.
그래서 나는 (아주 트래픽이 작은 서비스라고 할 때) 기본 제공 인스턴스 중 한 대를 웹 서버
용, 한 대를 DB 서버
용으로 추천하고 싶다. 한 서버에 2개를 같이 띄우면 2개 서비스를 운영할 수 있는 거 아닌가? 라고 생각할 수도 있겠으나, 기본 제공 서버는 CPU 1개와 1GB 메모리를 가진 아주 작은 서버임에 주의해야 한다. 하나의 서버에 두 개를 동시에 운영하면 메모리가 부족할 확률이 아주아주 높다.
그럼 이제 아래부터는 프리티어 계정에서 2대의 서버에 각각 웹 서버와 데이터베이스 서버를 운영하는 간단한 예제를 보여주겠다.
사전 설정
인스턴스를 만들기 전에 선행되어야 할 작업들이 있다. 먼저 이에 대해 소개한다.
계정 및 카드 연동
먼저, 계정을 생성하고 카드 연동을 해야 한다. 카드 등록은 해야 하지만, 유료 기능을 이용하지 않으면 비용이 지불될 일은 없으니 안심해도 된다.
계정을 생성할 때 최초로 Region을 선택하게 되는데, 국내에서 운영할 서비스라면 서울과 춘천 중 하나를 선택하면 된다. 참고로 선택한 Region은 바꿀 수 없다.
VCN 및 서브넷 생성
그리고, 인스턴스를 만들기 전 인스턴스를 연결시킬 가상 클라우드 네트워크(VCN)와 서브넷을 생성해야 한다.
가상 클라우드 네트워크란, 인스턴스들을 연결할 가상의 개인 네트워크이며, 서브넷 생성이나 방화벽 관리와 같은 네트워크 환경 제어를 위해 필요하다. AWS의 VPC와 유사한 개념으로 보면 된다.
가상 클라우드 네트워크를 생성할 때에는 내부 IP 주소를 CIDR(사이더) 표기법으로 입력하게 된다. 이를 통해 IP 대역과 할당 가능한 호스트 기기 수가 결정되며, 이 대역 내에서 서브넷을 통해 또 내부적으로 가상 네트워크를 구축하게 된다. IP와 네트워크 구축에 대한 지식을 참조해 진행하길 권장하지만, 오라클 공식 FAQ 문서에서 간단한 설정 예시를 제공하고 있다. (10.0.0.0/16, 192.168.0.0/24)
수신 규칙 설정
서버로 들어오는 모든 접근을 허용하게 되면 자칫 내 서버가 공격자의 타겟이 될 수 있다. 이 경우 정상적인 서비스 운영에 차질이 생길 수도 있고, 경우에 따라 과금이 청구될 수 있어 매우 주의해야 한다.
수신 규칙은 가상 클라우드 네트워크의 보안 목록 내에서 설정할 수 있다.
수신 규칙은 서버의 목적에 따라 다르게 설정된다. 나의 경우 HTTP 프로토콜을 통해 통신하는 웹 서비스를 운영할 것이므로 80번과 443번 포트는 모든 소스의 접근을 허용해주었다.
이외에도 SSH 접근에 대한 수신 규칙이 잘 설정되어있는지 확인해야 한다. 내 작업 환경에서 SSH 프로토콜로의 접근이 막혀있다면 추후 진행하는 인스턴스 쉘 접속 단계에서 문제가 생길 수 있다.
웹 서버 생성
위의 절차를 모두 마쳤다면 이제 인스턴스를 생성하기 위한 사전 준비가 끝났다. 이제 인스턴스 탭으로 이동해 인스턴스를 생성해보자.
인스턴스 생성
인스턴스를 생성할 때에는 아래 부분을 유의하면서 생성하면 된다.
- 이미지 및 구성 - 원하는 OS 이미지를 선택한다.
항상 무료 적격
이라고 표시된 인스턴스를 이용할 수 있으며, 인스턴스 스펙은 1 CPU 1 GB RAM까지 이용 가능하다. - VNIC 정보 - 위에서 만들어준 VCN과 서브넷을 연결해주면 된다. VCN 외부에서 접근해야 하는 인스턴스인 경우 공용 IP를 할당받으면 된다. Oracle 프리티어의 좋은 점은, public IP를 배정받기 위해 추가적 요금을 지불할 필요가 없다는 점이다.
- SSH 키 추가 - SSH 접속을 위해 사용할 방법을 정한다. 대칭키 방식을 선택해 private key를 다운받아 접근하거나, 이미 존재하는 자신의 public key를 업로드하는 방식 등을 선택할 수 있다. private key 방식을 선택하는 경우 반드시 key를 다운받아둬야 한다.
인스턴스 접속 확인
인스턴스를 생성했다면, 아래와 같이 인스턴스가 실행 중 상태로 변경될 때까지 기다린다. (2~3 분 소요)
인스턴스가 정상적으로 생성되었다면, SSH를 통해 쉘에 접근을 시도해보자.
앞서 인스턴스를 생성할 때, 나는 private key를 통한 접속 방식을 선택했다. private key를 이용하는 경우 아래 2가지를 수행했는지 체크해야 한다.
- private key의 확장자는
.key
이기 때문에,openssl
을 통해pem
확장자의 key로 변환하여 사용해야 한다. - key에 적절한 접근 권한이 설정되어 있지 않으면 접속 오류가 발생할 것이다. root를 제외한 사용자에게서 읽기를 제외한 권한을 차단해야 정상적으로 key를 이용할 수 있다.
위의 2가지를 수행하려면 아래와 같은 커맨드를 이용하면 된다.
openssl rsa -in private.key -text > {키파일명}.pem
chmod 600 {키파일명}.pem
방화벽 설정
오라클은 기본적으로 인스턴스 자체의 방화벽이 SSH, ICMP 포트를 제외하고는 모두 닫혀있다. (수신 규칙에서 허용해 주는 것은 서브넷에 대한 접근 제한일 뿐이다.)
따라서 HTTP, HTTPS 프로토콜을 이용하는 웹서버를 운영하기 위해 인스턴스를 사용하려면, 아래와 같은 명령을 통해 사용하려는 포트에 대한 접근을 허용해줘야 한다.
sudo iptables -I INPUT 5 -i ens3 -p tcp --dport {허용할 포트} -m state --state NEW,ESTABLISHED -j ACCEPT
데이터베이스 서버 생성
왜 오라클에서 무료 제공하는 DB 서버를 쓰지 않냐고 묻는다면, 이유는 아래와 같다.
- 다른 DBMS를 사용 - 오라클 클라우드는 오라클의 서비스인 만큼 무료 제공 DB가 오라클에 한정된다. MySQL이나 PostgreSQL 등 다른 RDBMS를 사용하고 싶다면 유료 기능을 이용해야 한다.
- 무료 제공 DB에는 절전 모드가 존재 - 무료 제공 오라클 DB는 일정 시간 접속이 없으면 자동으로 종료된다. 트래픽이 거의 없는 서비스라면 DB 자동 종료에 의해 발생하는 서비스 장애를 겪을 수도 있다.
이러한 이유로 인스턴스에 DBMS를 설치해 DB서버를 운영하는 방식을 택했다. 만약 기존에도 Oracle DB를 사용하고 있었다면 프리티어로 제공되는 자율운영 데이터베이스
를 사용해보는 것도 좋을 것 같다.
아래에서는 데이터베이스 서버의 구성 방법을 소개한다. 설정 내용은 전체적으로 웹 서버 인스턴스와 동일하며, DB를 설치하고, DB 포트를 웹 서버에서 접근할 수 있도록 개방해줘야 하는 정도의 차이만 존재한다.
인스턴스 생성
웹 서버를 생성할 때와 동일하다.
수신 규칙 설정
웹 서버에서 HTTP/HTTPS 접근을 허용하기 위한 수신 규칙을 추가했다면, DB 서버에서는 DBMS의 통신을 위한 수신 규칙을 추가해야 한다. 나는 mariadb를 사용하기 때문에 3306 포트를 웹 서버 인스턴스 주소, 내 로컬 환경 주소에 한해 개방하였다.
방화벽 설정
마찬가지로 DB 포트(ex: 3306)에 대한 접근을 허용해주면 된다.
DB 설치
인스턴스에 쉘 접속을 해서 DB 설치, 외부에서 접속을 위해 사용할 사용자 생성 및 권한 부여를 진행하면 된다. 이 과정을 끝낸 후 웹 서버 인스턴스에서 DB 인스턴스에 정상적으로 접근이 가능한지 확인해보면 된다.
반 년 사용 후기
AWS를 통해 서비스를 운영해본 경험이 있는 사람이라면, 인스턴스 방화벽을 직접 열어줘야 한다는 점을 제외하고는 인스턴스의 생성 및 설정 방식이 유사함을 알 수 있을 것이다. 덕분에 설정 과정에서 (방화벽 제외) 크게 애를 먹은 점은 없었다.
나는 이 인스턴스 내에서 Spring 기반 SSR 애플리케이션, MariaDB 기반 DB 서버를 각 운영하고 있다. 내가 운영하고 있는 서비스 작전명 투게더! 는 지금도 소규모 트래픽에는 문제 없이 잘 대응하고 있다.
이 글에서는 간단하게 무료 인스턴스의 사용법만을 소개했지만, 위의 상시 무료 이미지에서 볼 수 있듯 오브젝트 스토리지, 로그/모니터링, 로드밸런서 등 더 다양한 서비스들이 프리티어 범위 내에서 제공된다. 기회가 된다면 이러한 기능들도 이용해보면 좋을 듯하다.
개인적으로 아쉬운 점이 있다면, Code Deploy와 같은 배포 매니징 툴이 프리티어 범위에 없다는 정도일 것 같다. (이만큼 무료로 주는 것도 감지덕지인데 너무 많은 걸 바라는 거 아닌지?) 아무튼 이 부분을 보완하면서 GitHub Action 단독으로 CI/CD 환경을 구축했는데, 이 부분은 다음 글에서 Java 애플리케이션 운영 팁과 함께 소개해보고자 한다.
참고
Oracle Cloud 방화벽 설정 (http/https 특정 포트 열기)