Canvas 1 Layer 1

AWS, 몽고DB 호환 아마존 도큐먼트DB 발표

아마존 웹 서비스에서는 다양한 매니지드 데이터베이스를 서비스하고 있습니다. 전통적인 RDBMS를 서비스하는 AWS RDS를 비롯해 매니지드 캐시 서비스 엘라스틱캐시Amazon Elasticache, 키-밸류 스토어 다이나모DBDynamoDB, 그래프 데이터베이스 아마존 넵튠Amazon Neptune, 데이터 웨어하우스 서비스 레드시프트Amazon Redshift 등이 있습니다. 하지만 여기에 항상 한 가지 아쉬웠던 점이 바로 몽고DB와 같은 문서 데이터베이스 서비스가 없다는 점이었습니다. AWS에서는 2019년 1월 9일 몽고DB 호환 문서 데이터베이스인 아마존 도큐먼트DBAmazon DocumentDB를 발표했습니다.

도큐먼트DB는 몽고DB 3.6과 호환되는 데이터베이스로 몽고 셸을 비롯한 몽고DB의 도구나 드라이버를 그대로 사용할 수 있습니다. 하지만 몽고DB가 아닌 몽고DB 호환이라고 이야기하고 있는만큼, 기존 시스템을 이전하거나 몽고DB 대신 도입하고자 하는 경우 아마존의 도큐먼트DB 공식 문서를 좀 더 자세히 확인할 필요가 있어보입니다. 이 소식에 관한 좀 더 자세한 내용은 AWS 블로그와 공식 사이트를 참고해주시기 바랍니다.

현재 도큐먼트DB를 사용가능한 리전은 다음 4개 리전입니다: 버지니아(US East, N. Virginia), 오하이오(US East, Ohio), 오레곤(US West, Oregon), 아일랜드(Europe, Ireland)

웹콘솔에서 도큐먼트 DB 생성하기

이 글에서는 도큐먼트DB의 간단히 사용법을 소개해보겠습니다. 1월 10일(한국 시간) 현재 도큐먼트DB를 지원하는 리전에서는 웹콘솔에 도큐먼트DB가 추가되어있습니다. 웹콘솔에서 바로 도큐먼트DB 클러스터를 생성해볼 수 있습니다. 여기서는 오레곤 리전에서 도큐먼트DB를 생성해봅니다.

AWS 웹콘솔의 도큐먼트DB 서비스
AWS 웹콘솔의 도큐먼트DB 서비스

클러스터 생성은 간단하게 이루어집니다. 클러스터 이름Cluster identifier, 인스턴스 클래스Instance Class, 인스턴스 대수Number of instances, 마스터 사용자이름Master username, 마스터 패스워드Master password를 지정하고 인스턴스 생성을 진행합니다. VPC와 서브넷을 비롯한 네트워크 설정 변경이 필요한 경우 맨 아래의 고급 설정 보기Show advanced settings 토글을 활성화합니다.

도큐먼트DB 생성 화면
도큐먼트DB 생성 화면

도큐먼트DB의 인스턴스 사이즈는 현재 db.r4.large부터 db r4.16xlarge까지 지원하고 있습니다. 또한 도큐먼트DB는 기본적으로 클러스터로 생성되기 때문에 인스턴스를 최소한 3대 실행해야합니다.*

* 가장 작은 db.r4.large 3대를 한 달간 실행할 경우 50만원 이상의 비용이 발생할 수 있습니다. 데이터베이스 관련 서비스들은 다른 서비스들에 기본 비용이 높은 편이라 테스트 및 사용에 주의가 필요합니다.

도큐먼트DB 인스턴스 클래스. db.r4.large부터 db.r4.16xlarge까지 지원한다
도큐먼트DB 인스턴스 클래스. db.r4.large부터 db.r4.16xlarge까지 지원한다

클러스터를 생성하고 나면 클러스터 목록Clusters에서 확인 가능합니다.

클러스터 목록에서 새로 추가한 도큐먼트DB 클러스터를 확인할 수 있다.
클러스터 목록에서 새로 추가한 도큐먼트DB 클러스터를 확인할 수 있다.

인스턴스 목록Instances에서는 클러스터에 속한 인스턴스 3대를 확인할 수 있습니다.

인스턴스 목록에서는 클러스터에 포함된 인스턴스 3대의 목록이 출력된다
인스턴스 목록에서는 클러스터에 포함된 인스턴스 3대의 목록이 출력된다

실제로 생성을 해보면 클러스터는 거의 바로 사용가능Available 상태가 됩니다만, 인스턴스는 초기화에 조금 시간이 걸립니다. 이 인스턴스들이 만들어지는 데는 5분 정도가 걸렸던 것 같습니다. 클러스터나 인스턴스 상세정보에서 엔드포인트를 확인할 수 있습니다(엔드포인트는 쓰기용과 읽기용이 따로 있습니다).

이 주소를 nslookup에 넘겨보면 VPC 내부 아이피가 반환되는 것을 확인할 수 있습니다. VPC 외부와 내부에서 모두 같습니다. 추가적인 확인이 필요해보이지만 기본적으로 퍼블릭 접근을 허용하지 않는 것으로 보입니다.

$ nslookup docdb-2019-01-09-23-41-35.cluster-ro-ca1xojz4rjha.us-west-2.docdb.amazonaws.com
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
docdb-2019-01-09-23-41-35.cluster-ro-ca1xojz4rjha.us-west-2.docdb.amazonaws.com canonical name = docdb-2019-01-09-23-41-353.ca1xojz4rjha.us-west-2.docdb.amazonaws.com.
Name:   docdb-2019-01-09-23-41-353.ca1xojz4rjha.us-west-2.docdb.amazonaws.com
Address: 10.101.12.34

같은 VPC 내부에서 telnet을 통해 서버가 열려있는 지 확인해봅니다.

$ telnet docdb-2019-01-09-23-41-35.cluster-ca1xojz4rjha.us-west-2.docdb.amazonaws.com 27017
Trying 10.101.11.54...
Connected to docdb-2019-01-09-23-41-35.cluster-ca1xojz4rjha.us-west-2.docdb.amazonaws.com.
Escape character is '^]'.

정상적으로 접속 가능한 것을 확인할 수 있습니다.*

* 텔넷을 종료하려면 컨트롤+](^])와 컨트롤+c를 차례로 누릅니다.

몽고 셸(mongo shell)을 사용한 도큐먼트DB 접속

테스트 환경은 아마존 리눅스입니다. 몽고DB 공식 문서의 아마존 리눅스 설치법을 참고해서 몽고 셸을 설치할 수 있습니다. 문서에서는 4.0을 기준으로 합니다만 여기서는 도큐먼트DB의 호환 버전인 3.6을 기준으로 진행합니다. 다른 운영체제나 리눅스 배포판을 사용하는 경우 운영체제별 별 몽고DB 설치법 공식 문서를 참고해서 작업을 진행합니다.

먼저 /etc/yum.repos.d/mongodb-org-3.6.repo 위치에 아래 내용으로 yum에서 참조하는 저장소 정보를 추가합니다.

[mongodb-org-3.6]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc

이제 몽고DB 관련 패키지를 yum을 사용해 설치할 수 있습니다. 도큐먼트DB는 이미 동작중이기 때문에 몽고DB 서버는 필요하지 않습니다. mongodb-org-shell을 설치하면 몽고 셸만 따로 설치하는 것이 가능합니다.

$ sudo yum install mongodb-org-shell

이제 mongo 명령어를 사용할 수 있습니다. 서버에 접속하기 앞서 보안 접속을 위한 인증서를 다운로드 받아야합니다.

$ wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

이제 접속을 위한 준비는 모두 끝났습니다. 다음 명령어에서 <DOCUMENTDB_ENDPOINT>, <USERNAME>, <PASSWORD>를 적절한 값으로 변경하고 실행하면 곧바로 도큐먼트DB에 접속됩니다.

$ mongo --ssl \
  --host <DOCUMENTDB_ENDPOINT>:27017 \
  --sslCAFile rds-combined-ca-bundle.pem \
  --username <USERNAME> \
  --password <PASSWORD>

MongoDB shell version v3.6.9
connecting to: mongodb://docdb-2019-01-09-23-41-35.cluster-ca1xojz4rjha.us-west-2.docdb.amazonaws.com:27017/
Implicit session: session { "id" : UUID("c0a5d13e-dc30-44df-8eb0-3787b4ed6be8") }
MongoDB server version: 3.6.0
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
rs0:PRIMARY>

공식 문서를 참고해서 데이터를 저장하고, 불러와보겠습니다.

# 데이터 저장
rs0:PRIMARY> db.inventory.insertOne({ item: "canvas", qty: 100 })
{
        "acknowledged" : true,
        "insertedId" : ObjectId("5c368f0b77664ec656f9eb24")
}

# 데이터 검색
rs0:PRIMARY> db.inventory.find( { item: "canvas" } )
{ "_id" : ObjectId("5c368f0b77664ec656f9eb24"), "item" : "canvas", "qty" : 100 }

정상적으로 동작합니다!

테스트를 마치면 클러스터를 삭제해줍니다. 클러스터 목록에서 바로 삭제는 불가능한 것으로 보입니다. 인스턴스 목록에서 3대의 인스턴스를 모두 삭제해주면 됩니다. 마지막 인스턴스를 지울 때는 delete entire cluster를 입력해야만 삭제가 됩니다.

여기까지 AWS에서 새로 출시된 도큐먼트DB의 사용법을 알아보았습니다.