PostgreSQL on EC2
최근까지만 해도 나는 postgreSQL DBMS를 돌릴 플랫폼으로 "AWS RDS"를 사용했다. 이유야 여럿 있겠지만 AWS 안에서 제공하는 서비스라 네트워크 관리하는 것도 편리하고, 따로 이것저것 설치할 필요 없이 자동으로 세팅된다는 점도 좋았다.
그러나 몇 달에 걸쳐 RDS 요금이 가파르게 상승하기 시작했고, 이대로 방치했다가는 안그래도 얇은 지갑 사정에 심대한 위기가 찾아올 게 불보듯 뻔했다. 요금은 중대 사안이다. 당장 RDS를 버리지는 않는다 해도 어떤 대안이 있는지 정도는 찾아둬야 할 것 같았다.
찾아보니 EC2 인스턴스에서도 ─ 간단한 듯하면서도 복잡한 듯한 과정을 거치고 나면 ─ postgreSQL DBMS를 돌릴 수 있었다. 백엔드 개발자 지인에게 물어보니 대부분 돈 아끼고 싶으면 RDS 말고 무조건 EC2를 쓰라고 입을 모았다. 그리하여 이 포스트는 EC2 인스턴트에 postgreSQL DBMS를 설치하는 일련의 ─삽질 ─ 과정에 대해 다뤄보려 한다. AIM은 Amazon Linux 2를 사용하였다.
install
postgreSQL DBMS는 5432번 포트를 듣는다. 따라서 EC2 인스턴스를 생성할 때 보안 그룹에서 인바운드 규칙에서 postgreSQL 유형을 선택하고, 로컬 PC IPv4 주소와 백엔드 서버가 돌아가는 EC2의 프라이빗 IP 주소로 소스를 제한한다. postgreSQL DBMS는 백엔드 어플리케이션과 같은 VPC 안에 생성할 것이기 때문에 프라이빗 IP를 사용해야 요금이 덜 나간다. 다시 한 번 말하지만 요금은 중대 사안이다.
인스턴스가 생성되면 SSH로 접속하여 아래의 명령어로 postgreSQL DBMS를 설치하고 시작하자.
// ssh 접속
ssh -i [ pem 키 경로 ] ec2-user@[ 퍼블릭 ip ]
// 패키지 리포지토리 업데이트
sudo yum update -y
// PostgreSQL 리포지토리 추가
sudo amazon-linux-extras install postgresql13 -y
// PostgreSQL 설치
sudo yum install postgresql-server postgresql-contrib -y
// PostgreSQL 데이터베이스 초기화
sudo /usr/bin/postgresql-setup --initdb
// PostgreSQL 서비스 시작 및 부팅 시 자동 시작 설정
sudo systemctl start postgresql
sudo systemctl enable postgresql
setting
설치가 완료되었다면 PostgreSQL 설정 파일(postgresql.conf)을 일부 수정해주어야 한다. ec2-user로는 pgsql 경로에 접근할 수 없기 때문에 sudo su 명령어를 통해 root 권한을 취득한 뒤 Connections and Authentication 항목을 수정해준다. listen_addresses와 port 부분의 주석을 제거하고, listen_addresses의 localhost를 아래의 이미지와 같이 '*' 로 변경해주자.
조금 더 내려가보면 주석 처리된 password_encryption가 있을텐데, 마찬가지로 주석을 제거하고 md5가 아니라 scram-sha-256으로 수정해주자. 이는 PostgreSQL가 사용자의 비밀번호를 어떻게 암호화할 것인지에 대한 내용인데, md5는 구버전 방식으로 암호화 알고리즘 취약성이 있어 사용을 지양하는 것이 좋다.
// PostgreSQL 설정 파일 수정
sudo su
cd /var/lib/pgsql/data
vim postgresql.conf
이후 추가적으로 pg_hba.conf 파일을 열고 원격 접속 권한을 수정해야 한다. 이미 EC2 수준에서 인바운드 규칙을 설정해두었기 때문에 여기서는 간단하게만 수정하였다. 모든 곳(0.0.0.0/0)에서 들어오는 모든 유저(USER all)들을 scram-sha-256 방식으로 검증하겠다는 의미이다.
// PostgreSQL 설정 파일 수정
vim pg_hba.conf
설정을 변경하였다고 자동으로 반영되는 것은 아니고, PostgreSQL을 재시작해주어야 한다.
// PostgreSQL 재시작
sudo service postgresql restart
계정 생성
백엔드 어플리케이션에서는 [유저 이름]:[비밀번호]@[EC2 주소]:5432/[DB 이름]과 같은 형식으로 PostgreSQL DBMS에 접근한다. 따라서 유저를 생성해주어야 하는데, 그 방식은 아래와 같다.
// postgres 사용자로 전환 후 psql 클라이언트 실행
sudo -u postgres psql
// 계정 생성
CREATE USER aydenblair WITH PASSWORD 'qwerty1234';
// 권한 추가
ALTER ROLE aydenblair SUPERUSER CREATEDB;
비밀번호를 확인해보면 위에서 설정한 scram-sha-256으로 암호화 되어있는 것을 알 수 있다.
권한을 추가하고나면 아래의 테이블에서 추가한 권한의 목록을 확인할 수 있다. 만약 아무런 권한도 없는 유저의 경우 Attributes가 비어있다.
백엔드 어플리케이션에 PostgreSQL DBMS를 연결하고, 회원가입 및 로그인 로직을 확인해보니 문제 없이 잘 동작하는 것을 확인할 수 있었다.
블로그의 정보
Ayden's journal
Beard Weard Ayden