Merge branch 'develop' into feature-NEWDWH2021-731-synch-develop

This commit is contained in:
shimoda.m@nds-tyo.co.jp 2022-09-20 09:28:07 +09:00
commit 9342674c6c
18 changed files with 235 additions and 51 deletions

11
.gitignore vendored
View File

@ -1,9 +1,10 @@
lambda/mbj-newdwh2021-staging-NoticeToSlack/package-lock.json # Node.jsで実装されたLambdaの管理対象外ファイル群
lambda/mbj-newdwh2021-staging-NoticeToSlack/node_modules/* package-lock.json
lambda/mbj-newdwh2021-staging-PublishFromLog/package-lock.json node_modules/
lambda/mbj-newdwh2021-staging-PublishFromLog/node_modules/* # ローカル確認用環境変数ファイル
__pycache__/
.env .env
# pythonのキャッシュファイル
__pycache__/
**/.vscode/settings.json **/.vscode/settings.json
# python test # python test

View File

@ -4,7 +4,12 @@ ENV TZ="Asia/Tokyo"
WORKDIR /usr/src/app WORKDIR /usr/src/app
COPY requirements.txt ./ COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt RUN \
apt update -y && \
# パッケージのセキュリティアップデートのみを適用するコマンド
apt install -y unattended-upgrades && \
unattended-upgrades && \
pip install --no-cache-dir -r requirements.txt
COPY dataimport ./ COPY dataimport ./
CMD [ "python", "./controller.py" ] CMD [ "python", "./controller.py" ]

View File

@ -1,11 +1,13 @@
from datetime import datetime
import boto3
import io
import csv import csv
import io
import sys import sys
from datetime import datetime
import boto3
from common import convert_quotechar, debug_log
from end import end from end import end
from error import error from error import error
from common import debug_log
# 定数 # 定数
DIRECTORY_WORK = '/work/' DIRECTORY_WORK = '/work/'
@ -23,6 +25,14 @@ SETTINGS_ITEM = {
'storageSchemaName': 9, 'storageSchemaName': 9,
'loadSchemaName': 10, 'loadSchemaName': 10,
'exSqlFileName': 11, 'exSqlFileName': 11,
'commaReplaceColumns': 12,
'importManner': 13,
'reserved1': 14,
'reserved2': 15,
'reserved3': 16,
'reserved4': 17,
'reserved5': 18,
'reserved6': 19
} }
LINE_FEED_CODE = { LINE_FEED_CODE = {
'CR': '\r', 'CR': '\r',
@ -74,14 +84,18 @@ def check(bucket_name, target_data_source, target_file_name, settings_key, log_i
work_obj = s3_resource.Object(bucket_name, work_key) work_obj = s3_resource.Object(bucket_name, work_key)
work_response = work_obj.get() work_response = work_obj.get()
work_data = io.TextIOWrapper(io.BytesIO(work_response["Body"].read()), encoding=settings_list[SETTINGS_ITEM["charCode"]], newline=LINE_FEED_CODE[settings_list[SETTINGS_ITEM["lineFeedCode"]]]) work_data = io.TextIOWrapper(io.BytesIO(work_response["Body"].read()), encoding=settings_list[SETTINGS_ITEM["charCode"]], newline=LINE_FEED_CODE[settings_list[SETTINGS_ITEM["lineFeedCode"]]])
work_header_list = [] work_csv_row = []
for line in csv.reader(work_data, quotechar=settings_list[SETTINGS_ITEM["quotechar"]], delimiter=settings_list[SETTINGS_ITEM["delimiter"]]): for i, line in enumerate(csv.reader(work_data, quotechar=convert_quotechar(settings_list[SETTINGS_ITEM["quotechar"]]), delimiter=settings_list[SETTINGS_ITEM["delimiter"]])):
work_header_list = line # ヘッダあり、かつ、1行目の場合
if int(settings_list[SETTINGS_ITEM["headerFlag"]]) == 1 and i == 0:
work_csv_row.append(line)
continue
work_csv_row.append(line)
break break
# ② C-0のデータ件数チェックを開始する # ② C-0のデータ件数チェックを開始する
print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["i"]} I-CHK-02 - C-0のチェックを開始します') print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["i"]} I-CHK-02 - C-0のチェックを開始します')
if not len(work_header_list): if is_empty_file(work_csv_row, settings_list):
print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["i"]} I-CHK-03 - 投入ファイルが0バイトのため処理を終了します') print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["i"]} I-CHK-03 - 投入ファイルが0バイトのため処理を終了します')
end(bucket_name, target_data_source, target_file_name, '', log_info, mode) end(bucket_name, target_data_source, target_file_name, '', log_info, mode)
print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["i"]} I-CHK-04 - 終了処理完了') print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["i"]} I-CHK-04 - 終了処理完了')
@ -90,16 +104,17 @@ def check(bucket_name, target_data_source, target_file_name, settings_key, log_i
# ③ C-1の項目数チェックを開始する # ③ C-1の項目数チェックを開始する
print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["i"]} I-CHK-06 - C-1のチェックを開始します') print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["i"]} I-CHK-06 - C-1のチェックを開始します')
work_header_list_len = len(work_header_list) work_csv_row_item_len = len(work_csv_row[0])
if work_header_list_len == int(settings_list[SETTINGS_ITEM["csvNumItems"]]): if work_csv_row_item_len == int(settings_list[SETTINGS_ITEM["csvNumItems"]]):
print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["i"]} I-CHK-07 - C-1正常終了') print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["i"]} I-CHK-07 - C-1正常終了')
else: else:
raise CheckError(f'E-CHK-01 - 項目数が一致しません 個別設定ファイル項目数:{settings_list[SETTINGS_ITEM["csvNumItems"]]} 投入データ項目数:{work_header_list_len}') raise CheckError(f'E-CHK-01 - 項目数が一致しません 個別設定ファイル項目数:{settings_list[SETTINGS_ITEM["csvNumItems"]]} 投入データ項目数:{work_csv_row_item_len}')
# ④ C-2の項目並び順チェック開始する # ④ C-2の項目並び順チェック開始する
if int(settings_list[SETTINGS_ITEM["headerFlag"]]) == True: if int(settings_list[SETTINGS_ITEM["headerFlag"]]) == True:
print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["i"]} I-CHK-08 - C-2のチェックを開始します') print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["i"]} I-CHK-08 - C-2のチェックを開始します')
settings_header_list = settings_list[SETTINGS_ITEM["csvNameItems"]].rstrip().split(',') settings_header_list = settings_list[SETTINGS_ITEM["csvNameItems"]].rstrip().split(',')
work_header_list = work_csv_row[0]
for i in range(len(settings_header_list)): for i in range(len(settings_header_list)):
if not settings_header_list[i] == work_header_list[i]: if not settings_header_list[i] == work_header_list[i]:
raise CheckError(f'E-CHK-02 - 項目順序が一致しません {i + 1}番目の項目 個別設定ファイル項目:{settings_header_list[i]} 投入データ項目:{work_header_list[i]}') raise CheckError(f'E-CHK-02 - 項目順序が一致しません {i + 1}番目の項目 個別設定ファイル項目:{settings_header_list[i]} 投入データ項目:{work_header_list[i]}')
@ -114,3 +129,22 @@ def check(bucket_name, target_data_source, target_file_name, settings_key, log_i
except Exception as e: except Exception as e:
print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["e"]} E-CHK-99 - エラー内容:{e}') print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["e"]} E-CHK-99 - エラー内容:{e}')
error(bucket_name, target_data_source, target_file_name, log_info) error(bucket_name, target_data_source, target_file_name, log_info)
def is_empty_file(work_csv_row: list, settings_list: list):
"""② C-0のデータ件数チェック
ヘッダ行がある場合は1行目を読み飛ばして判定する
Args:
work_csv_row (list): CSVファイルの1行目(ヘッダを含む場合は2行目まで)
settings_list (list): 個別設定ファイルのリスト
Returns:
bool: CSVファイルの1行目が0件だった場合はTrue
"""
has_header = int(settings_list[SETTINGS_ITEM["headerFlag"]]) == 1
# ヘッダのみのファイルも0バイトファイルをみなす
if has_header:
return len(work_csv_row[1:]) == 0
return len(work_csv_row) == 0

View File

@ -11,3 +11,18 @@ MODE_TYPE = {
def debug_log(log, log_info, mode): def debug_log(log, log_info, mode):
if MODE_TYPE['d'] == mode: if MODE_TYPE['d'] == mode:
print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["d"]} {log}') print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["d"]} {log}')
def convert_quotechar(quotechar):
"""csvモジュールの囲い文字を変換する
Args:
quotechar : 項目囲い文字の設定値
Returns:
空文字空白文字の場合None
それ以外設定値をそのまま帰す
"""
if (quotechar.strip(' ') == ''):
return None
return quotechar

View File

@ -1,11 +1,14 @@
import csv
import io
import re
from datetime import datetime from datetime import datetime
import boto3 import boto3
import pymysql import pymysql
from pymysql.constants import CLIENT from pymysql.constants import CLIENT
import io
import csv from common import convert_quotechar, debug_log
from error import error from error import error
from common import debug_log
# 定数 # 定数
DIRECTORY_WORK = '/work/' DIRECTORY_WORK = '/work/'
@ -23,7 +26,7 @@ SETTINGS_ITEM = {
'storageSchemaName': 9, 'storageSchemaName': 9,
'loadSchemaName': 10, 'loadSchemaName': 10,
'exSqlFileName': 11, 'exSqlFileName': 11,
'reserved0': 12, 'commaReplaceColumns': 12,
'importManner': 13, 'importManner': 13,
'reserved1': 14, 'reserved1': 14,
'reserved2': 15, 'reserved2': 15,
@ -94,7 +97,7 @@ def main(bucket_name, target_data_source, target_file_name, settings_key, db_inf
for line in io.TextIOWrapper(io.BytesIO(settings_response["Body"].read()), encoding='utf-8'): for line in io.TextIOWrapper(io.BytesIO(settings_response["Body"].read()), encoding='utf-8'):
settings_list.append(line.rstrip('\n')) settings_list.append(line.rstrip('\n'))
# 予約行挿入のためsetting_listとSETTINGS_ITEMの要素数を揃え # 設定ファイルに記載のない行を空文字として扱い、予約行とす
for _ in range(len(SETTINGS_ITEM) - len(settings_list)): for _ in range(len(SETTINGS_ITEM) - len(settings_list)):
settings_list.append('') settings_list.append('')
@ -117,8 +120,9 @@ def main(bucket_name, target_data_source, target_file_name, settings_key, db_inf
warning_info = '' # ワーニング情報 warning_info = '' # ワーニング情報
index = 0 # ループインデックス index = 0 # ループインデックス
settings_db_columu_list = settings_list[SETTINGS_ITEM["dbColumuName"]].rstrip().split(',') settings_db_columu_list = settings_list[SETTINGS_ITEM["dbColumuName"]].rstrip().split(',')
settings_replace_comma_list = settings_list[SETTINGS_ITEM["commaReplaceColumns"]].rstrip().split(',')
for line in csv.reader(work_data, quotechar=settings_list[SETTINGS_ITEM["quotechar"]], delimiter=settings_list[SETTINGS_ITEM["delimiter"]]): for line in csv.reader(work_data, quotechar=convert_quotechar(settings_list[SETTINGS_ITEM["quotechar"]]), delimiter=settings_list[SETTINGS_ITEM["delimiter"]]):
try: try:
if int(settings_list[SETTINGS_ITEM["headerFlag"]]) == True and index == 0: if int(settings_list[SETTINGS_ITEM["headerFlag"]]) == True and index == 0:
index += 1 index += 1
@ -131,8 +135,8 @@ def main(bucket_name, target_data_source, target_file_name, settings_key, db_inf
# SQL文生成 # SQL文生成
query_parameter_list = [] query_parameter_list = []
sql = f'INSERT INTO {settings_list[SETTINGS_ITEM["loadSchemaName"]]} (' sql = f'INSERT INTO {settings_list[SETTINGS_ITEM["loadSchemaName"]]} ('
for i in range(len(settings_db_columu_list)): for db_column in settings_db_columu_list:
sql = f'{sql} {settings_db_columu_list[i]},' sql = f'{sql} {db_column},'
sql = f'{sql} file_name,' # システム項目:取込ファイル名 sql = f'{sql} file_name,' # システム項目:取込ファイル名
sql = f'{sql} file_row_cnt,' # システム項目:取込ファイル行番号 sql = f'{sql} file_row_cnt,' # システム項目:取込ファイル行番号
sql = f'{sql} delete_flg,' # システム項目:論理削除フラグ sql = f'{sql} delete_flg,' # システム項目:論理削除フラグ
@ -143,14 +147,18 @@ def main(bucket_name, target_data_source, target_file_name, settings_key, db_inf
sql = f'{sql} VALUES (' sql = f'{sql} VALUES ('
for i in range(len(line)): for i in range(len(line)):
# データ項目値が0桁より大きいかチェックする # データ項目値が0桁より大きいかチェックする
if len(line[i]) > 0: if len(line[i]) == 0:
# 0桁より大きい場合 # 0桁の場合
# INSERT文のパラメータとそれに対応するプレースホルダーを設定する
query_parameter_list.append(line[i])
sql = f'{sql} %s,'
else:
# 上記以外の場合
sql = f'{sql} NULL,' sql = f'{sql} NULL,'
continue
# データ項目値の変換処理(カンマ除去)
org_column_value = line[i]
current_settings_db_column_name = settings_db_columu_list[i]
column_value = convert_column_value(org_column_value, current_settings_db_column_name, settings_replace_comma_list)
# INSERT文のパラメータとそれに対応するプレースホルダーを設定する
query_parameter_list.append(column_value)
sql = f'{sql} %s,'
sql = f'{sql} "{target_file_name}",' # システム項目:取込ファイル名 sql = f'{sql} "{target_file_name}",' # システム項目:取込ファイル名
sql = f'{sql} "{index + 1}",' # システム項目:取込ファイル行番号 sql = f'{sql} "{index + 1}",' # システム項目:取込ファイル行番号
sql = f'{sql} "0",' # システム項目:論理削除フラグ sql = f'{sql} "0",' # システム項目:論理削除フラグ
@ -304,6 +312,24 @@ def connection_close(conn, bucket_name, target_data_source, target_file_name, lo
print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["e"]} E-MAIN-99 - エラー内容:{e}') print(f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {LOG_LEVEL["e"]} E-MAIN-99 - エラー内容:{e}')
error(bucket_name, target_data_source, target_file_name, log_info) error(bucket_name, target_data_source, target_file_name, log_info)
def convert_column_value(org_column_value, current_settings_db_column_name, settings_replace_comma_list):
"""データ項目値変換処理
- 数値内のカンマ除去処理
Args:
org_column_value : 投入データの値
current_settings_db_column_name : 投入データのDBカラム物理名
settings_replace_comma_list : 投入データの数値型のDBカラム物理名のリスト
Returns:
converted_column_value:変換処理を行った投入データの値
"""
# 投入データのDB物理カラム名が設定ファイルの数値型のDBカラム物理名に含まれている場合、データ項目値の「,」を取り除く
converted_column_value = org_column_value
if current_settings_db_column_name in settings_replace_comma_list:
converted_column_value = converted_column_value.replace(',', '')
return converted_column_value
def truncate_judge(settings_list): def truncate_judge(settings_list):
"""TRUNCATE処理対応判定 """TRUNCATE処理対応判定

View File

@ -4,7 +4,12 @@ ENV TZ="Asia/Tokyo"
WORKDIR /function WORKDIR /function
COPY requirements.txt ./ COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt RUN \
apt update -y && \
# パッケージのセキュリティアップデートのみを適用するコマンド
apt install -y unattended-upgrades && \
unattended-upgrades && \
pip install --no-cache-dir -r requirements.txt
COPY datadecrypt ./ COPY datadecrypt ./
ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ] ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]

View File

@ -15,7 +15,6 @@ RECEIVE_MONTHLY_FILE_NAME_LIST_PATH = os.environ["RECEIVE_MONTHLY_FILE_NAME_LIST
NOTICE_MAIL_TITLE_TEMPLATE_PATH = os.environ["NOTICE_MAIL_TITLE_TEMPLATE_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"] NOTICE_MAIL_BODY_TEMPLATE_PATH = os.environ["NOTICE_MAIL_BODY_TEMPLATE_PATH"]
MBJ_SAP_NOTICE_TOPIC = os.environ["MBJ_SAP_NOTICE_TOPIC"] 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_TOPIC = os.environ["NDS_NOTICE_TOPIC"]
NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"]
LOG_LEVEL = os.environ["LOG_LEVEL"] LOG_LEVEL = os.environ["LOG_LEVEL"]
@ -112,7 +111,8 @@ def lambda_handler(event, context):
logger.info(f'I-05-05 通知メール(本文)テンプレートファイル読込 読込元:{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_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_response = mail_body_obj['Body'].read().decode('utf-8')
mail_body = mail_body_response.replace(MAIL_BODY_REPLACE_SYMBOL, mail_msg) # メール本文内のプレースホルダーを置き換える
mail_body = substitute_mail_body(mail_body_response, mail_msg)
logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました')
except Exception as e: except Exception as e:
logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}')
@ -159,6 +159,22 @@ def error_notice(error_log_id, exception) -> None:
return return
def substitute_mail_body(before_mail_body:str, mail_msg: str) -> str:
"""メール本文のプレースホルダーを置き換えます
Args:
before_mail_body (str): 置き換え前のメール本文
mail_msg (str): メール本文のプレースホルダーを置き換える文言
Returns:
str: 置き換え後のメール本文
"""
substitute_dict = {
"notice_file_names": mail_msg
}
mail_body = before_mail_body.format_map(substitute_dict)
return mail_body
# カスタムExceptionクラス # カスタムExceptionクラス
class CustomException(Exception, metaclass=ABCMeta): class CustomException(Exception, metaclass=ABCMeta):
def __init__(self, id, arg): def __init__(self, id, arg):

View File

@ -17,7 +17,6 @@ NON_BUSINESS_DAY_LIST_PATH = os.environ["NON_BUSINESS_DAY_LIST_PATH"]
NOTICE_MAIL_TITLE_TEMPLATE_PATH = os.environ["NOTICE_MAIL_TITLE_TEMPLATE_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"] NOTICE_MAIL_BODY_TEMPLATE_PATH = os.environ["NOTICE_MAIL_BODY_TEMPLATE_PATH"]
MBJ_SAP_NOTICE_TOPIC = os.environ["MBJ_SAP_NOTICE_TOPIC"] 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_TOPIC = os.environ["NDS_NOTICE_TOPIC"]
NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"]
LOG_LEVEL = os.environ["LOG_LEVEL"] LOG_LEVEL = os.environ["LOG_LEVEL"]
@ -164,7 +163,8 @@ def lambda_handler(event, context):
logger.info(f'I-05-05 通知メール(本文)テンプレートファイル読込 読込元:{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_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_response = mail_body_obj['Body'].read().decode('utf-8')
mail_body = mail_body_response.replace(MAIL_BODY_REPLACE_SYMBOL, mail_msg) # メール本文内のプレースホルダーを置き換える
mail_body = substitute_mail_body(mail_body_response, mail_msg)
logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました')
except Exception as e: except Exception as e:
logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}')
@ -210,6 +210,22 @@ def error_notice(error_log_id, exception) -> None:
traceback.print_exc() traceback.print_exc()
return return
def substitute_mail_body(before_mail_body:str, mail_msg: str) -> str:
"""メール本文のプレースホルダーを置き換えます
Args:
before_mail_body (str): 置き換え前のメール本文
mail_msg (str): メール本文のプレースホルダーを置き換える文言
Returns:
str: 置き換え後のメール本文
"""
substitute_dict = {
"notice_file_names": mail_msg
}
mail_body = before_mail_body.format_map(substitute_dict)
return mail_body
# カスタムExceptionクラス # カスタムExceptionクラス
class CustomException(Exception, metaclass=ABCMeta): class CustomException(Exception, metaclass=ABCMeta):

View File

@ -17,7 +17,6 @@ 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_TITLE_TEMPLATE_PATH = os.environ["NOTICE_MAIL_TITLE_TEMPLATE_PATH"]
NOTICE_MAIL_BODY_TEMPLATE_PATH = os.environ["NOTICE_MAIL_BODY_TEMPLATE_PATH"] NOTICE_MAIL_BODY_TEMPLATE_PATH = os.environ["NOTICE_MAIL_BODY_TEMPLATE_PATH"]
MBJ_SAP_NOTICE_TOPIC = os.environ["MBJ_SAP_NOTICE_TOPIC"] 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_TOPIC = os.environ["NDS_NOTICE_TOPIC"]
NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"]
LOG_LEVEL = os.environ["LOG_LEVEL"] LOG_LEVEL = os.environ["LOG_LEVEL"]
@ -166,7 +165,8 @@ def lambda_handler(event, context):
logger.info(f'I-05-05 通知メール(本文)テンプレートファイル読込 読込元:{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_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_response = mail_body_obj['Body'].read().decode('utf-8')
mail_body = mail_body_response.replace(MAIL_BODY_REPLACE_SYMBOL, mail_msg) # メール本文内のプレースホルダーを置き換える
mail_body = substitute_mail_body(mail_body_response, mail_msg)
logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました')
except Exception as e: except Exception as e:
logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}')
@ -213,6 +213,23 @@ def error_notice(error_log_id, exception) -> None:
return return
def substitute_mail_body(before_mail_body:str, mail_msg: str) -> str:
"""メール本文のプレースホルダーを置き換えます
Args:
before_mail_body (str): 置き換え前のメール本文
mail_msg (str): メール本文のプレースホルダーを置き換える文言
Returns:
str: 置き換え後のメール本文
"""
substitute_dict = {
"notice_file_names": mail_msg
}
mail_body = before_mail_body.format_map(substitute_dict)
return mail_body
# カスタムExceptionクラス # カスタムExceptionクラス
class CustomException(Exception, metaclass=ABCMeta): class CustomException(Exception, metaclass=ABCMeta):
def __init__(self, id, arg): def __init__(self, id, arg):

View File

@ -15,7 +15,6 @@ RECEIVE_MONTHLY_FILE_NAME_LIST_PATH = os.environ["RECEIVE_MONTHLY_FILE_NAME_LIST
NOTICE_MAIL_TITLE_TEMPLATE_PATH = os.environ["NOTICE_MAIL_TITLE_TEMPLATE_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"] NOTICE_MAIL_BODY_TEMPLATE_PATH = os.environ["NOTICE_MAIL_BODY_TEMPLATE_PATH"]
MBJ_SAP_NOTICE_TOPIC = os.environ["MBJ_SAP_NOTICE_TOPIC"] 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_TOPIC = os.environ["NDS_NOTICE_TOPIC"]
NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"]
LOG_LEVEL = os.environ["LOG_LEVEL"] LOG_LEVEL = os.environ["LOG_LEVEL"]
@ -112,7 +111,8 @@ def lambda_handler(event, context):
logger.info(f'I-05-05 通知メール(本文)テンプレートファイル読込 読込元:{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_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_response = mail_body_obj['Body'].read().decode('utf-8')
mail_body = mail_body_response.replace(MAIL_BODY_REPLACE_SYMBOL, mail_msg) # メール本文内のプレースホルダーを置き換える
mail_body = substitute_mail_body(mail_body_response, mail_msg)
logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました')
except Exception as e: except Exception as e:
logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}')
@ -159,6 +159,22 @@ def error_notice(error_log_id, exception) -> None:
return return
def substitute_mail_body(before_mail_body:str, mail_msg: str) -> str:
"""メール本文のプレースホルダーを置き換えます
Args:
before_mail_body (str): 置き換え前のメール本文
mail_msg (str): メール本文のプレースホルダーを置き換える文言
Returns:
str: 置き換え後のメール本文
"""
substitute_dict = {
"notice_file_names": mail_msg
}
mail_body = before_mail_body.format_map(substitute_dict)
return mail_body
# カスタムExceptionクラス # カスタムExceptionクラス
class CustomException(Exception, metaclass=ABCMeta): class CustomException(Exception, metaclass=ABCMeta):
def __init__(self, id, arg): def __init__(self, id, arg):

View File

@ -17,7 +17,6 @@ NON_BUSINESS_DAY_LIST_PATH = os.environ["NON_BUSINESS_DAY_LIST_PATH"]
NOTICE_MAIL_TITLE_TEMPLATE_PATH = os.environ["NOTICE_MAIL_TITLE_TEMPLATE_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"] NOTICE_MAIL_BODY_TEMPLATE_PATH = os.environ["NOTICE_MAIL_BODY_TEMPLATE_PATH"]
MBJ_SAP_NOTICE_TOPIC = os.environ["MBJ_SAP_NOTICE_TOPIC"] 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_TOPIC = os.environ["NDS_NOTICE_TOPIC"]
NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"]
LOG_LEVEL = os.environ["LOG_LEVEL"] LOG_LEVEL = os.environ["LOG_LEVEL"]
@ -164,7 +163,8 @@ def lambda_handler(event, context):
logger.info(f'I-05-05 通知メール(本文)テンプレートファイル読込 読込元:{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_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_response = mail_body_obj['Body'].read().decode('utf-8')
mail_body = mail_body_response.replace(MAIL_BODY_REPLACE_SYMBOL, mail_msg) # メール本文内のプレースホルダーを置き換える
mail_body = substitute_mail_body(mail_body_response, mail_msg)
logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました')
except Exception as e: except Exception as e:
logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}')
@ -210,6 +210,22 @@ def error_notice(error_log_id, exception) -> None:
traceback.print_exc() traceback.print_exc()
return return
def substitute_mail_body(before_mail_body:str, mail_msg: str) -> str:
"""メール本文のプレースホルダーを置き換えます
Args:
before_mail_body (str): 置き換え前のメール本文
mail_msg (str): メール本文のプレースホルダーを置き換える文言
Returns:
str: 置き換え後のメール本文
"""
substitute_dict = {
"notice_file_names": mail_msg
}
mail_body = before_mail_body.format_map(substitute_dict)
return mail_body
# カスタムExceptionクラス # カスタムExceptionクラス
class CustomException(Exception, metaclass=ABCMeta): class CustomException(Exception, metaclass=ABCMeta):

View File

@ -17,7 +17,6 @@ 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_TITLE_TEMPLATE_PATH = os.environ["NOTICE_MAIL_TITLE_TEMPLATE_PATH"]
NOTICE_MAIL_BODY_TEMPLATE_PATH = os.environ["NOTICE_MAIL_BODY_TEMPLATE_PATH"] NOTICE_MAIL_BODY_TEMPLATE_PATH = os.environ["NOTICE_MAIL_BODY_TEMPLATE_PATH"]
MBJ_SAP_NOTICE_TOPIC = os.environ["MBJ_SAP_NOTICE_TOPIC"] 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_TOPIC = os.environ["NDS_NOTICE_TOPIC"]
NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"] NDS_NOTICE_TITLE = os.environ["NDS_NOTICE_TITLE"]
LOG_LEVEL = os.environ["LOG_LEVEL"] LOG_LEVEL = os.environ["LOG_LEVEL"]
@ -166,7 +165,8 @@ def lambda_handler(event, context):
logger.info(f'I-05-05 通知メール(本文)テンプレートファイル読込 読込元:{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_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_response = mail_body_obj['Body'].read().decode('utf-8')
mail_body = mail_body_response.replace(MAIL_BODY_REPLACE_SYMBOL, mail_msg) # メール本文内のプレースホルダーを置き換える
mail_body = substitute_mail_body(mail_body_response, mail_msg)
logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました') logger.info('I-05-06 通知メール(本文)テンプレートファイルを読み込みました')
except Exception as e: except Exception as e:
logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}') logger.error(f'E-05-02 通知メール(本文)テンプレートファイルの読み込みに失敗しました エラー内容:{e}')
@ -213,6 +213,23 @@ def error_notice(error_log_id, exception) -> None:
return return
def substitute_mail_body(before_mail_body:str, mail_msg: str) -> str:
"""メール本文のプレースホルダーを置き換えます
Args:
before_mail_body (str): 置き換え前のメール本文
mail_msg (str): メール本文のプレースホルダーを置き換える文言
Returns:
str: 置き換え後のメール本文
"""
substitute_dict = {
"notice_file_names": mail_msg
}
mail_body = before_mail_body.format_map(substitute_dict)
return mail_body
# カスタムExceptionクラス # カスタムExceptionクラス
class CustomException(Exception, metaclass=ABCMeta): class CustomException(Exception, metaclass=ABCMeta):
def __init__(self, id, arg): def __init__(self, id, arg):

View File

@ -1,6 +1,6 @@
宛先各位 宛先各位
 SAP月次である以下のファイルを受領しましたので、通知いたします。  SAP月次である以下のファイルを受領しましたので、通知いたします。
@pgm_str_01@ {notice_file_names}
 尚、本メールはシステム自動送信のため、返信は出来ません。  尚、本メールはシステム自動送信のため、返信は出来ません。
 本件に関する問い合わせは、IT部門 ゴザリ様にお願いいたします。  本件に関する問い合わせは、IT部門 ゴザリ様にお願いいたします。

View File

@ -1,6 +1,6 @@
宛先各位 宛先各位
 SAP日次である以下のファイルを受領できておりません。  SAP日次である以下のファイルを受領できておりません。
@pgm_str_01@ {notice_file_names}
 SAPシステム側のSFTP送信状況のご確認をお願いいたします。  SAPシステム側のSFTP送信状況のご確認をお願いいたします。

View File

@ -1,6 +1,6 @@
宛先各位 宛先各位
 SAP月次である以下のファイルを受領できておりません。  SAP月次である以下のファイルを受領できておりません。
@pgm_str_01@ {notice_file_names}
 SAPシステム側のSFTP送信状況のご確認をお願いいたします。  SAPシステム側のSFTP送信状況のご確認をお願いいたします。

View File

@ -1,6 +1,6 @@
宛先各位 宛先各位
 SAP月次である以下のファイルを受領しましたので、通知いたします。  SAP月次である以下のファイルを受領しましたので、通知いたします。
@pgm_str_01@ {notice_file_names}
 尚、本メールはシステム自動送信のため、返信は出来ません。  尚、本メールはシステム自動送信のため、返信は出来ません。
 本件に関する問い合わせは、IT部門 ゴザリ様にお願いいたします。  本件に関する問い合わせは、IT部門 ゴザリ様にお願いいたします。

View File

@ -1,6 +1,6 @@
宛先各位 宛先各位
 SAP日次である以下のファイルを受領できておりません。  SAP日次である以下のファイルを受領できておりません。
@pgm_str_01@ {notice_file_names}
 SAPシステム側のSFTP送信状況のご確認をお願いいたします。  SAPシステム側のSFTP送信状況のご確認をお願いいたします。

View File

@ -1,6 +1,6 @@
宛先各位 宛先各位
 SAP月次である以下のファイルを受領できておりません。  SAP月次である以下のファイルを受領できておりません。
@pgm_str_01@ {notice_file_names}
 SAPシステム側のSFTP送信状況のご確認をお願いいたします。  SAPシステム側のSFTP送信状況のご確認をお願いいたします。