Please enable JavaScript to view the comments powered by Disqus.

MongoDB 원격 접속 설정

Amazon Lightsail의 Ubuntu 인스턴스에서 MongoDB 설치 및 원격 접속을 위한 설정 과정

Amazon Lightsail

Amazon Lightsail은 저렴한 가격으로 클라우드 서버를 사용할 수 있다. 메모리 512MB의 최소 사양 인스턴스는 3.5달러밖에 하지 않기 때문에 테스트나 학습용으로 사용하기 좋다. 운영체제는 Ubuntu 16.04 버전을 선택해서 사용했다.

MongoDB 설치

공식 홈페이지의 설치 가이드를 단계별로 따라가면 쉽게 설치할 수 있다. 나는 .deb 패키지를 사용하는 방법으로 진행했다. 설치한 MongoDB 버전은 4.0.2였다.

데이터베이스 폴더 설정

데이터베이스 사용을 위해서는 데몬 프로세스 mongod를 실행해야 하는데, 그 전에 데이터를 저장할 폴더를 만들어야 한다. MongoDB의 기본 데이터베이스 폴더는 /data/db로 지정되어 있으니 루트 권한으로 폴더를 만들어야 한다. 폴더가 만들어지면 MongoDB를 설치하면서 등록된 시스템 서비스를 실행한다.

sudo mkdir /data/db
sudo service mongod start

서비스 실행 후 mongo 쉘을 실행할 수 있으면 로컬에서 데이터베이스를 사용할 준비가 된 것이다.

mongo

원격 접속 설정

설치 직후의 데이터베이스는 인증 없이 사용할 수 있고, 설치된 기기에서만 접속 가능하다. 원격 접속이 가능하도록 하려면 사용자를 추가하고 네트워크 관련 설정을 수정해야 한다.

사용자 생성

사용자 생성은 mongo 쉘에 접속해서 한다. mongo 쉘은 MongoDB의 자바스크립트 인터페이스로서 명령어 실행과 함수 호출을 통해 데이터베이스를 수정할 수 있는 기능을 제공한다.

사용자 정보는 기본적으로 admin 데이터베이스에 저장한다. MongoDB는 사용자 정보가 저장된 데이터베이스가 아닌 다른 데이터베이스에 대한 권한을 부여할 수도 있다. 이를 Role-Based Access Control이라고 한다.

데이터베이스를 선택하고, 사용자를 생성하는 함수를 호출하도록 하자.

use admin # admin 데이터베이스 선택

db.createUser({
  user: "dbadmin",  # 계정 이름
  pwd: "password",  # 비밀번호
  roles: [          # 사용자에게 주어진 권한 목록. 여러 데이터베이스에 대한 권한을 할당할 수 있다.
    {
      role: "root", # built-in 권한인 root. 문자 그대로 모든 데이터베이스를 관리할 수 있다.
      db: "admin"   # 어떤 데이터베이스에 대한 권한인지 명시
    }
  ]}
)

그리고 관리자가 아닌 사용자를 생성해서 실제 작업에 사용하도록 한다.

db.createUser({
  user: "rhostem",
  pwd: "password",
  roles: [
    {
      role: "readWrite", # 읽기, 쓰기 권한
      db: "test"         # 위의 권한을 부여할 데이터베이스로 test를 지정
    }
  ]}
)

mongod.conf 파일 설정

사용자를 생성했으니 데이터베이스에 접속할 때 인증이 필요하도록 수정해야 한다. 서비스가 사용하고 있는 설정 파일은 아래의 명령어로 확인할 수 있다. 아래 로그에서 확인할 수 있듯이 Ubuntu에서는 /etc/mongod.conf 파일을 수정하면 된다.

service mongod status

● mongod.service - MongoDB Database Server
   Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-08-30 00:00:00 UTC; 2s ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 4376 (mongod)
    Tasks: 26
   Memory: 138.1M
      CPU: 1.053s
   CGroup: /system.slice/mongod.service
           └─4376 /usr/bin/mongod --config /etc/mongod.conf
           # MongoDB 데몬 프로세스의 옵션 파일을 지정하는 --config가 사용되어 있다.

데이터베이스 접속이 인증이 필요하도록 하려면 security 섹션을 아래처럼 수정한다.

security:
  authorization: enabled

그리고 net 섹션의 bind_ip 항목도 수정해야 한다. 기본 설정은 로컬에서만 접속할 수 있도록 127.0.0.1로 되어 있는데, 모든 아이피에서 접속할 수 있도록 0.0.0.0으로 변경한다.

net:
  port: 27017
  bindIp: 0.0.0.0

TCP 포트 개방

설정에서도 확인할 수 있지만 MongoDB는 기본적으로 27107번 포트를 사용한다. 따라서 외부에서 접속할 수 있도록 방화벽 설정을 통해 27017번 포트를 개방해야 한다. 나는 Amazon Lightsail 인스턴스를 사용했기에 웹에서 간편하게 설정할 수 있었다. 인스턴스의 네트워킹 탭에 항목을 추가하면 된다.

lightsail firewall TCP 프로토콜 27017 포트를 개방했다

접속 명령어

우선 사용자가 설정되었는지 확인하기 위해 서버에서 mongo 쉘에 접속을 시도해본다. -p 옵션 다음에는 비밀번호를 입력해야 하지만 비워두면 입력을 위한 프롬프트가 뜬다.

authenticationDatabase 옵션은 사용자의 정보가 저장된 데이터이스를 가리키기 위한 것이다. 앞서 사용자를 추가할 때 사용한 admin 데이터베이스를 입력한다.

sudo mongo -u dbadmin -p --authenticationDatabase admin

MongoDB shell version v4.0.2
Enter password: <패스워드 입력>

접속에 성공했다면 이제 서버에서 로그아웃한 후 원격 접속이 가능한지 시도해보자. 앞의 명령어에 host 옵션만 추가하면 된다. host에는 서버의 IP 주소 또는 도메인을 입력하면 된다.

mongo -u dbadmin -p --host <아이피 또는 도메인> --authenticationDatabase admin

접속이 성공했다면 원격으로 데이터베이스를 사용할 준비가 된 것이다. 이제 node.js 서버 앱에서 Mongoose 같은 모듈을 사용해 데이터베이스를 사용할 수 있다.

(Mac 또는 Windows의 커맨드라인에서 데이터베이스에 원격 접속하기 위해서는 MongoDB가 설치되어 있어야 한다. 그렇지 않다면 MongoDB를 위한 GUI 도구를 사용하면 된다.)

기타 설정

시스템 재시작 시 MongoDB를 자동으로 실행하도록 설정

서버를 재시작하면 실행 중인 mongod 프로세스도 종료된다. 시스템 시작과 함께 서비스가 실행되도록 crontab을 사용해서 작업을 등록할 수 있다. crontab은 Linux 운영체제가 특정 시점에 특정 명령어를 실행하도록 할 수 있는 기능이다. 아래의 명령어로 crontab 파일을 연다.

crontab -e

맨 아래쪽에 재부팅 시점에 실행할 명령어를 추가한다.

@reboot sudo service mongod start

파일을 저장하고 나왔을 때 아래의 메시지가 표시되면 등록된 것이다.

crontab: installing new crontab

데이터베이스 접속을 위한 쉘 스크립트 작성

git 저장소에서 작업하고 있다면 쉘 스크립트에 비밀번호가 노출되면 안 되므로 별도의 파일에 저장해서 관리하는 편이 보안상 좋다. 예를 들어 비밀번호를 .dbpasswd 파일에 저장했다면 해당 파일은 .gitignore 파일에 등록하고 쉘 스크립트를 아래와 같이 작성한다.

# connect-db.sh

passwd=$(<.dbpasswd) # 변수 passwd에 .dbpasswd 파일의 내용을 할당.
mongo -u rhostem -p $passwd --host db.host.name --authenticationDatabase admin

참고자료