From e4ab956fa8acb5f505ca44d32776469561f18865 Mon Sep 17 00:00:00 2001 From: Y_SAKAI Date: Tue, 24 May 2022 14:29:47 +0900 Subject: [PATCH 01/10] =?UTF-8?q?feat:=E6=96=B0=E8=A6=8F=E6=A9=9F=E8=83=BD?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=81=AE=E3=81=9F=E3=82=81=E3=80=81=E4=BB=A5?= =?UTF-8?q?=E4=B8=8B=E3=81=AELambda=E3=82=BD=E3=83=BC=E3=82=B9=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=9F=20=E2=86=92SAP=5Fsup?= =?UTF-8?q?=E5=8F=97=E9=A0=98=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E5=87=A6?= =?UTF-8?q?=E7=90=86=EF=BC=88=E6=9C=88=E6=AC=A1=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ct-lambda-sap-sup-receive-check-monthly.py | 192 ++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 lambda/mbj-newdwh2021-product-lambda-sap-sup-receive-check-monthly.py diff --git a/lambda/mbj-newdwh2021-product-lambda-sap-sup-receive-check-monthly.py b/lambda/mbj-newdwh2021-product-lambda-sap-sup-receive-check-monthly.py new file mode 100644 index 00000000..024b8a9c --- /dev/null +++ b/lambda/mbj-newdwh2021-product-lambda-sap-sup-receive-check-monthly.py @@ -0,0 +1,192 @@ +import os +import datetime +import boto3 +import io +import re +import sys + +# 環境変数 +CHECK_BUCKET_NAME = os.environ["CHECK_BUCKET_NAME"] +CONFIG_BUCKET_NAME = os.environ["CONFIG_BUCKET_NAME"] +RECEIVE_MONTHLY_FILE_NAME_LIST_PATH = os.environ["RECEIVE_MONTHLY_FILE_NAME_LIST_PATH"] +MONTHLY_CEHCK_DAY_LIST_PATH = os.environ["MONTHLY_CEHCK_DAY_LIST_PATH"] +NOTICE_MAIL_TITLE_TEMPLATE_PATH = os.environ["NOTICE_MAIL_TITLE_TEMPLATE_PATH"] +NOTICE_MAIL_BODY_TEMPLATE_PATH = os.environ["NOTICE_MAIL_BODY_TEMPLATE_PATH"] +MBJ_SAP_NOTICE_TOPIC = os.environ["MBJ_SAP_NOTICE_TOPIC"] +MAIL_BODY_REPLACE_SYMBOL = os.environ["MAIL_BODY_REPLACE_SYMBOL"] +NDS_NOTICE_TOPIC = os.environ["NDS_NOTICE_TOPIC"] +NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] + +# 定数 +ROW_COMMENT_SYMBOL = '#' + +# 変数 +s3_client = boto3.client('s3') +s3_resource = boto3.resource('s3') +sns_client = boto3.client('sns') +mail_msg = '' + + +def lambda_handler(event, context): + try: + # ① 処理開始ログを出力する + info_log('I-01-01', '処理開始 SAP_supデータ受領チェック処理(月次)') + datetoday = datetime.date.today() + today = datetoday.strftime('%Y/%m/%d') + month = f'{datetoday.strftime("%Y")}/{datetoday.strftime("%m")}' + info_log('I-01-02', f'処理稼働日:{today}') + + # ② 営業日チェック処理を行う + info_log('I-02-01', 'チェック処理実施指定日確認処理開始') + + # 1.設定ファイル[チェック処理実施指定日ファイル]を読み込む + try: + info_log('I-02-02', f'チェック処理実施指定日ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{MONTHLY_CEHCK_DAY_LIST_PATH}') + monthly_day_obj = s3_resource.Object(CONFIG_BUCKET_NAME, MONTHLY_CEHCK_DAY_LIST_PATH) + monthly_day_response = monthly_day_obj.get() + info_log('I-02-03', 'チェック処理実施指定日ファイルを読み込みました') + except Exception as e: + error_log('E-02-01', 'チェック処理実施指定日設定ファイルの読み込みに失敗しました') + error_process('E-02-01', e) + + # 2.処理稼働日が「1」で読み込んだ「チェック処理実施指定日ファイル」に存在するか確認する + try: +# today = datetime.date.today() + info_log('I-02-04', f'本日がチェック処理実施指定日か確認します 確認日:{today}') + check_date_list = [] + for i, row in io.TextIOWrapper(io.BytesIO(monthly_day_response["Body"].read()), encoding='utf-8'): + if row[0] == ROW_COMMENT_SYMBOL: + continue + date = row.split('/') + check_date = datetime.date(int(date[0]), int(date[1]), int(date[2])).strftime('%Y/%m/%d') + check_date_list.append(check_date) + if today in check_date_list: + info_log('I-02-05', '本日はチェック処理実施指定日のため、チェック処理を実施します') + else: + info_log('I-02-06', '本日はチェック処理実施指定日ではないため、チェック処理をスキップします') + sys.exit() + except Exception as e: + error_log('E-02-02', f'チェック処理実施指定日設定ファイルに不備があります 行数:{i}') + error_process('E-02-02', e) + + # ③ 設定ファイル[SAP_supI/Fファイルネーム設定ファイル(月次)]を読み込む + try: + info_log('I-03-01', f'月次I/Fファイルネーム設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{RECEIVE_MONTHLY_FILE_NAME_LIST_PATH}') + receive_monthly_file_name_obj = s3_resource.Object(CONFIG_BUCKET_NAME, RECEIVE_MONTHLY_FILE_NAME_LIST_PATH) + receive_monthly_file_name_response = receive_monthly_file_name_obj.get() + info_log('I-03-02', '月次I/Fファイルネーム設定ファイルを読み込みました') + except Exception as e: + error_log('E-03-01', '月次I/Fファイルネーム設定ファイルの読み込みに失敗しました', e) + error_process('E-03-01', e) + + # ④ 月次チェック処理を行う + info_log('I-04-01', '月次チェック処理開始') + + # 1.オブジェクトリストを取得する + info_log('I-04-02', f'オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{month}/') + object_prefix = f'{month}/' + object_list = s3_resource.Bucket(CHECK_BUCKET_NAME).objects.filter(Prefix=object_prefix) + + # 2.月次I/Fファイルチェック処理 + info_log('I-04-03', '月次I/Fファイルチェック処理開始') + info_log('I-04-04', '取得したオブジェクトリストと月次I/Fファイルネーム設定ファイルの突き合わせを開始します') + row_count = 0 + match_count = 0 + for i, row in io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8'): + row_count = i + file_exsit = False + for object in object_list: + object_key = object.key.rsplit('/', 1) + file_name = object_key[-1] + match_result = re.fullmatch(row[0], file_name) + if match_result is not None: + file_exsit = True + break + if file_exsit == True: + match_count += 1 + info_log('I-04-05', f'月次I/Fファイルの受領を確認しました ファイル名:{file_name}') + else: + error_log('E-04-01', f'月次I/Fファイルに不足があります ファイル名:{row}') + mail_msg = mail_msg + f'  {row[1]}\n' + if row_count == match_count: + info_log('I-04-06', '月次I/Fファイルは全て受領していることを確認しました') + + # ⑤ メール通知本文に出力内容が存在するか確認する + info_log('I-05-01', 'メール送信処理開始') + + if len(mail_msg) > 0: + # 1.存在した場合 + info_log('I-05-02', f'{month} 月次I/Fファイルに不足があるため、メール送信処理を開始します') + + try: + info_log('I-05-03', f'通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_TITLE_TEMPLATE_PATH}') + mail_title_obj = s3_client.get_object(Bucket=CONFIG_BUCKET_NAME, Key=NOTICE_MAIL_TITLE_TEMPLATE_PATH) + mail_title = mail_title_obj['Body'].read().decode('utf-8') + info_log('I-05-04', '通知メール(タイトル)テンプレートファイルを読み込みました') + except Exception as e: + error_log('E-05-01', '通知メール(タイトル)テンプレートファイルの読み込みに失敗しました') + error_process('E-05-01', e) + + try: + info_log('I-05-05', f'通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_BODY_TEMPLATE_PATH}') + mail_body_obj = s3_client.get_object(Bucket=CONFIG_BUCKET_NAME, Key=NOTICE_MAIL_BODY_TEMPLATE_PATH) + mail_body_response = mail_body_obj['Body'].read().decode('utf-8') + mail_body = mail_body_response.replace(MAIL_BODY_REPLACE_SYMBOL, mail_msg) + info_log('I-05-06', '通知メール(本文)テンプレートファイルを読み込みました') + except Exception as e: + error_log('E-05-02', '通知メール(本文)テンプレートファイルの読み込みに失敗しました') + error_process('E-05-02', e) + + info_log('I-05-07', f'メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') + params = { + 'TopicArn': MBJ_SAP_NOTICE_TOPIC, + 'Subject': mail_title, + 'Message': mail_body + } + sns_client.publish(**params) + info_log('I-05-08', 'メール送信指示をしました') + else: + # 2.存在しない場合 + info_log('I-05-09', f'{month} 月次I/Fファイルに不足がなかったため、メール送信処理をスキップします') + + # ⑥ 処理終了ログを出力する + info_log('I-06-01', '処理終了 SAP_supデータ受領チェック処理(月次)') + except Exception as e: + error_log('E-99', f'想定外のエラーが発生しました エラー内容:{e}') + error_process('E-99', e) + + +def info_log(log_id, msg): + try: + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Info {log_id} {msg}') + except Exception as e: + error_log('E-99', f'想定外のエラーが発生しました エラー内容:{e}') + error_process('E-99', e) + + +def error_log(log_id, msg): + try: + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error {log_id} {msg}') + except Exception as e: + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') + error_process('E-99', e) + + +def error_process(error_log_id, exception): + try: + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-01 エラー処理開始') + + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-02 処理異常通知の送信指示をしました 通知先トピック:{NDS_NOTICE_TOPIC}') + error_msg = f'{error_log_id} のエラーが発生しました。ご確認ください\n詳細:{exception}' + params = { + 'TopicArn': NDS_NOTICE_TOPIC, + 'Subject': NDS_NOTICE_TITLE, + 'Message': error_msg + } + sns_client.publish(**params) + + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-03 エラー終了 処理を中断します') + sys.exit() + except Exception as e: + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') + sys.exit() \ No newline at end of file From 4e02590f9727483a6e034f17aa86c590d0917ae8 Mon Sep 17 00:00:00 2001 From: Y_SAKAI Date: Tue, 24 May 2022 18:02:05 +0900 Subject: [PATCH 02/10] =?UTF-8?q?fix:SAP=5Fsup=E5=8F=97=E9=A0=98=E3=83=81?= =?UTF-8?q?=E3=82=A7=E3=83=83=E3=82=AF=E5=87=A6=E7=90=86=EF=BC=88=E6=9C=88?= =?UTF-8?q?=E6=AC=A1=EF=BC=89=20=E3=83=BBproducti=E2=86=92staging=E3=81=AE?= =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E5=90=8D=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=20=E3=83=BB=E6=97=A5=E6=AC=A1=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?=E3=82=82=E3=81=A8=E3=81=AB=E3=81=97=E3=81=9F=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ct-lambda-sap-sup-receive-check-monthly.py | 192 ------------------ ...ng-lambda-sap-sup-receive-check-monthly.py | 191 +++++++++++++++++ 2 files changed, 191 insertions(+), 192 deletions(-) delete mode 100644 lambda/mbj-newdwh2021-product-lambda-sap-sup-receive-check-monthly.py create mode 100644 lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py diff --git a/lambda/mbj-newdwh2021-product-lambda-sap-sup-receive-check-monthly.py b/lambda/mbj-newdwh2021-product-lambda-sap-sup-receive-check-monthly.py deleted file mode 100644 index 024b8a9c..00000000 --- a/lambda/mbj-newdwh2021-product-lambda-sap-sup-receive-check-monthly.py +++ /dev/null @@ -1,192 +0,0 @@ -import os -import datetime -import boto3 -import io -import re -import sys - -# 環境変数 -CHECK_BUCKET_NAME = os.environ["CHECK_BUCKET_NAME"] -CONFIG_BUCKET_NAME = os.environ["CONFIG_BUCKET_NAME"] -RECEIVE_MONTHLY_FILE_NAME_LIST_PATH = os.environ["RECEIVE_MONTHLY_FILE_NAME_LIST_PATH"] -MONTHLY_CEHCK_DAY_LIST_PATH = os.environ["MONTHLY_CEHCK_DAY_LIST_PATH"] -NOTICE_MAIL_TITLE_TEMPLATE_PATH = os.environ["NOTICE_MAIL_TITLE_TEMPLATE_PATH"] -NOTICE_MAIL_BODY_TEMPLATE_PATH = os.environ["NOTICE_MAIL_BODY_TEMPLATE_PATH"] -MBJ_SAP_NOTICE_TOPIC = os.environ["MBJ_SAP_NOTICE_TOPIC"] -MAIL_BODY_REPLACE_SYMBOL = os.environ["MAIL_BODY_REPLACE_SYMBOL"] -NDS_NOTICE_TOPIC = os.environ["NDS_NOTICE_TOPIC"] -NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] - -# 定数 -ROW_COMMENT_SYMBOL = '#' - -# 変数 -s3_client = boto3.client('s3') -s3_resource = boto3.resource('s3') -sns_client = boto3.client('sns') -mail_msg = '' - - -def lambda_handler(event, context): - try: - # ① 処理開始ログを出力する - info_log('I-01-01', '処理開始 SAP_supデータ受領チェック処理(月次)') - datetoday = datetime.date.today() - today = datetoday.strftime('%Y/%m/%d') - month = f'{datetoday.strftime("%Y")}/{datetoday.strftime("%m")}' - info_log('I-01-02', f'処理稼働日:{today}') - - # ② 営業日チェック処理を行う - info_log('I-02-01', 'チェック処理実施指定日確認処理開始') - - # 1.設定ファイル[チェック処理実施指定日ファイル]を読み込む - try: - info_log('I-02-02', f'チェック処理実施指定日ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{MONTHLY_CEHCK_DAY_LIST_PATH}') - monthly_day_obj = s3_resource.Object(CONFIG_BUCKET_NAME, MONTHLY_CEHCK_DAY_LIST_PATH) - monthly_day_response = monthly_day_obj.get() - info_log('I-02-03', 'チェック処理実施指定日ファイルを読み込みました') - except Exception as e: - error_log('E-02-01', 'チェック処理実施指定日設定ファイルの読み込みに失敗しました') - error_process('E-02-01', e) - - # 2.処理稼働日が「1」で読み込んだ「チェック処理実施指定日ファイル」に存在するか確認する - try: -# today = datetime.date.today() - info_log('I-02-04', f'本日がチェック処理実施指定日か確認します 確認日:{today}') - check_date_list = [] - for i, row in io.TextIOWrapper(io.BytesIO(monthly_day_response["Body"].read()), encoding='utf-8'): - if row[0] == ROW_COMMENT_SYMBOL: - continue - date = row.split('/') - check_date = datetime.date(int(date[0]), int(date[1]), int(date[2])).strftime('%Y/%m/%d') - check_date_list.append(check_date) - if today in check_date_list: - info_log('I-02-05', '本日はチェック処理実施指定日のため、チェック処理を実施します') - else: - info_log('I-02-06', '本日はチェック処理実施指定日ではないため、チェック処理をスキップします') - sys.exit() - except Exception as e: - error_log('E-02-02', f'チェック処理実施指定日設定ファイルに不備があります 行数:{i}') - error_process('E-02-02', e) - - # ③ 設定ファイル[SAP_supI/Fファイルネーム設定ファイル(月次)]を読み込む - try: - info_log('I-03-01', f'月次I/Fファイルネーム設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{RECEIVE_MONTHLY_FILE_NAME_LIST_PATH}') - receive_monthly_file_name_obj = s3_resource.Object(CONFIG_BUCKET_NAME, RECEIVE_MONTHLY_FILE_NAME_LIST_PATH) - receive_monthly_file_name_response = receive_monthly_file_name_obj.get() - info_log('I-03-02', '月次I/Fファイルネーム設定ファイルを読み込みました') - except Exception as e: - error_log('E-03-01', '月次I/Fファイルネーム設定ファイルの読み込みに失敗しました', e) - error_process('E-03-01', e) - - # ④ 月次チェック処理を行う - info_log('I-04-01', '月次チェック処理開始') - - # 1.オブジェクトリストを取得する - info_log('I-04-02', f'オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{month}/') - object_prefix = f'{month}/' - object_list = s3_resource.Bucket(CHECK_BUCKET_NAME).objects.filter(Prefix=object_prefix) - - # 2.月次I/Fファイルチェック処理 - info_log('I-04-03', '月次I/Fファイルチェック処理開始') - info_log('I-04-04', '取得したオブジェクトリストと月次I/Fファイルネーム設定ファイルの突き合わせを開始します') - row_count = 0 - match_count = 0 - for i, row in io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8'): - row_count = i - file_exsit = False - for object in object_list: - object_key = object.key.rsplit('/', 1) - file_name = object_key[-1] - match_result = re.fullmatch(row[0], file_name) - if match_result is not None: - file_exsit = True - break - if file_exsit == True: - match_count += 1 - info_log('I-04-05', f'月次I/Fファイルの受領を確認しました ファイル名:{file_name}') - else: - error_log('E-04-01', f'月次I/Fファイルに不足があります ファイル名:{row}') - mail_msg = mail_msg + f'  {row[1]}\n' - if row_count == match_count: - info_log('I-04-06', '月次I/Fファイルは全て受領していることを確認しました') - - # ⑤ メール通知本文に出力内容が存在するか確認する - info_log('I-05-01', 'メール送信処理開始') - - if len(mail_msg) > 0: - # 1.存在した場合 - info_log('I-05-02', f'{month} 月次I/Fファイルに不足があるため、メール送信処理を開始します') - - try: - info_log('I-05-03', f'通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_TITLE_TEMPLATE_PATH}') - mail_title_obj = s3_client.get_object(Bucket=CONFIG_BUCKET_NAME, Key=NOTICE_MAIL_TITLE_TEMPLATE_PATH) - mail_title = mail_title_obj['Body'].read().decode('utf-8') - info_log('I-05-04', '通知メール(タイトル)テンプレートファイルを読み込みました') - except Exception as e: - error_log('E-05-01', '通知メール(タイトル)テンプレートファイルの読み込みに失敗しました') - error_process('E-05-01', e) - - try: - info_log('I-05-05', f'通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_BODY_TEMPLATE_PATH}') - mail_body_obj = s3_client.get_object(Bucket=CONFIG_BUCKET_NAME, Key=NOTICE_MAIL_BODY_TEMPLATE_PATH) - mail_body_response = mail_body_obj['Body'].read().decode('utf-8') - mail_body = mail_body_response.replace(MAIL_BODY_REPLACE_SYMBOL, mail_msg) - info_log('I-05-06', '通知メール(本文)テンプレートファイルを読み込みました') - except Exception as e: - error_log('E-05-02', '通知メール(本文)テンプレートファイルの読み込みに失敗しました') - error_process('E-05-02', e) - - info_log('I-05-07', f'メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') - params = { - 'TopicArn': MBJ_SAP_NOTICE_TOPIC, - 'Subject': mail_title, - 'Message': mail_body - } - sns_client.publish(**params) - info_log('I-05-08', 'メール送信指示をしました') - else: - # 2.存在しない場合 - info_log('I-05-09', f'{month} 月次I/Fファイルに不足がなかったため、メール送信処理をスキップします') - - # ⑥ 処理終了ログを出力する - info_log('I-06-01', '処理終了 SAP_supデータ受領チェック処理(月次)') - except Exception as e: - error_log('E-99', f'想定外のエラーが発生しました エラー内容:{e}') - error_process('E-99', e) - - -def info_log(log_id, msg): - try: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Info {log_id} {msg}') - except Exception as e: - error_log('E-99', f'想定外のエラーが発生しました エラー内容:{e}') - error_process('E-99', e) - - -def error_log(log_id, msg): - try: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error {log_id} {msg}') - except Exception as e: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') - error_process('E-99', e) - - -def error_process(error_log_id, exception): - try: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-01 エラー処理開始') - - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-02 処理異常通知の送信指示をしました 通知先トピック:{NDS_NOTICE_TOPIC}') - error_msg = f'{error_log_id} のエラーが発生しました。ご確認ください\n詳細:{exception}' - params = { - 'TopicArn': NDS_NOTICE_TOPIC, - 'Subject': NDS_NOTICE_TITLE, - 'Message': error_msg - } - sns_client.publish(**params) - - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-03 エラー終了 処理を中断します') - sys.exit() - except Exception as e: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') - sys.exit() \ No newline at end of file diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py new file mode 100644 index 00000000..6279c87a --- /dev/null +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py @@ -0,0 +1,191 @@ +import os +import datetime +import boto3 +import io +import re +import sys +import csv + +# 環境変数 +CHECK_BUCKET_NAME = os.environ["CHECK_BUCKET_NAME"] +CONFIG_BUCKET_NAME = os.environ["CONFIG_BUCKET_NAME"] +RECEIVE_MONTHLY_FILE_NAME_LIST_PATH = os.environ["RECEIVE_MONTHLY_FILE_NAME_LIST_PATH"] +MONTHLY_CEHCK_DAY_LIST_PATH = os.environ["MONTHLY_CEHCK_DAY_LIST_PATH"] +NOTICE_MAIL_TITLE_TEMPLATE_PATH = os.environ["NOTICE_MAIL_TITLE_TEMPLATE_PATH"] +NOTICE_MAIL_BODY_TEMPLATE_PATH = os.environ["NOTICE_MAIL_BODY_TEMPLATE_PATH"] +MBJ_SAP_NOTICE_TOPIC = os.environ["MBJ_SAP_NOTICE_TOPIC"] +MAIL_BODY_REPLACE_SYMBOL = os.environ["MAIL_BODY_REPLACE_SYMBOL"] +NDS_NOTICE_TOPIC = os.environ["NDS_NOTICE_TOPIC"] +NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] + +# 定数 +ROW_COMMENT_SYMBOL = '#' +LOG_INFO = 'Info' +LOG_ERROR = 'Error' +INDEX_REGEX = 0 +INDEX_DATA_NAME = 1 +INDEX_ROW_COMMENT_SYMBOL = 0 +INDEX_SPLIT_NUM = 0 +INDEX_LAST = -1 + +# 変数 +s3_client = boto3.client('s3') +s3_resource = boto3.resource('s3') +sns_client = boto3.client('sns') + + +def lambda_handler(event, context): + try: + # ① 処理開始ログを出力する + print_log('I-01-01', '処理開始 SAP_supデータ受領チェック処理(月次)') + datetoday = datetime.date.today() + today = datetoday.strftime('%Y/%m/%d') + month = f'{datetoday.strftime("%Y")}/{datetoday.strftime("%m")}' + print_log(LOG_INFO, 'I-01-02', f'処理稼働日:{today}') + mail_msg = '' + + # ② チェック処理実施指定日か確認を行う + print_log(LOG_INFO, 'I-02-01', 'チェック処理実施指定日確認処理開始') + + # 1.設定ファイル[チェック処理実施指定日ファイル]を読み込む + try: + print_log(LOG_INFO, 'I-02-02', f'チェック処理実施指定日ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{MONTHLY_CEHCK_DAY_LIST_PATH}') + monthly_day_obj = s3_resource.Object(CONFIG_BUCKET_NAME, MONTHLY_CEHCK_DAY_LIST_PATH) + monthly_day_response = monthly_day_obj.get() + print_log(LOG_INFO, 'I-02-03', 'チェック処理実施指定日ファイルを読み込みました') + except Exception as e: + print_log(LOG_ERROR, 'E-02-01', 'チェック処理実施指定日設定ファイルの読み込みに失敗しました') + error_process('E-02-01', e) + + # 2.処理稼働日が「②1.」で読み込んだ「チェック処理実施指定日ファイル」に存在するか確認する + try: + print_log(LOG_INFO, 'I-02-04', f'本日がチェック処理実施指定日か確認します 確認日:{today}') + check_date_list = [] + for i, row in enumerate(io.TextIOWrapper(io.BytesIO(monthly_day_response["Body"].read()), encoding='utf-8'), 1): + if row[INDEX_ROW_COMMENT_SYMBOL] == ROW_COMMENT_SYMBOL: + continue + check_date = datetime.datetime.strptime(row, "%Y/%m/%d").strftime('%Y/%m/%d') + check_date_list.append(check_date) + if today in check_date_list: + print_log(LOG_INFO, 'I-02-05', '本日はチェック処理実施指定日のため、チェック処理を実施します') + else: + print_log(LOG_INFO, 'I-02-06', '本日はチェック処理実施指定日ではないため、チェック処理をスキップします') + sys.exit() + except Exception as e: + print_log(LOG_ERROR, 'E-02-02', f'チェック処理実施指定日設定ファイルに不備があります 行数:{i}') + error_process('E-02-02', e) + + # ③ 設定ファイル[SAP_supI/Fファイルネーム設定ファイル(月次)]を読み込む + try: + print_log(LOG_INFO, 'I-03-01', f'月次I/Fファイルネーム設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{RECEIVE_MONTHLY_FILE_NAME_LIST_PATH}') + receive_monthly_file_name_obj = s3_resource.Object(CONFIG_BUCKET_NAME, RECEIVE_MONTHLY_FILE_NAME_LIST_PATH) + receive_monthly_file_name_response = receive_monthly_file_name_obj.get() + print_log(LOG_INFO, 'I-03-02', '月次I/Fファイルネーム設定ファイルを読み込みました') + except Exception as e: + print_log(LOG_ERROR, 'E-03-01', '月次I/Fファイルネーム設定ファイルの読み込みに失敗しました', e) + error_process('E-03-01', e) + + # ④ 月次チェック処理を行う + print_log(LOG_INFO, 'I-04-01', '月次チェック処理開始') + + # 1.SAP保管用バケットの処理稼働月に該当するサブフォルダにあるファイル一覧を取得する + print_log(LOG_INFO, 'I-04-02', f'オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{month}/') + object_prefix = f'{month}/' + object_list = s3_resource.Bucket(CHECK_BUCKET_NAME).objects.filter(Prefix=object_prefix) + + # 2.月次I/Fファイルチェック処理 + print_log(LOG_INFO, 'I-04-03', '月次I/Fファイルチェック処理開始') + print_log(LOG_INFO, 'I-04-04', '取得したオブジェクトリストと月次I/Fファイルネーム設定ファイルの突き合わせを開始します') + row_count = 0 + match_count = 0 + receive_monthly_file_name_body = io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8'): + for i, row in enumerate(csv.reader(receive_monthly_file_name_body, delimiter='\t'), 1): + row_count = i + file_exists = False + for object in object_list: + object_key = object.key.rsplit('/', INDEX_SPLIT_NUM) + file_name = object_key[INDEX_LAST] + match_result = re.fullmatch(row[INDEX_REGEX], file_name) + if match_result is not None: + file_exists = True + break + if file_exists == True: + match_count += 1 + print_log(LOG_INFO, 'I-04-05', f'月次I/Fファイルの受領を確認しました ファイル名:{file_name}') + else: + print_log(LOG_ERROR, 'E-04-01', f'月次I/Fファイルに不足があります ファイル名:{row[INDEX_DATA_NAME]}') + mail_msg = f'{mail_msg}  {row[INDEX_DATA_NAME]}\n' + if row_count == match_count: + print_log(LOG_INFO, 'I-04-06', '月次I/Fファイルは全て受領していることを確認しました') + + # ⑤ メール通知本文に出力内容が存在するか確認する + print_log(LOG_INFO, 'I-05-01', 'メール送信処理開始') + + if len(mail_msg) > 0: + # 1.存在した場合 + print_log(LOG_INFO, 'I-05-02', f'{month} 月次I/Fファイルに不足があるため、メール送信処理を開始します') + + try: + print_log(LOG_INFO, 'I-05-03', f'通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_TITLE_TEMPLATE_PATH}') + mail_title_obj = s3_client.get_object(Bucket=CONFIG_BUCKET_NAME, Key=NOTICE_MAIL_TITLE_TEMPLATE_PATH) + mail_title = mail_title_obj['Body'].read().decode('utf-8') + print_log(LOG_INFO, 'I-05-04', '通知メール(タイトル)テンプレートファイルを読み込みました') + except Exception as e: + print_log(LOG_ERROR, 'E-05-01', '通知メール(タイトル)テンプレートファイルの読み込みに失敗しました') + error_process('E-05-01', e) + + try: + print_log(LOG_INFO, 'I-05-05', f'通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_BODY_TEMPLATE_PATH}') + mail_body_obj = s3_client.get_object(Bucket=CONFIG_BUCKET_NAME, Key=NOTICE_MAIL_BODY_TEMPLATE_PATH) + mail_body_response = mail_body_obj['Body'].read().decode('utf-8') + mail_body = mail_body_response.replace(MAIL_BODY_REPLACE_SYMBOL, mail_msg) + print_log(LOG_INFO, 'I-05-06', '通知メール(本文)テンプレートファイルを読み込みました') + except Exception as e: + print_log(LOG_ERROR, 'E-05-02', '通知メール(本文)テンプレートファイルの読み込みに失敗しました') + error_process('E-05-02', e) + + print_log(LOG_INFO, 'I-05-07', f'メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') + params = { + 'TopicArn': MBJ_SAP_NOTICE_TOPIC, + 'Subject': mail_title, + 'Message': mail_body + } + sns_client.publish(**params) + print_log(LOG_INFO, 'I-05-08', 'メール送信指示をしました') + else: + # 2.存在しない場合 + print_log(LOG_INFO, 'I-05-09', f'{month} 月次I/Fファイルに不足がなかったため、メール送信処理をスキップします') + + # ⑥ 処理終了ログを出力する + print_log(LOG_INFO, 'I-06-01', '処理終了 SAP_supデータ受領チェック処理(月次)') + except Exception as e: + print_log(LOG_ERROR, 'E-99', f'想定外のエラーが発生しました エラー内容:{e}') + error_process('E-99', e) + + +def print_log(log_level, log_id, msg): + try: + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} {log_level} {log_id} {msg}') + except Exception as e: + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') + error_process('E-99', e) + + +def error_process(error_log_id, exception): + try: + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-01 エラー処理開始') + + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-02 処理異常通知の送信指示をしました 通知先トピック:{NDS_NOTICE_TOPIC}') + error_msg = f'{error_log_id} のエラーが発生しました。ご確認ください\n詳細:{exception}' + params = { + 'TopicArn': NDS_NOTICE_TOPIC, + 'Subject': NDS_NOTICE_TITLE, + 'Message': error_msg + } + sns_client.publish(**params) + + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-03 エラー終了 処理を中断します') + sys.exit() + except Exception as e: + print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') + sys.exit() \ No newline at end of file From 288b924b6ee156b12421d795df71b28b33086c75 Mon Sep 17 00:00:00 2001 From: Y_SAKAI Date: Tue, 24 May 2022 18:20:51 +0900 Subject: [PATCH 03/10] =?UTF-8?q?fix:SAP=5Fsup=E5=8F=97=E9=A0=98=E3=83=81?= =?UTF-8?q?=E3=82=A7=E3=83=83=E3=82=AF=E5=87=A6=E7=90=86=EF=BC=88=E6=9C=88?= =?UTF-8?q?=E6=AC=A1=EF=BC=89=20=E3=83=BB=E3=82=BD=E3=83=BC=E3=82=B9?= =?UTF-8?q?=E3=83=9F=E3=82=B9=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...j-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py index 6279c87a..34cd673f 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py @@ -98,7 +98,7 @@ def lambda_handler(event, context): print_log(LOG_INFO, 'I-04-04', '取得したオブジェクトリストと月次I/Fファイルネーム設定ファイルの突き合わせを開始します') row_count = 0 match_count = 0 - receive_monthly_file_name_body = io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8'): + receive_monthly_file_name_body = io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8') for i, row in enumerate(csv.reader(receive_monthly_file_name_body, delimiter='\t'), 1): row_count = i file_exists = False From e6f566422f4ce8c7b89d064ca730f48f2abd1d1a Mon Sep 17 00:00:00 2001 From: Y_SAKAI Date: Thu, 26 May 2022 12:04:18 +0900 Subject: [PATCH 04/10] =?UTF-8?q?fix:SAP=5Fsup=E5=8F=97=E9=A0=98=E3=83=81?= =?UTF-8?q?=E3=82=A7=E3=83=83=E3=82=AF=E5=87=A6=E7=90=86=EF=BC=88=E6=9C=88?= =?UTF-8?q?=E6=AC=A1=EF=BC=89=20=E3=83=BB=E6=97=A5=E6=AC=A1=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=83=99=E3=83=BC=E3=82=B9=E3=81=A7=E3=82=BD=E3=83=BC?= =?UTF-8?q?=E3=82=B9=E3=82=B3=E3=83=BC=E3=83=89=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ng-lambda-sap-sup-receive-check-monthly.py | 183 ++++++++++-------- 1 file changed, 106 insertions(+), 77 deletions(-) diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py index 34cd673f..0fd6d212 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py @@ -3,8 +3,9 @@ import datetime import boto3 import io import re -import sys import csv +import logging +from abc import * # 環境変数 CHECK_BUCKET_NAME = os.environ["CHECK_BUCKET_NAME"] @@ -17,165 +18,180 @@ MBJ_SAP_NOTICE_TOPIC = os.environ["MBJ_SAP_NOTICE_TOPIC"] MAIL_BODY_REPLACE_SYMBOL = os.environ["MAIL_BODY_REPLACE_SYMBOL"] NDS_NOTICE_TOPIC = os.environ["NDS_NOTICE_TOPIC"] NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] +LOG_LEVEL = os.environ["LOG_LEVEL"] # 定数 ROW_COMMENT_SYMBOL = '#' -LOG_INFO = 'Info' -LOG_ERROR = 'Error' INDEX_REGEX = 0 INDEX_DATA_NAME = 1 INDEX_ROW_COMMENT_SYMBOL = 0 -INDEX_SPLIT_NUM = 0 +INDEX_SPLIT_NUM = 1 INDEX_LAST = -1 +# メール本文に出力する不足ファイル名一覧のインデント +MAIL_INDENT = '  ' + # 変数 s3_client = boto3.client('s3') s3_resource = boto3.resource('s3') sns_client = boto3.client('sns') +# logger設定 +logger = logging.getLogger() +formatter = logging.Formatter( + '[%(levelname)s]\t%(asctime)s\t%(message)s\n', + '%Y-%m-%d %H:%M:%S' +) +for handler in logger.handlers: + handler.setFormatter(formatter) + +level = logging.getLevelName(LOG_LEVEL) +if not isinstance(level, int): + level = logging.INFO +logger.setLevel(level) + def lambda_handler(event, context): try: # ① 処理開始ログを出力する - print_log('I-01-01', '処理開始 SAP_supデータ受領チェック処理(月次)') - datetoday = datetime.date.today() - today = datetoday.strftime('%Y/%m/%d') - month = f'{datetoday.strftime("%Y")}/{datetoday.strftime("%m")}' - print_log(LOG_INFO, 'I-01-02', f'処理稼働日:{today}') + logger.info('I-01-01 処理開始 SAP_supデータ受領チェック処理(月次)') + execute_datetoday = datetime.date.today() + execute_date = execute_datetoday.strftime('%Y/%m/%d') + execute_month = f'{execute_datetoday.strftime("%Y")}/{execute_datetoday.strftime("%m")}' + logger.info(f'I-01-02 処理稼働日:{execute_date}') mail_msg = '' # ② チェック処理実施指定日か確認を行う - print_log(LOG_INFO, 'I-02-01', 'チェック処理実施指定日確認処理開始') + logger.info('I-02-01 チェック処理実施指定日確認処理開始') # 1.設定ファイル[チェック処理実施指定日ファイル]を読み込む try: - print_log(LOG_INFO, 'I-02-02', f'チェック処理実施指定日ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{MONTHLY_CEHCK_DAY_LIST_PATH}') + logger.info(f'I-02-02 チェック処理実施指定日ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{MONTHLY_CEHCK_DAY_LIST_PATH}') monthly_day_obj = s3_resource.Object(CONFIG_BUCKET_NAME, MONTHLY_CEHCK_DAY_LIST_PATH) monthly_day_response = monthly_day_obj.get() - print_log(LOG_INFO, 'I-02-03', 'チェック処理実施指定日ファイルを読み込みました') + logger.info('I-02-03 チェック処理実施指定日ファイルを読み込みました') except Exception as e: - print_log(LOG_ERROR, 'E-02-01', 'チェック処理実施指定日設定ファイルの読み込みに失敗しました') - error_process('E-02-01', e) + logger.error('E-02-01 チェック処理実施指定日設定ファイルの読み込みに失敗しました') + raise FileReadException('E-02-01', e) # 2.処理稼働日が「②1.」で読み込んだ「チェック処理実施指定日ファイル」に存在するか確認する try: - print_log(LOG_INFO, 'I-02-04', f'本日がチェック処理実施指定日か確認します 確認日:{today}') + logger.info(f'I-02-04 本日がチェック処理実施指定日か確認します 確認日:{execute_date}') check_date_list = [] - for i, row in enumerate(io.TextIOWrapper(io.BytesIO(monthly_day_response["Body"].read()), encoding='utf-8'), 1): + for row in io.TextIOWrapper(io.BytesIO(monthly_day_response["Body"].read()), encoding='utf-8'): if row[INDEX_ROW_COMMENT_SYMBOL] == ROW_COMMENT_SYMBOL: continue - check_date = datetime.datetime.strptime(row, "%Y/%m/%d").strftime('%Y/%m/%d') - check_date_list.append(check_date) - if today in check_date_list: - print_log(LOG_INFO, 'I-02-05', '本日はチェック処理実施指定日のため、チェック処理を実施します') + check_date = row.rstrip('\n') + # 日付妥当性判定 + try: + datetime.datetime.strptime(check_date, "%Y/%m/%d") + except Exception as e: + raise e + check_date_list.append(check_date) + if execute_date in check_date_list: + logger.info('I-02-05 本日はチェック処理実施指定日のため、チェック処理を実施します') else: - print_log(LOG_INFO, 'I-02-06', '本日はチェック処理実施指定日ではないため、チェック処理をスキップします') - sys.exit() + logger.info('I-02-06 本日はチェック処理実施指定日ではないため、チェック処理をスキップします') + return except Exception as e: - print_log(LOG_ERROR, 'E-02-02', f'チェック処理実施指定日設定ファイルに不備があります 行数:{i}') - error_process('E-02-02', e) + logger.error(f'E-02-02 チェック処理実施指定日設定ファイルに不備があります エラー内容:{e}') + raise CheckDayException('E-02-02', e) # ③ 設定ファイル[SAP_supI/Fファイルネーム設定ファイル(月次)]を読み込む try: - print_log(LOG_INFO, 'I-03-01', f'月次I/Fファイルネーム設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{RECEIVE_MONTHLY_FILE_NAME_LIST_PATH}') + logger.info(f'I-03-01 月次I/Fファイルネーム設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{RECEIVE_MONTHLY_FILE_NAME_LIST_PATH}') receive_monthly_file_name_obj = s3_resource.Object(CONFIG_BUCKET_NAME, RECEIVE_MONTHLY_FILE_NAME_LIST_PATH) receive_monthly_file_name_response = receive_monthly_file_name_obj.get() - print_log(LOG_INFO, 'I-03-02', '月次I/Fファイルネーム設定ファイルを読み込みました') + logger.info('I-03-02 月次I/Fファイルネーム設定ファイルを読み込みました') except Exception as e: - print_log(LOG_ERROR, 'E-03-01', '月次I/Fファイルネーム設定ファイルの読み込みに失敗しました', e) - error_process('E-03-01', e) + logger.error(f'E-03-01 月次I/Fファイルネーム設定ファイルの読み込みに失敗しました エラー内容:{e}') + raise FileReadException('E-03-01', e) # ④ 月次チェック処理を行う - print_log(LOG_INFO, 'I-04-01', '月次チェック処理開始') + logger.info('I-04-01', '月次チェック処理開始') # 1.SAP保管用バケットの処理稼働月に該当するサブフォルダにあるファイル一覧を取得する - print_log(LOG_INFO, 'I-04-02', f'オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{month}/') - object_prefix = f'{month}/' + logger.info(f'I-04-02 オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{execute_month}/') + object_prefix = f'{execute_month}/' object_list = s3_resource.Bucket(CHECK_BUCKET_NAME).objects.filter(Prefix=object_prefix) + file_list = [] + for obj in object_list: + obj_key = obj.key.rsplit('/', INDEX_SPLIT_NUM) + file_list.append(obj_key[INDEX_LAST]) # 2.月次I/Fファイルチェック処理 - print_log(LOG_INFO, 'I-04-03', '月次I/Fファイルチェック処理開始') - print_log(LOG_INFO, 'I-04-04', '取得したオブジェクトリストと月次I/Fファイルネーム設定ファイルの突き合わせを開始します') - row_count = 0 + logger.info('I-04-03 月次I/Fファイルチェック処理開始') + logger.info('I-04-04 取得したオブジェクトリストと月次I/Fファイルネーム設定ファイルの突き合わせを開始します') + row_count = sum(1 for line in open(io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8'))) match_count = 0 receive_monthly_file_name_body = io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8') - for i, row in enumerate(csv.reader(receive_monthly_file_name_body, delimiter='\t'), 1): - row_count = i + for row in csv.reader(receive_monthly_file_name_body, delimiter='\t'): file_exists = False - for object in object_list: - object_key = object.key.rsplit('/', INDEX_SPLIT_NUM) - file_name = object_key[INDEX_LAST] + for file_name in file_list: match_result = re.fullmatch(row[INDEX_REGEX], file_name) if match_result is not None: file_exists = True break if file_exists == True: match_count += 1 - print_log(LOG_INFO, 'I-04-05', f'月次I/Fファイルの受領を確認しました ファイル名:{file_name}') + logger.info(f'I-04-05 月次I/Fファイルの受領を確認しました ファイル名:{file_name}') else: - print_log(LOG_ERROR, 'E-04-01', f'月次I/Fファイルに不足があります ファイル名:{row[INDEX_DATA_NAME]}') - mail_msg = f'{mail_msg}  {row[INDEX_DATA_NAME]}\n' + logger.error(f'E-04-01 月次I/Fファイルに不足があります ファイル名:{row[INDEX_DATA_NAME]}') + mail_msg += f'{MAIL_INDENT}{row[INDEX_DATA_NAME]}\n' if row_count == match_count: - print_log(LOG_INFO, 'I-04-06', '月次I/Fファイルは全て受領していることを確認しました') + logger.info('I-04-06 月次I/Fファイルは全て受領していることを確認しました') - # ⑤ メール通知本文に出力内容が存在するか確認する - print_log(LOG_INFO, 'I-05-01', 'メール送信処理開始') + # ⑤ 「①」でメモリ保持しているメール挿入用文言に出力内容が存在するか確認する + logger.info('I-05-01 メール送信処理開始') if len(mail_msg) > 0: # 1.存在した場合 - print_log(LOG_INFO, 'I-05-02', f'{month} 月次I/Fファイルに不足があるため、メール送信処理を開始します') + logger.info(f'I-05-02 {execute_month} 月次I/Fファイルに不足があるため、メール送信処理を開始します') try: - print_log(LOG_INFO, 'I-05-03', f'通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_TITLE_TEMPLATE_PATH}') + logger.info(f'I-05-03 通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_TITLE_TEMPLATE_PATH}') mail_title_obj = s3_client.get_object(Bucket=CONFIG_BUCKET_NAME, Key=NOTICE_MAIL_TITLE_TEMPLATE_PATH) mail_title = mail_title_obj['Body'].read().decode('utf-8') - print_log(LOG_INFO, 'I-05-04', '通知メール(タイトル)テンプレートファイルを読み込みました') + logger.info('I-05-04 通知メール(タイトル)テンプレートファイルを読み込みました') except Exception as e: - print_log(LOG_ERROR, 'E-05-01', '通知メール(タイトル)テンプレートファイルの読み込みに失敗しました') - error_process('E-05-01', e) + logger.error(f'E-05-01 通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + raise FileReadException('E-05-01', e) try: - print_log(LOG_INFO, 'I-05-05', f'通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_BODY_TEMPLATE_PATH}') + logger.info(f'I-05-05 通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_BODY_TEMPLATE_PATH}') mail_body_obj = s3_client.get_object(Bucket=CONFIG_BUCKET_NAME, Key=NOTICE_MAIL_BODY_TEMPLATE_PATH) mail_body_response = mail_body_obj['Body'].read().decode('utf-8') mail_body = mail_body_response.replace(MAIL_BODY_REPLACE_SYMBOL, mail_msg) - print_log(LOG_INFO, 'I-05-06', '通知メール(本文)テンプレートファイルを読み込みました') + logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') except Exception as e: - print_log(LOG_ERROR, 'E-05-02', '通知メール(本文)テンプレートファイルの読み込みに失敗しました') - error_process('E-05-02', e) + logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + raise FileReadException('E-05-02', e) - print_log(LOG_INFO, 'I-05-07', f'メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') + logger.info(f'I-05-07 メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') params = { 'TopicArn': MBJ_SAP_NOTICE_TOPIC, 'Subject': mail_title, 'Message': mail_body } sns_client.publish(**params) - print_log(LOG_INFO, 'I-05-08', 'メール送信指示をしました') + logger.info('I-05-08 メール送信指示をしました') else: # 2.存在しない場合 - print_log(LOG_INFO, 'I-05-09', f'{month} 月次I/Fファイルに不足がなかったため、メール送信処理をスキップします') + logger.info(f'I-05-09 {execute_month} 月次I/Fファイルに不足がなかったため、メール送信処理をスキップします') # ⑥ 処理終了ログを出力する - print_log(LOG_INFO, 'I-06-01', '処理終了 SAP_supデータ受領チェック処理(月次)') + logger.info('I-06-01 処理終了 SAP_supデータ受領チェック処理(月次)') + except CustomException as e: + error_notice(e.id, e.arg) except Exception as e: - print_log(LOG_ERROR, 'E-99', f'想定外のエラーが発生しました エラー内容:{e}') - error_process('E-99', e) + logger.error(f'E-99 想定外のエラーが発生しました エラー内容:{e}') + error_notice('E-99', e) + return -def print_log(log_level, log_id, msg): +# 保守要員チーム通知 +def error_notice(error_log_id, exception) -> None: try: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} {log_level} {log_id} {msg}') - except Exception as e: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') - error_process('E-99', e) - - -def error_process(error_log_id, exception): - try: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-01 エラー処理開始') - - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-02 処理異常通知の送信指示をしました 通知先トピック:{NDS_NOTICE_TOPIC}') error_msg = f'{error_log_id} のエラーが発生しました。ご確認ください\n詳細:{exception}' params = { 'TopicArn': NDS_NOTICE_TOPIC, @@ -183,9 +199,22 @@ def error_process(error_log_id, exception): 'Message': error_msg } sns_client.publish(**params) - - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-ERR-03 エラー終了 処理を中断します') - sys.exit() + logger.error(f'E-ERR-01 処理異常通知の送信指示をしました 通知先トピック:{NDS_NOTICE_TOPIC}') except Exception as e: - print(f'{datetime.datetime.now():%Y-%m-%d %H:%M:%S} Error E-99 想定外のエラーが発生しました エラー内容:{e}') - sys.exit() \ No newline at end of file + logger.error(f'E-98 処理異常通知の送信指示に失敗しました エラー内容:{e}') + return + + +# カスタムExceptionクラス +class CustomException(Exception, metaclass=ABCMeta): + def __init__(self, id, arg): + self.arg = arg + self.id = id + + +class FileReadException(CustomException): + pass + + +class CheckDayException(CustomException): + pass From 92d6c7a59f1177a1b44e52770191777ea462e5f1 Mon Sep 17 00:00:00 2001 From: Y_SAKAI Date: Thu, 26 May 2022 13:35:08 +0900 Subject: [PATCH 05/10] =?UTF-8?q?feat:SAP=5Ffin=E5=8F=97=E9=A0=98=E3=83=81?= =?UTF-8?q?=E3=82=A7=E3=83=83=E3=82=AF=E5=87=A6=E7=90=86=EF=BC=88=E6=9C=88?= =?UTF-8?q?=E6=AC=A1=EF=BC=89=20=E3=83=BB=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=8A=E3=83=B3=E3=82=B9=E7=94=A8=E6=9C=88=E6=AC=A1=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=82=BD=E3=83=BC=E3=82=B9=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=82=92=E6=96=B0=E8=A6=8F=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ng-lambda-sap-fin-receive-check-monthly.py | 220 ++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py new file mode 100644 index 00000000..384f8bcb --- /dev/null +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py @@ -0,0 +1,220 @@ +import os +import datetime +import boto3 +import io +import re +import csv +import logging +from abc import * + +# 環境変数 +CHECK_BUCKET_NAME = os.environ["CHECK_BUCKET_NAME"] +CONFIG_BUCKET_NAME = os.environ["CONFIG_BUCKET_NAME"] +RECEIVE_MONTHLY_FILE_NAME_LIST_PATH = os.environ["RECEIVE_MONTHLY_FILE_NAME_LIST_PATH"] +MONTHLY_CEHCK_DAY_LIST_PATH = os.environ["MONTHLY_CEHCK_DAY_LIST_PATH"] +NOTICE_MAIL_TITLE_TEMPLATE_PATH = os.environ["NOTICE_MAIL_TITLE_TEMPLATE_PATH"] +NOTICE_MAIL_BODY_TEMPLATE_PATH = os.environ["NOTICE_MAIL_BODY_TEMPLATE_PATH"] +MBJ_SAP_NOTICE_TOPIC = os.environ["MBJ_SAP_NOTICE_TOPIC"] +MAIL_BODY_REPLACE_SYMBOL = os.environ["MAIL_BODY_REPLACE_SYMBOL"] +NDS_NOTICE_TOPIC = os.environ["NDS_NOTICE_TOPIC"] +NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] +LOG_LEVEL = os.environ["LOG_LEVEL"] + +# 定数 +ROW_COMMENT_SYMBOL = '#' +INDEX_REGEX = 0 +INDEX_DATA_NAME = 1 +INDEX_ROW_COMMENT_SYMBOL = 0 +INDEX_SPLIT_NUM = 1 +INDEX_LAST = -1 + +# メール本文に出力する不足ファイル名一覧のインデント +MAIL_INDENT = '  ' + +# 変数 +s3_client = boto3.client('s3') +s3_resource = boto3.resource('s3') +sns_client = boto3.client('sns') + +# logger設定 +logger = logging.getLogger() +formatter = logging.Formatter( + '[%(levelname)s]\t%(asctime)s\t%(message)s\n', + '%Y-%m-%d %H:%M:%S' +) +for handler in logger.handlers: + handler.setFormatter(formatter) + +level = logging.getLevelName(LOG_LEVEL) +if not isinstance(level, int): + level = logging.INFO +logger.setLevel(level) + + +def lambda_handler(event, context): + try: + # ① 処理開始ログを出力する + logger.info('I-01-01 処理開始 SAP_finデータ受領チェック処理(月次)') + execute_datetoday = datetime.date.today() + execute_date = execute_datetoday.strftime('%Y/%m/%d') + execute_month = f'{execute_datetoday.strftime("%Y")}/{execute_datetoday.strftime("%m")}' + logger.info(f'I-01-02 処理稼働日:{execute_date}') + mail_msg = '' + + # ② チェック処理実施指定日か確認を行う + logger.info('I-02-01 チェック処理実施指定日確認処理開始') + + # 1.設定ファイル[チェック処理実施指定日ファイル]を読み込む + try: + logger.info(f'I-02-02 チェック処理実施指定日ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{MONTHLY_CEHCK_DAY_LIST_PATH}') + monthly_day_obj = s3_resource.Object(CONFIG_BUCKET_NAME, MONTHLY_CEHCK_DAY_LIST_PATH) + monthly_day_response = monthly_day_obj.get() + logger.info('I-02-03 チェック処理実施指定日ファイルを読み込みました') + except Exception as e: + logger.error('E-02-01 チェック処理実施指定日設定ファイルの読み込みに失敗しました') + raise FileReadException('E-02-01', e) + + # 2.処理稼働日が「②1.」で読み込んだ「チェック処理実施指定日ファイル」に存在するか確認する + try: + logger.info(f'I-02-04 本日がチェック処理実施指定日か確認します 確認日:{execute_date}') + check_date_list = [] + for row in io.TextIOWrapper(io.BytesIO(monthly_day_response["Body"].read()), encoding='utf-8'): + if row[INDEX_ROW_COMMENT_SYMBOL] == ROW_COMMENT_SYMBOL: + continue + check_date = row.rstrip('\n') + # 日付妥当性判定 + try: + datetime.datetime.strptime(check_date, "%Y/%m/%d") + except Exception as e: + raise e + check_date_list.append(check_date) + if execute_date in check_date_list: + logger.info('I-02-05 本日はチェック処理実施指定日のため、チェック処理を実施します') + else: + logger.info('I-02-06 本日はチェック処理実施指定日ではないため、チェック処理をスキップします') + return + except Exception as e: + logger.error(f'E-02-02 チェック処理実施指定日設定ファイルに不備があります エラー内容:{e}') + raise CheckDayException('E-02-02', e) + + # ③ 設定ファイル[SAP_finI/Fファイルネーム設定ファイル(月次)]を読み込む + try: + logger.info(f'I-03-01 月次I/Fファイルネーム設定ファイル読込 読込元:{CONFIG_BUCKET_NAME}/{RECEIVE_MONTHLY_FILE_NAME_LIST_PATH}') + receive_monthly_file_name_obj = s3_resource.Object(CONFIG_BUCKET_NAME, RECEIVE_MONTHLY_FILE_NAME_LIST_PATH) + receive_monthly_file_name_response = receive_monthly_file_name_obj.get() + logger.info('I-03-02 月次I/Fファイルネーム設定ファイルを読み込みました') + except Exception as e: + logger.error(f'E-03-01 月次I/Fファイルネーム設定ファイルの読み込みに失敗しました エラー内容:{e}') + raise FileReadException('E-03-01', e) + + # ④ 月次チェック処理を行う + logger.info('I-04-01', '月次チェック処理開始') + + # 1.SAP保管用バケットの処理稼働月に該当するサブフォルダにあるファイル一覧を取得する + logger.info(f'I-04-02 オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{execute_month}/') + object_prefix = f'{execute_month}/' + object_list = s3_resource.Bucket(CHECK_BUCKET_NAME).objects.filter(Prefix=object_prefix) + file_list = [] + for obj in object_list: + obj_key = obj.key.rsplit('/', INDEX_SPLIT_NUM) + file_list.append(obj_key[INDEX_LAST]) + + # 2.月次I/Fファイルチェック処理 + logger.info('I-04-03 月次I/Fファイルチェック処理開始') + logger.info('I-04-04 取得したオブジェクトリストと月次I/Fファイルネーム設定ファイルの突き合わせを開始します') + row_count = sum(1 for line in open(io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8'))) + match_count = 0 + receive_monthly_file_name_body = io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8') + for row in csv.reader(receive_monthly_file_name_body, delimiter='\t'): + file_exists = False + for file_name in file_list: + match_result = re.fullmatch(row[INDEX_REGEX], file_name) + if match_result is not None: + file_exists = True + break + if file_exists == True: + match_count += 1 + logger.info(f'I-04-05 月次I/Fファイルの受領を確認しました ファイル名:{file_name}') + else: + logger.error(f'E-04-01 月次I/Fファイルに不足があります ファイル名:{row[INDEX_DATA_NAME]}') + mail_msg += f'{MAIL_INDENT}{row[INDEX_DATA_NAME]}\n' + if row_count == match_count: + logger.info('I-04-06 月次I/Fファイルは全て受領していることを確認しました') + + # ⑤ 「①」でメモリ保持しているメール挿入用文言に出力内容が存在するか確認する + logger.info('I-05-01 メール送信処理開始') + + if len(mail_msg) > 0: + # 1.存在した場合 + logger.info(f'I-05-02 {execute_month} 月次I/Fファイルに不足があるため、メール送信処理を開始します') + + try: + logger.info(f'I-05-03 通知メール(タイトル)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_TITLE_TEMPLATE_PATH}') + mail_title_obj = s3_client.get_object(Bucket=CONFIG_BUCKET_NAME, Key=NOTICE_MAIL_TITLE_TEMPLATE_PATH) + mail_title = mail_title_obj['Body'].read().decode('utf-8') + logger.info('I-05-04 通知メール(タイトル)テンプレートファイルを読み込みました') + except Exception as e: + logger.error(f'E-05-01 通知メール(タイトル)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + raise FileReadException('E-05-01', e) + + try: + logger.info(f'I-05-05 通知メール(本文)テンプレートファイル読込 読込元:{CONFIG_BUCKET_NAME}/{NOTICE_MAIL_BODY_TEMPLATE_PATH}') + mail_body_obj = s3_client.get_object(Bucket=CONFIG_BUCKET_NAME, Key=NOTICE_MAIL_BODY_TEMPLATE_PATH) + mail_body_response = mail_body_obj['Body'].read().decode('utf-8') + mail_body = mail_body_response.replace(MAIL_BODY_REPLACE_SYMBOL, mail_msg) + logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') + except Exception as e: + logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') + raise FileReadException('E-05-02', e) + + logger.info(f'I-05-07 メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') + params = { + 'TopicArn': MBJ_SAP_NOTICE_TOPIC, + 'Subject': mail_title, + 'Message': mail_body + } + sns_client.publish(**params) + logger.info('I-05-08 メール送信指示をしました') + else: + # 2.存在しない場合 + logger.info(f'I-05-09 {execute_month} 月次I/Fファイルに不足がなかったため、メール送信処理をスキップします') + + # ⑥ 処理終了ログを出力する + logger.info('I-06-01 処理終了 SAP_finデータ受領チェック処理(月次)') + except CustomException as e: + error_notice(e.id, e.arg) + except Exception as e: + logger.error(f'E-99 想定外のエラーが発生しました エラー内容:{e}') + error_notice('E-99', e) + return + + +# 保守要員チーム通知 +def error_notice(error_log_id, exception) -> None: + try: + error_msg = f'{error_log_id} のエラーが発生しました。ご確認ください\n詳細:{exception}' + params = { + 'TopicArn': NDS_NOTICE_TOPIC, + 'Subject': NDS_NOTICE_TITLE, + 'Message': error_msg + } + sns_client.publish(**params) + logger.error(f'E-ERR-01 処理異常通知の送信指示をしました 通知先トピック:{NDS_NOTICE_TOPIC}') + except Exception as e: + logger.error(f'E-98 処理異常通知の送信指示に失敗しました エラー内容:{e}') + return + + +# カスタムExceptionクラス +class CustomException(Exception, metaclass=ABCMeta): + def __init__(self, id, arg): + self.arg = arg + self.id = id + + +class FileReadException(CustomException): + pass + + +class CheckDayException(CustomException): + pass From c78ba8a24c6481aa5eeea6fa41a870361ace1c2e Mon Sep 17 00:00:00 2001 From: Y_SAKAI Date: Thu, 26 May 2022 15:02:11 +0900 Subject: [PATCH 06/10] =?UTF-8?q?fix:SAP=E5=8F=97=E9=A0=98=E3=83=81?= =?UTF-8?q?=E3=82=A7=E3=83=83=E3=82=AF=E5=87=A6=E7=90=86=20=E3=83=BB?= =?UTF-8?q?=EF=BC=97=EF=BC=94=E8=A1=8C=E7=9B=AE=E3=81=AE=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E3=83=AD=E3=82=B0=E3=81=AB=E3=82=A8=E3=82=AF=E3=82=BB?= =?UTF-8?q?=E3=83=97=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=AE=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E3=82=92=E8=A1=A8=E7=A4=BA=20=E3=83=BB=EF=BC=91=EF=BC=98?= =?UTF-8?q?=EF=BC=93=E8=A1=8C=E7=9B=AE=E3=81=AE=E5=87=A6=E7=90=86=E7=B5=82?= =?UTF-8?q?=E4=BA=86=E3=83=AD=E3=82=B0=E3=81=AE=E3=82=A4=E3=83=B3=E3=83=87?= =?UTF-8?q?=E3=83=B3=E3=83=88=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py | 4 ++-- ...newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py index 384f8bcb..9f225763 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py @@ -71,7 +71,7 @@ def lambda_handler(event, context): monthly_day_response = monthly_day_obj.get() logger.info('I-02-03 チェック処理実施指定日ファイルを読み込みました') except Exception as e: - logger.error('E-02-01 チェック処理実施指定日設定ファイルの読み込みに失敗しました') + logger.error('E-02-01 チェック処理実施指定日設定ファイルの読み込みに失敗しました エラー内容:{e}') raise FileReadException('E-02-01', e) # 2.処理稼働日が「②1.」で読み込んだ「チェック処理実施指定日ファイル」に存在するか確認する @@ -180,7 +180,7 @@ def lambda_handler(event, context): logger.info(f'I-05-09 {execute_month} 月次I/Fファイルに不足がなかったため、メール送信処理をスキップします') # ⑥ 処理終了ログを出力する - logger.info('I-06-01 処理終了 SAP_finデータ受領チェック処理(月次)') + logger.info('I-06-01 処理終了 SAP_finデータ受領チェック処理(月次)') except CustomException as e: error_notice(e.id, e.arg) except Exception as e: diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py index 0fd6d212..8e4270df 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py @@ -71,7 +71,7 @@ def lambda_handler(event, context): monthly_day_response = monthly_day_obj.get() logger.info('I-02-03 チェック処理実施指定日ファイルを読み込みました') except Exception as e: - logger.error('E-02-01 チェック処理実施指定日設定ファイルの読み込みに失敗しました') + logger.error('E-02-01 チェック処理実施指定日設定ファイルの読み込みに失敗しました エラー内容:{e}') raise FileReadException('E-02-01', e) # 2.処理稼働日が「②1.」で読み込んだ「チェック処理実施指定日ファイル」に存在するか確認する @@ -180,7 +180,7 @@ def lambda_handler(event, context): logger.info(f'I-05-09 {execute_month} 月次I/Fファイルに不足がなかったため、メール送信処理をスキップします') # ⑥ 処理終了ログを出力する - logger.info('I-06-01 処理終了 SAP_supデータ受領チェック処理(月次)') + logger.info('I-06-01 処理終了 SAP_supデータ受領チェック処理(月次)') except CustomException as e: error_notice(e.id, e.arg) except Exception as e: From cf29d0786a02a71c2d032f07c5488b1746a22ae8 Mon Sep 17 00:00:00 2001 From: Y_SAKAI Date: Fri, 27 May 2022 15:08:50 +0900 Subject: [PATCH 07/10] =?UTF-8?q?fix:SAP=E5=8F=97=E9=A0=98=E3=83=81?= =?UTF-8?q?=E3=82=A7=E3=83=83=E3=82=AF=E5=87=A6=E7=90=86=20=E3=83=BB?= =?UTF-8?q?=E3=82=BD=E3=83=BC=E3=82=B9=E3=82=B3=E3=83=BC=E3=83=89=E3=83=AC?= =?UTF-8?q?=E3=83=93=E3=83=A5=E3=83=BC=E3=81=AE=E6=8C=87=E6=91=98=E5=8F=8D?= =?UTF-8?q?=E6=98=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...wdwh2021-staging-lambda-sap-fin-receive-check-monthly.py | 6 +++--- ...wdwh2021-staging-lambda-sap-sup-receive-check-monthly.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py index 9f225763..8cb264f7 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py @@ -53,7 +53,7 @@ logger.setLevel(level) def lambda_handler(event, context): try: - # ① 処理開始ログを出力する + # ① 処理開始ログを出力する logger.info('I-01-01 処理開始 SAP_finデータ受領チェック処理(月次)') execute_datetoday = datetime.date.today() execute_date = execute_datetoday.strftime('%Y/%m/%d') @@ -71,7 +71,7 @@ def lambda_handler(event, context): monthly_day_response = monthly_day_obj.get() logger.info('I-02-03 チェック処理実施指定日ファイルを読み込みました') except Exception as e: - logger.error('E-02-01 チェック処理実施指定日設定ファイルの読み込みに失敗しました エラー内容:{e}') + logger.error(f'E-02-01 チェック処理実施指定日設定ファイルの読み込みに失敗しました エラー内容:{e}') raise FileReadException('E-02-01', e) # 2.処理稼働日が「②1.」で読み込んだ「チェック処理実施指定日ファイル」に存在するか確認する @@ -87,7 +87,7 @@ def lambda_handler(event, context): datetime.datetime.strptime(check_date, "%Y/%m/%d") except Exception as e: raise e - check_date_list.append(check_date) + check_date_list.append(check_date) if execute_date in check_date_list: logger.info('I-02-05 本日はチェック処理実施指定日のため、チェック処理を実施します') else: diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py index 8e4270df..a1a5f14b 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py @@ -53,7 +53,7 @@ logger.setLevel(level) def lambda_handler(event, context): try: - # ① 処理開始ログを出力する + # ① 処理開始ログを出力する logger.info('I-01-01 処理開始 SAP_supデータ受領チェック処理(月次)') execute_datetoday = datetime.date.today() execute_date = execute_datetoday.strftime('%Y/%m/%d') @@ -71,7 +71,7 @@ def lambda_handler(event, context): monthly_day_response = monthly_day_obj.get() logger.info('I-02-03 チェック処理実施指定日ファイルを読み込みました') except Exception as e: - logger.error('E-02-01 チェック処理実施指定日設定ファイルの読み込みに失敗しました エラー内容:{e}') + logger.error(f'E-02-01 チェック処理実施指定日設定ファイルの読み込みに失敗しました エラー内容:{e}') raise FileReadException('E-02-01', e) # 2.処理稼働日が「②1.」で読み込んだ「チェック処理実施指定日ファイル」に存在するか確認する @@ -87,7 +87,7 @@ def lambda_handler(event, context): datetime.datetime.strptime(check_date, "%Y/%m/%d") except Exception as e: raise e - check_date_list.append(check_date) + check_date_list.append(check_date) if execute_date in check_date_list: logger.info('I-02-05 本日はチェック処理実施指定日のため、チェック処理を実施します') else: From 38e0718271456aecfb18f0890a5e0ace7e502cb6 Mon Sep 17 00:00:00 2001 From: Y_SAKAI Date: Mon, 30 May 2022 15:02:26 +0900 Subject: [PATCH 08/10] =?UTF-8?q?fix:SAP=E5=8F=97=E9=A0=98=E3=83=81?= =?UTF-8?q?=E3=82=A7=E3=83=83=E3=82=AF=E5=87=A6=E7=90=86=EF=BC=88=E6=9C=88?= =?UTF-8?q?=E6=AC=A1=EF=BC=89=20=E3=83=BB=E3=82=BF=E3=82=A4=E3=83=A0?= =?UTF-8?q?=E3=82=BE=E3=83=BC=E3=83=B3=E3=81=AE=E5=A4=89=E6=9B=B4=E5=87=A6?= =?UTF-8?q?=E7=90=86=20=E3=83=BB=E9=80=9A=E7=9F=A5=E3=83=A1=E3=83=BC?= =?UTF-8?q?=E3=83=AB=E3=81=AE=E3=82=BF=E3=82=A4=E3=83=88=E3=83=AB=E3=81=AE?= =?UTF-8?q?=E6=94=B9=E8=A1=8C=E3=82=B3=E3=83=BC=E3=83=89=E5=8F=96=E3=82=8A?= =?UTF-8?q?=E9=99=A4=E3=81=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...021-staging-lambda-sap-fin-receive-check-monthly.py | 10 +++++++--- ...021-staging-lambda-sap-sup-receive-check-monthly.py | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py index 8cb264f7..3ed67422 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py @@ -6,6 +6,7 @@ import re import csv import logging from abc import * +from zoneinfo import ZoneInfo # 環境変数 CHECK_BUCKET_NAME = os.environ["CHECK_BUCKET_NAME"] @@ -38,10 +39,13 @@ sns_client = boto3.client('sns') # logger設定 logger = logging.getLogger() +def custome_time(*arg): + return datetime.datetime.now(ZoneInfo("Asia/Tokyo")).timetuple() formatter = logging.Formatter( '[%(levelname)s]\t%(asctime)s\t%(message)s\n', '%Y-%m-%d %H:%M:%S' ) +formatter.converter = custome_time for handler in logger.handlers: handler.setFormatter(formatter) @@ -122,9 +126,9 @@ def lambda_handler(event, context): # 2.月次I/Fファイルチェック処理 logger.info('I-04-03 月次I/Fファイルチェック処理開始') logger.info('I-04-04 取得したオブジェクトリストと月次I/Fファイルネーム設定ファイルの突き合わせを開始します') - row_count = sum(1 for line in open(io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8'))) - match_count = 0 receive_monthly_file_name_body = io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8') + match_count = 0 + row_count = sum(1 for line in io.BytesIO(receive_monthly_file_name_obj.get()["Body"].read())) for row in csv.reader(receive_monthly_file_name_body, delimiter='\t'): file_exists = False for file_name in file_list: @@ -170,7 +174,7 @@ def lambda_handler(event, context): logger.info(f'I-05-07 メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') params = { 'TopicArn': MBJ_SAP_NOTICE_TOPIC, - 'Subject': mail_title, + 'Subject': mail_title.rstrip('\n'), 'Message': mail_body } sns_client.publish(**params) diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py index a1a5f14b..d1ed116f 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py @@ -6,6 +6,7 @@ import re import csv import logging from abc import * +from zoneinfo import ZoneInfo # 環境変数 CHECK_BUCKET_NAME = os.environ["CHECK_BUCKET_NAME"] @@ -38,10 +39,13 @@ sns_client = boto3.client('sns') # logger設定 logger = logging.getLogger() +def custome_time(*arg): + return datetime.datetime.now(ZoneInfo("Asia/Tokyo")).timetuple() formatter = logging.Formatter( '[%(levelname)s]\t%(asctime)s\t%(message)s\n', '%Y-%m-%d %H:%M:%S' ) +formatter.converter = custome_time for handler in logger.handlers: handler.setFormatter(formatter) @@ -122,9 +126,9 @@ def lambda_handler(event, context): # 2.月次I/Fファイルチェック処理 logger.info('I-04-03 月次I/Fファイルチェック処理開始') logger.info('I-04-04 取得したオブジェクトリストと月次I/Fファイルネーム設定ファイルの突き合わせを開始します') - row_count = sum(1 for line in open(io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8'))) - match_count = 0 receive_monthly_file_name_body = io.TextIOWrapper(io.BytesIO(receive_monthly_file_name_response["Body"].read()), encoding='utf-8') + match_count = 0 + row_count = sum(1 for line in io.BytesIO(receive_monthly_file_name_obj.get()["Body"].read())) for row in csv.reader(receive_monthly_file_name_body, delimiter='\t'): file_exists = False for file_name in file_list: @@ -170,7 +174,7 @@ def lambda_handler(event, context): logger.info(f'I-05-07 メール送信指示をします 送信先トピック:{MBJ_SAP_NOTICE_TOPIC}') params = { 'TopicArn': MBJ_SAP_NOTICE_TOPIC, - 'Subject': mail_title, + 'Subject': mail_title.rstrip('\n'), 'Message': mail_body } sns_client.publish(**params) From 7573891095517fcbca0bdcfe0466ad0b323c2620 Mon Sep 17 00:00:00 2001 From: Y_SAKAI Date: Mon, 30 May 2022 16:43:56 +0900 Subject: [PATCH 09/10] =?UTF-8?q?fix:SAP=E3=83=87=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E6=9C=88=E6=AC=A1=E5=8F=97=E9=A0=98=E3=83=81=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=82=AF=E5=87=A6=E7=90=86=20=E3=83=BB=E8=A9=B3=E7=B4=B0?= =?UTF-8?q?=E3=81=AA=E3=83=88=E3=83=AC=E3=83=BC=E3=82=B9=E3=83=90=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=81=8C=E5=87=BA=E5=8A=9B=E3=81=95=E3=82=8C=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F=E3=81=9F=E3=82=81?= =?UTF-8?q?=E3=80=81=E5=87=BA=E5=8A=9B=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E4=BF=AE=E6=AD=A3=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py | 4 ++++ ...newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py index 3ed67422..2e002860 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py @@ -7,6 +7,7 @@ import csv import logging from abc import * from zoneinfo import ZoneInfo +import traceback # 環境変数 CHECK_BUCKET_NAME = os.environ["CHECK_BUCKET_NAME"] @@ -186,9 +187,11 @@ def lambda_handler(event, context): # ⑥ 処理終了ログを出力する logger.info('I-06-01 処理終了 SAP_finデータ受領チェック処理(月次)') except CustomException as e: + traceback.print_exc() error_notice(e.id, e.arg) except Exception as e: logger.error(f'E-99 想定外のエラーが発生しました エラー内容:{e}') + traceback.print_exc() error_notice('E-99', e) return @@ -206,6 +209,7 @@ def error_notice(error_log_id, exception) -> None: logger.error(f'E-ERR-01 処理異常通知の送信指示をしました 通知先トピック:{NDS_NOTICE_TOPIC}') except Exception as e: logger.error(f'E-98 処理異常通知の送信指示に失敗しました エラー内容:{e}') + traceback.print_exc() return diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py index d1ed116f..82ab16fb 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py @@ -7,6 +7,7 @@ import csv import logging from abc import * from zoneinfo import ZoneInfo +import traceback # 環境変数 CHECK_BUCKET_NAME = os.environ["CHECK_BUCKET_NAME"] @@ -186,9 +187,11 @@ def lambda_handler(event, context): # ⑥ 処理終了ログを出力する logger.info('I-06-01 処理終了 SAP_supデータ受領チェック処理(月次)') except CustomException as e: + traceback.print_exc() error_notice(e.id, e.arg) except Exception as e: logger.error(f'E-99 想定外のエラーが発生しました エラー内容:{e}') + traceback.print_exc() error_notice('E-99', e) return @@ -206,6 +209,7 @@ def error_notice(error_log_id, exception) -> None: logger.error(f'E-ERR-01 処理異常通知の送信指示をしました 通知先トピック:{NDS_NOTICE_TOPIC}') except Exception as e: logger.error(f'E-98 処理異常通知の送信指示に失敗しました エラー内容:{e}') + traceback.print_exc() return From 81f514525fd74ef94bd5df0b9cb864dfe0dd27ca Mon Sep 17 00:00:00 2001 From: Y_SAKAI Date: Mon, 30 May 2022 18:52:48 +0900 Subject: [PATCH 10/10] =?UTF-8?q?fix:SAP=E5=8F=97=E9=A0=98=E3=83=81?= =?UTF-8?q?=E3=82=A7=E3=83=83=E3=82=AF=E5=87=A6=E7=90=86(=E6=9C=88?= =?UTF-8?q?=E6=AC=A1)=20=E3=83=BB=E3=80=8CI-04-01=E3=80=8D=E3=81=AE?= =?UTF-8?q?=E3=83=AD=E3=82=B0=E3=83=95=E3=82=A9=E3=83=BC=E3=83=9E=E3=83=83?= =?UTF-8?q?=E3=83=88=E4=B8=8D=E5=82=99=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...j-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py | 2 +- ...j-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py index 2e002860..00170d36 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-fin-receive-check-monthly.py @@ -113,7 +113,7 @@ def lambda_handler(event, context): raise FileReadException('E-03-01', e) # ④ 月次チェック処理を行う - logger.info('I-04-01', '月次チェック処理開始') + logger.info('I-04-01 月次チェック処理開始') # 1.SAP保管用バケットの処理稼働月に該当するサブフォルダにあるファイル一覧を取得する logger.info(f'I-04-02 オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{execute_month}/') diff --git a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py index 82ab16fb..2c6be537 100644 --- a/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py +++ b/lambda/mbj-newdwh2021-staging-lambda-sap-sup-receive-check-monthly.py @@ -113,7 +113,7 @@ def lambda_handler(event, context): raise FileReadException('E-03-01', e) # ④ 月次チェック処理を行う - logger.info('I-04-01', '月次チェック処理開始') + logger.info('I-04-01 月次チェック処理開始') # 1.SAP保管用バケットの処理稼働月に該当するサブフォルダにあるファイル一覧を取得する logger.info(f'I-04-02 オブジェクトリストの取得 取得先:{CHECK_BUCKET_NAME}/{execute_month}/')