2023-07-18 09:22:49 +09:00

75 lines
3.6 KiB
Python

"""実消化&アルトマークダンプ復元スクリプト"""
import os
import re
import subprocess
import textwrap
from src.logging.get_logger import get_logger
from src.system_var import constants, environment
logger = get_logger('実消化&アルトマークダンプ復元スクリプト')
def exec():
try:
logger.info('実消化&アルトマークダンプ復元スクリプト:開始')
# MySQL接続情報を作成する
my_cnf_file_content = f"""
[client]
user={environment.DB_USERNAME}
password={environment.DB_PASSWORD}
host={environment.DB_HOST}
"""
# my.cnfファイルのパス
my_cnf_path = os.path.join('my.cnf')
# my.cnfファイルを生成する
with open(my_cnf_path, 'w') as f:
f.write(textwrap.dedent(my_cnf_file_content)[1:-1])
# 復元対象のダンプファイルを特定
s3_file_path = environment.JSKULT_BACKUP_DUMP_S3_FILE_PATH
# S3 URIになっているか確認
s3_file_path_pattern = r"s3://([\w-]+)/dump/(\d{4})/(\d{2})/(\d{2})/backup_rds_(\d+).gz"
if re.match(s3_file_path_pattern, s3_file_path) is None:
logger.warning('環境変数[JSKULT_BACKUP_DUMP_S3_FILE_PATH]に指定された、S3 URIの形式が不正です。')
return constants.BATCH_EXIT_CODE_SUCCESS
# aws s3 cpコマンドを実行してdumpファイルを標準出力に取得する
s3_cp_process = subprocess.Popen(['aws', 's3', 'cp', s3_file_path, '-'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# gunzipコマンドを実行してdumpファイルを解凍する
gunzip_process = subprocess.Popen(['gzip', '-c'], stdin=s3_cp_process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# mysqldumpコマンドを実行し、dumpを取得する
mysql_process = subprocess.Popen(
['mysql', f'--defaults-file={my_cnf_path}', '-P', f"{environment.DB_PORT}", environment.DB_SCHEMA],
stdin=gunzip_process.stdout, stderr=subprocess.PIPE
)
# aws s3 cpの標準出力をgunzipに接続したため、標準出力をクローズする
s3_cp_process.stdout.close()
# gunzipの標準出力をaws mysqlに接続したため、標準出力をクローズする
gunzip_process.stdout.close()
# パイプラインを実行し、エラーハンドリング
_, error = s3_cp_process.communicate()
if s3_cp_process.returncode != 0:
logger.error(f'`aws s3 cp`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}')
return constants.BATCH_EXIT_CODE_SUCCESS
_, error = gunzip_process.communicate()
if gunzip_process.returncode != 0:
logger.error(f'`gunzip`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}')
return constants.BATCH_EXIT_CODE_SUCCESS
_, error = mysql_process.communicate()
if mysql_process.returncode != 0:
logger.error(f'`mysql`実行時にエラーが発生しました。{"" if error is None else error.decode("utf-8")}')
return constants.BATCH_EXIT_CODE_SUCCESS
logger.info('[NOTICE]実消化&アルトマークダンプ復元スクリプト:終了(正常終了)')
return constants.BATCH_EXIT_CODE_SUCCESS
except Exception as e:
logger.exception(f'実消化&アルトマークダンプ復元スクリプト中に想定外のエラーが発生しました :{e}')
return constants.BATCH_EXIT_CODE_SUCCESS