클라우드 Cloud/아마존웹서비스 AWS

Q. AWS EC2에 설치한 MongoDB를 하루에 한번씩 백업해서 S3에 저장하는 방법은?

Tap to restart 2022. 8. 7. 23:00
반응형

A. MongoDB 백업 코드를 작성하고, crontab에 추가해서 날마다 특정시간에 해당 코드가 EC2에서 실행하도록 하면 된다.

 

아래 글 3개를 차례대로 학습하면 쉽게 구현할 수 있다!

Q. MongoDB 데이터베이스 백업Dump과 복원Restore 하는 방법은?

Q. Python으로 AWS S3에서 파일 업로드 다운로드 하는 방법은?

Q. cron이란? ubuntu에서 crontab 사용법은?

 

 

S3 버킷 만들기

먼저 S3 버킷을 하나 만든다. 

 

이름은 전세계에서 겹치면 안 되므로, 계정을 붙이든 겹치지 않도록 만들면 된다.

내 경우 taptorestart-mongodb-backup이라고 만들었다. 

 

create-bucket

 

ec2에 접속

mongodb가 설치된 ec2에 접속한다. 또는 다른 ec2에 접속해도 작동한다. 

내 경우 mongodb가 설치된 ec2에 접속했다. 

 

아래는 예시다. 실제 데이터를 넣어야 한다.

AWS_ACCESS_KEY_ID=당신의AWS ACCESS KEY
AWS_SECRET_ACCESS_KEY=당신의 SECRET ACCESS KEY
MONGODB_HOST=3.35.154.100:27017
MONGODB_USERNAME=taptorestart
MONGODB_PASSWORD=password
MONGODB_DB=test
REGION_NAME=ap-northeast-2
S3_BUCKET=taptorestart-mongodb-backup

MONGODB_HOST의 경우 mongodb가 설치된 ec2라면 localhost:27017로 하면 된다.

 

.env 파일을 추가한다. 

$ vi .env

esc 누르고 :wq 를 눌러서 저장하고 나온다. 

 

몽고DB 백업 - AWS S3 업로드 코드 

코드는 Dump mongoDB and upload to AWS S3 bucket gist를 가면 좀 더 쉽게 복사할 수 있다.

 

import os
import logging
import boto3
import datetime
from botocore.exceptions import ClientError

from dotenv import load_dotenv

load_dotenv()

AWS_ACCESS_KEY_ID = os.environ.get('ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('SECRET_ACCESS_KEY')
MONGODB_HOST = os.environ.get('MONGODB_HOST')
MONGODB_USERNAME = os.environ.get('MONGODB_USERNAME')
MONGODB_PASSWORD = os.environ.get('MONGODB_PASSWORD')
MONGODB_DB = os.environ.get('MONGODB_DB')
REGION_NAME = os.environ.get('REGION_NAME')
S3_BUCKET = os.environ.get('S3_BUCKET')


def upload_file_to_s3(bucket, filename, object_name):
    s3_client = boto3.client(
        service_name='s3', region_name=REGION_NAME, aws_access_key_id=AWS_ACCESS_KEY_ID,
        aws_secret_access_key=AWS_SECRET_ACCESS_KEY
    )
    try:
        response = s3_client.upload_file(filename, bucket, object_name)
    except ClientError as e:
        logging.error(e)
    return object_name


def dump_mongodb():
    today_date = datetime.date.today()
    host = MONGODB_HOST
    username = MONGODB_USERNAME
    password = MONGODB_PASSWORD
    db = MONGODB_DB
    dump_filename = f"{today_date}_{db}_dump"
    authentication_database = "admin"
    dump_command = f'mongodump --host={host} --username={username} --password={password} ' \
                   f'--db={db} --authenticationDatabase={authentication_database} --archive={dump_filename}'
    os.system(dump_command)
    return dump_filename


if __name__ == '__main__':
    bucket = S3_BUCKET
    dump_filename = dump_mongodb()
    uploaded_file = upload_file_to_s3(bucket=bucket, filename=dump_filename, object_name=dump_filename)
    os.remove(dump_filename)

우선 로컬에서 실행해보자. 로컬에도 프로젝트 루트 디렉터리에 .env 파일을 추가하자. 그리고 실행하자.

 

그럼 업로드가 잘 된 것을 확인할 수 있다.

 

잘 작동하는 것을 확인했으니 ec2 접속해서도 해보자.

vi dump_mongodb_and_upload_to_s3.py 란 파일을 만들고 위 소스코드를 그대로 복사하자.

 

필요한 파이썬 팩키지를 설치해야 한다. 

전역으로 설치할 경우 

$ sudo apt install python3-pip
$ python3 -m pip install pymongo==4.2.0
$ python3 -m pip install boto3==1.24.46
$ python3 -m pip install python-dotenv==0.20.0

위처럼 하면 된다. 당연히 설치를 안 하면 에러가 난다.

또는 디렉터리를 만들어서 파이썬 가상환경을 따로 만들어도 좋다.

 

ec2에서도 당연히 아래처럼 실행했을 때 정상 작동해야 한다.

 

 

crontab 등록

이제 crontab에 등록만 하면 된다!

 

crontab -e

를 눌러서 등록하자. 

일단 매분마다 작동하도록 하자. 

 

아래처럼 등록하면 된다.

* * * * * python3 /home/ubuntu/dump_mongodb_and_upload_to_s3.py

 

이제 cron을 재실행하자.

$ sudo service cron restart

 

아까 업로드된 백업 파일을 삭제하고, 1분을 기다리자.

 

이렇게 없다가

 

1분이 지나자 생긴 것을 볼 수 있다.

 

 

crontab -e를 눌러서 cron 명령어를 수정하자.

0분 1시에 날마다 작동하게 된다.

0 1 * * * python3 /home/ubuntu/dump_mongodb_and_upload_to_s3.py

 

이제 데이터 유실 걱정 없이 ec2에 mongodb를 설치해서 사용할 수 있게 되었다.

반응형