AWS EC2에 PostgreSQL 설치 & Peer Authentication 오류 해결
개인 프로젝트를 진행하면서,
S3에 저장된 CSV 데이터를 수집 및 정제한 후, PostgreSQL에 적재하는 파이프라인을 구축했다. 이 과정에서 AWS EC2 환경에 PostgreSQL을 설치하고 Remote 개발 환경을 구성했는데, 예상치 못한 Peer 인증 오류(Peer Authentication Failed)로 인해 데이터베이스 접속에 어려움을 겪었다.
이 글에서는 EC2에 PostgreSQL을 설치하고, DB 및 사용자 계정을 설정한 뒤, Peer 인증 문제를 해결하여 로컬 접속이 가능하도록 수정하는 과정을 정리한다.
1. EC2에 PostgreSQL 설치
1-1. 패키지 업데이트 및 설치
1
2
3
4
5
# 패키지 목록 업데이트
sudo apt update
# PostgreSQL 및 유틸리티 설치
sudo apt install postgresql postgresql-contrib
설치가 완료되면 PostgreSQL 서비스가 자동으로 설치되며, 다음과 같이 시작 및 부팅 시 자동 실행을 설정한다:
1
2
3
4
5
# PostgreSQL 서비스 시작
sudo systemctl start postgresql
# 부팅 시 자동 시작 설정
sudo systemctl enable postgresql
1-2. psql 접속 및 초기 설정
PostgreSQL을 설치하면, 기본적으로 postgres라는 최고 권한의 데이터베이스 관리자(DBA) 유저가 자동 생성된다. 리눅스에서도 postgres라는 이름의 시스템 사용자 계정이 함께 생성되며, 이 계정을 통해 PostgreSQL에 접속하고 초기 설정을 진행할 수 있다.
1
2
3
4
5
# postgres 유저로 전환
sudo -i -u postgres
# PostgreSQL 셸 접속
psql
정상적으로 접속되면 아래와 같은 화면이 출력된다:
1
2
3
4
psql (16.9 (Ubuntu 16.9-0ubuntu0.24.04.1))
Type "help" for help.
postgres=#
postgres=# 프롬프트는 현재 로그인한 DB 사용자가 postgres이며, PostgreSQL 서버에 정상적으로 접속되었음을 의미한다.
🟢 참고: postgres=#에서 # 기호는 슈퍼유저(superuser) 권한으로 접속했음을 나타낸다. 일반 유저는 => 기호로 표시된다.
2. 유저 및 데이터베이스 생성
1
2
3
4
5
6
7
8
-- 유저 생성
CREATE USER planner_dev WITH PASSWORD 'popdev1234';
-- 데이터베이스 생성 및 소유자 설정
CREATE DATABASE pop_planner_dev OWNER planner_dev;
-- 권한 부여
GRANT ALL PRIVILEGES ON DATABASE pop_planner_dev TO planner_dev;
이후 \q 명령으로 psql 셸에서 나가고, exit로 postgres 유저 세션 종료하면 된다.
🚨 3. Peer Authentication 오류
PostgreSQL은 기본적으로 로컬 접속 시 peer 인증 방식을 사용한다. 이는 “리눅스 운영체제의 사용자명”과 “PostgreSQL의 사용자명”이 같을 경우에만, 비밀번호 없이 접속을 허용하는 방식이다.
하지만 내가 새로 생성한 DB 사용자(planner_dev)는 리눅스의 사용자명과 다르기 때문에, 아래와 같이 접속을 시도하면 인증 오류가 발생한다:
1
psql -U planner_dev -d pop_planner_dev
1
2
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed:
FATAL: Peer authentication failed for user "planner_dev"
즉, PostgreSQL은 이 사용자가 리눅스 시스템 계정과 일치하지 않는다고 판단해 접속을 거부한 것이다.
💡 4. 인증 방식 변경 (peer -> md5)
이 문제를 해결하려면 PostgreSQL이 비밀번호 기반 인증(md5)을 사용하도록 설정 파일을 수정해야 한다. 해당 설정은 pg_hba.conf 파일에 정의되어 있다.
1
2
# 일반 사용자로 돌아온 뒤
sudo nano /etc/postgresql/16/main/pg_hba.conf
pg_hba.conf는 PostgreSQL의 인증 방식을 제어하는 설정 파일로, 어떤 사용자가 어떤 방식으로 인증할 수 있는지를 지정한다.
기본적으로는 다음과 같이 설정되어 있을 것이다:
이 항목을 아래처럼 md5로 변경해주면, 사용자명과 비밀번호로 인증하는 방식으로 바뀐다. md5는 비밀번호 기반 인증 방식으로, DB 사용자 계정에 대해 비밀번호를 확인하여 접속을 허용한다.:
설정 변경 후에는 PostgreSQL 서비스를 재시작해야 변경 내용이 반영된다:
1
sudo systemctl restart postgresql
5. 접속 테스트
PostgreSQL 서비스 재시작 후, 다시 planner_dev 유저로 접속을 시도한다:
1
psql -U planner_dev -d pop_planner_dev
비밀번호로 popdev1234를 입력하면, 아래와 같이 정상적으로 접속된다:
1
pop_planner_dev=>
이 프롬프트는 현재 pop_planner_dev 데이터베이스에 planner_dev 유저로 접속되어 있다는 뜻이다.
6. 데이터베이스 확인 명령어 써보기
psql 셸에 들어왔다면, 아래 명령어들을 사용해 데이터베이스가 제대로 연결되어 있고, 유저에게 권한이 정상적으로 부여되어 있는지 확인할 수 있다:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 현재 접속 중인 데이터베이스 확인
\conninfo
-- 테이블 목록 확인
\dt
-- 테이블 구조 확인
\d popup_list
\d popup_detail
-- 데이터 건수 확인
SELECT COUNT(*) FROM popup_list;
SELECT COUNT(*) FROM popup_detail;
-- 셸 종료
\q
7. .env 설정하기
로컬 개발 환경 또는 애플리케이션에서 DB에 연결할 수 있도록 .env 파일도 아래와 같이 구성해두면 편리하다:
1
2
3
4
5
6
KAKAO_API_KEY=your_kakao_api_key
DB_NAME=pop_planner_dev
DB_USER=planner_dev
DB_PASSWORD=popdev1234
DB_HOST=localhost
DB_PORT=5432
이 설정은 Python의 psycopg2나 ORM 도구를 사용할 때 환경변수로 바로 읽어들일 수 있어, 프로젝트와의 연동이 쉬워진다.
마무리
PostgreSQL 설치 자체는 간단했지만, 인증 방식에 대한 이해 없이 설정하다 보면 예상치 못한 문제에 부딪힐 수 있다. 이번처럼 운영체제 사용자와 데이터베이스 사용자가 다를 경우, 기본 설정(peer 인증)이 오히려 접속을 막는 요인이 되기도 한다.
특히 EC2 환경처럼 여러 계정과 서비스가 엮이는 상황에서는 pg_hba.conf를 통해 인증 방식을 md5로 명확히 지정해주는 작업이 필수적이다.
처음 PostgreSQL을 세팅하는 단계라면, 이 인증 설정 부분까지 한 번에 정리해두는 걸 추천한다.