본문 바로가기
Develop/백엔드 & 서버

aws ec2 mongoDB 원격 접속 후 mongoose 설정

by 구운밤이다 2020. 1. 30.
728x90
반응형

안녕하세요! 몽고DB를 AWS 서비스를 이용해서 원격 접속을 하는 방법을 알아보도록 하겠습니다. 먼저 aws ec2 인스턴스에 적용해야하니 ec2 인스턴스가 필요하겠죠?

인스턴스를 생성하시고 나서 보안그룹 설정시 27017 포트를 모든 아이피 (0.0.0.0)에게 열어주어야 합니다. 혹은 특정 아이피 구간에만 27017 포트를 허용해주는 게 보안에 더 좋은데, 이 방법은 제가 몰라서 찾아봐야 할 듯 합니다.

User 생성

커맨드 툴을 이용해서 아래와 같이 ec2 에 접속해줍니다. 그리고 mongo를 입력해 mongoDB에 접속하면 됩니다.

> use 디비이름;
> db;
디비이름

그리고 사용할 데이터베이스로 접속해줍니다.

//not work
db.createUser({user: "developer", pwd:"developer", roles:["root"]});

//work
db.createUser({user: "developer", pwd:"developer", roles:["dbOwner"]});

접속한 데이터베이스에서 계정을 생성해줍니다. 이때, root 권한을 가진 superuser를 먼저 생성해야하므로 roles: ["root"] 를 입력해야하는데, 저는 이때 이런 에러가 나오더라구요. 

Error: couldn't add user: No role named root@{{DB 이름}} :_getErrorWithCode@src/mongo/shell/utils.js:25:13

저처럼 에러가 나오신 분들은 roles: ["dbOwner"] 옵션을 주시면 됩니다.

> db.getUsers();
[
	{
		"_id" : "some_string",
#  wiredTiger:
		"userId" : UUID("some_string"),
		"user" : "아이디",
		"db" : "비번",
		"roles" : [
			{
				"role" : "dbOwner",
				"db" : "DB 이름"
			}
		],
		"mechanisms" : [
			"암호",
			"암호"
		]
	}
]

명령어를 통해 생성한 유저를 확인해 볼 수 있습니다.

mongoDB config 설정

이제 유저가 생겼으니 인증된 사용자만 DB에 접속할 수 있게 해야겠죠?

aws ec2 의 경우 ubuntu 환경이어서 /etc/mongod.confg 위치에 config 파일이 존재할 겁니다. 다음 명령어로 config 파일을 열어줍니다.

config 파일을 보면 #으로 주석처리된 부분들이 많은데 net 과 security 부분을 수정해주시면 됩니다.

net:
  port: 27017
  bindIp: 0.0.0.0

security:
  authorization: 'enabled'

여기서 또 주의해야 할 부분은 bindIp 입니다. 저는 bindIp를 0.0.0.0 이 아니라 아예 주석처리를 해놓고 사용하고 있었는데 사용자를 추가하고 나니 0.0.0.0 으로 설정해주어야 작동하더라구요. 만약 잘 따라하셨는데도 잘 되지 않는 경우 bindIp 의 문제인지 한 번 확인해보시기 바랍니다.

수정 후 esc + :wq 로 저장해줍니다.

> sudo service mongod restart

 다음은 mongod 서비스를 다시시작해야합니다.

$ mongo {{pubilc_ip}}/{{your_db}}
MongoDB shell version v4.2.2
connecting to: mongodb://{{pubilc_ip}}/{{your_db}}?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("some_string") }
MongoDB server version: 4.2.2
> show dbs
>

자신의 커맨드 툴로 나와서 remote access 시 이제 user 없이 mongo shell에 접속하게 되면 DB를 더이상 볼 수 없게 됩니다. 위처럼 권한이 없을 경우 show databases 명령어를 해도 아무 데이터베이스가 보이지 않게 됩니다.

mongo -u {{아이디}} -p {{비밀번호}} {{아이피주소}}/{{DB 이름}}
MongoDB shell version v4.2.2
connecting to: mongodb://{{아이피주소}}:27017/{{DB 이름}}?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("some_string") }
MongoDB server version: 4.2.2
> show dbs;
{{DB 이름}}  0.000GB
> 

다시 터미널로 나와 아이디와 비밀번호 옵션을 줘서 접속해보면 잘 접속이 되는 것을 확인하실 수 있습니다. 

> db.createUser({user: "developer", pwd:"developer", roles:["readWrite"]});
Successfully added user: { "user" : "developer", "roles" : [ "readWrite" ] }

mongoose 백엔드 프로젝트에 적용

프로젝트에 적용할 계정을 하나 더 만듭니다. 이번엔 루트권한이 아닌 readWrite 권한입니다. 이번에도 본인이 사용할 db를 'use db 이름' 해서 user를 생성합니다.

mongo -u developer -p developer {{아이피주소}}/{{DB 이름}}

다시 잘 접속이 되는지 확인해 본 후 자신의 프로젝트의 mongoose.connect를 다음과 같이 수정합니다.

const { PORT, MONGO_URI, USER, PASS } = process.env;

mongoose
  .connect(MONGO_URI, {
    useNewUrlParser: true,
    useFindAndModify: false,
    user: USER,
    pass: PASS,
    useMongoClient: true
  })
  .then(() => {
    console.log('Connected to MongoDB');
  })
  .catch(e => {
    console.error(e);
  });

이후 다시 서버를 실행시키거나 배포 후 프론트에서 서버가 디비에 잘 연결되었는지 확인해보면 잘 될거에요! 긴 글 읽어주셔서 감사합니다.

728x90
반응형

댓글