본문 바로가기

쉘스크립트/💻 간단한 프로그래밍

(Shellscript) 쉘스크립트 Postgresql 오늘날짜로 dump파일 생성하고 해당 파일을 S3 버킷에 전송하기

# 오늘날짜로 Postgresql 덤프파일 생성하기

1. 금일 날짜 얻어오는 방법은 아래와 같다.

today=$(date "+%Y%m%d")
echo "sample_${today}.txt"

> 결과
$ sample_20201031.txt

- 오늘 날짜와 시간 구하는 스크립트

echo “오늘시간”
time=`date +%Y-%m-%d” “%H:%M:%S`
echo $time

2. Postgre dump 파일 생성

- 아래의 명령어로 생성 시 권한 오류가 발생 할 수 있다.

pg_dump -U postgres test_db > db_backup.sql

- 권한 오류 해결

pg_dump wikijs > ~/db_backup_wikijs.sql

cd ~

~의 경로는 /var/lib/postgresql 이다.

- 적용

echo “오늘시간”
time=`date +%Y-%m-%d” “%H:%M:%S`
echo $time

pg_dump -U postgres test_db > ~/db_backup_${time}.sql

- 덤프 파일을 S3에 업로그 해야하므로 아래 명령어를 통해 새로운 폴더를 생성한다.

mkdir transfer-to-s3

-  최종 스크립트는 아래와 같다.

echo "Postgresql DB Backup Start!!"

echo "################################################"

echo “오늘시간”

time=$(date +"%Y%m%d-:%H:%M:%S")

echo "현재 시간은 아래와 같다."

echo $time

echo "pg_dump를 활용하여 DB를 백업 합니다."

echo "저장 경로는 :: /var/lib/postgresql/backup_script 입니다. "

pg_dump db_name > ~/db_backup_${time}.sql

echo "AWS S3로 백업"

sleep 3

pg_dump db_name > ~/transfer-to-s3/db_backup_s3.sql

echo "DB 백업을 완료 하였습니다."

3. Crontab을 활용한 스케줄링

- 매일 23시 30분에 실행하도록 스케줄링 하기

- 기본 명령어는 아래와 같다.

  30 23 * * * <SHELL_PATH>
  분 시 일 월 요일 쉘스크립트경로

- 예시는 아래와같다.

* * * * * 매일 1분마다 실행
5 * * * * 매일 매시간 05분에 실행 (1시간 간격으로 실행)
*/5 * * * * 매일 5분마다 실행
*/10 * * * * 매일 10분마다 실행
0,10,20,30,40,50 * * * * 매일 10분마다 실행
0 18 * * * 매일 18시 00분에 실행
45 22 * * * 매일 22시 45분에 실행
28 03 * * * 매일 03시 28분에 실행
* 1 * * * 매일 01시 00분 ~ 01시 59분 사이에 1분 간격으로 실행
0 */1 * * * 매일 1시간 간격으로 실행 (매시간 00분)
0 */12 * * * 매일 12시간마다 실행
0 6,12 * * * 매일 06시, 12시에 실행
10 2-5 * * * 매일 02시 ~ 05시 사이 매시간 10분에 실행
(02시 10분, 03시 10분, 04시 10분, 05시 10분)
5 8-20/3 * * * 매일 08시 ~ 20시 사이 3시간 간격으로 05분에 실행
(08시 05분, 11시 05분, 14시 05분, 17시 05분, 20시 05분)
42 4 10 * * 매달 10일 04시 42분에 실행
30 5 1,15 * * 매달 1일과 15일 05시 30분에 실행
0-10 17 1 * * 매달 1일 17시 00분 ~ 17시 10분까지 1분 단위로 실행
0 17 * * 1 매주 월요일 17시 00분에 실행
0,10 17 * * 0,2,3 매주 일, 화, 수요일 17시 00분과 17시 10분에 실행
0 0 1,15 * 1 매달 1일과 15일 그리고 월요일 24시 00분에 실행
0 6,12 * * 0,3 수, 일요일마다 06시, 12시에 실행
0 21 * * 1-6 월 ~ 토 21시 00분에 실행

- crontab -e 명령어로 작성하기

# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

30 23 * * * /postgresql/backup_script/backup_script.sh

- 파이썬 boto3 라이브러리 설치하기

# pip 설치
sudo apt install python3-pip

# boto3 라이브러리 설치
pip install boto3

- 이제 python3 명령어로 python 확장자를 실행 할 수 있다.

4. python을 활용하여 dump 파일을 S3에 업로드 하기

- IAM 권한 부여하기 s3:PutBucketPolicy 권한을 부여한다.

정책 생성기를 클릭하여 원하는 정책을 생성한다.\

- 생성된 정책 예제는 아래와 같다.

{
	"Version": "2012-10-17",
	"Id": "Policy11111111111111",
	"Statement": [
		{
			"Sid": "Stmt11111111111111",
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::11111111111111:user/test"
			},
			"Action": "s3:PutBucketPolicy",
			"Resource": "arn:aws:s3:::db-backup-s3"
		}
	]
}

- S3 버킷을 생성 후 아래의 권한을 부여한다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::your-bucket-name/*"
    }
  ]
}

- 코드작성

import boto3

AWS_ACCESS_KEY_ID = "AAAAAAAAAAAAAAAA"
AWS_SECRET_ACCESS_KEY = "mmmmmmmmmmmmmmmmmmmmmmmmmmmmmm"
AWS_DEFAULT_REGION = "ap-northeast-2"
client = boto3.client('s3',
                      aws_access_key_id=AWS_ACCESS_KEY_ID,
                      aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                      region_name=AWS_DEFAULT_REGION
                      )

file_name = 'db_backup_s3.sql'
bucket = 'db-backup-s3'
key = 'db_backup_s3.sql'

client.upload_file(file_name, bucket, key)

- 최종코드는 아래와 같다.

import boto3
import os
from datetime import datetime

current_time = datetime.now()
print(current_time)


AWS_ACCESS_KEY_ID = "1111111111111111111111111111"
AWS_SECRET_ACCESS_KEY = "11111111111111111111111111111111111111111"
AWS_DEFAULT_REGION = "ap-northeast-2"
client = boto3.client('s3',
                      aws_access_key_id=AWS_ACCESS_KEY_ID,
                      aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                      region_name=AWS_DEFAULT_REGION
                      )

file_name = 'db_backup_s3.sql'
bucket = 'db-backup-s3'
key = 'db_backup_s3.sql'

file_old_name = 'db_backup_s3.sql'
file_new_name = file_name + str(current_time)
os.rename(file_old_name, file_new_name)
print(file_new_name)

#upload_name = file_name + str(current_time)
client.upload_file(file_new_name, bucket, file_new_name)

- 실행

python3 transfer-to-s3.py

- 결과, 정상 업로드 확인

5. transfer-to-s3.py 파일을 crontab에 등록하기

- 위에 쉘에서 dump 파일을 23시30분에 생성한다.

s3로 업로드는 23시45분에 하도록 크론탭을 만든다.

45 23 * * * /postgresql/transfer-to-s3/transfer-to-s3.py

- crontab의 최종 코드는 아래와 같다.

# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

30 23 * * * /postgresql/backup_script/backup_script.sh

45 23 * * * /postgresql/transfer-to-s3/transfer-to-s3.py

6 결론

- 이제 매일 23시30분에 postgresql dump 파일이 생성되고 23시45분에 생성된 dumpfile이 s3버킷에 자동으로 업로드 된다.