def get_notifyslack(trace_id, organization_id, notify_code): pm_logger = common_utils.begin_logger(trace_id, __name__, inspect.currentframe()) # 全てのチェックを行い、エラーがあった場合はログを出力してエラーレスポンスを返します。 list_error = validate_notifyslack(notify_code) if list_error: return common_utils.error_validate(MsgConst.ERR_REQUEST_201, HTTPStatus.UNPROCESSABLE_ENTITY, list_error, pm_logger) # Slack通知設定情報を取得します。 try: result = pm_orgNotifySlack.query_key(trace_id, organization_id, notify_code, True) except PmError as e: return common_utils.error_exception(MsgConst.ERR_402, HTTPStatus.INTERNAL_SERVER_ERROR, e, pm_logger, True) if not result: return common_utils.get_response_by_response_body(HTTPStatus.OK, []) # return data response = common_utils.get_response_by_response_body( HTTPStatus.OK, result) return common_utils.response(response, pm_logger)
def create_notifyslack(trace_id, organization_id, data_body): pm_logger = common_utils.begin_logger(trace_id, __name__, inspect.currentframe()) # リクエストボディのJSONでパースエラーが発生した場合は、ログを出力してエラーレスポンスを返します。 try: body_object = json.loads(data_body) notify_code = body_object['notifyCode'] webhook_url = body_object['webhookUrl'] except Exception as e: return common_utils.error_exception(MsgConst.ERR_REQUEST_202, HTTPStatus.BAD_REQUEST, e, pm_logger, True) mentions = None if common_utils.check_key('mentions', body_object): mentions = body_object['mentions'] # バリデーションチェックを行います。 list_error = validate_notifyslack(notify_code, webhook_url) if list_error: return common_utils.error_validate(MsgConst.ERR_REQUEST_201, HTTPStatus.UNPROCESSABLE_ENTITY, list_error, pm_logger) # Slack通知設定情報を作成します。 try: pm_orgNotifySlack.create(trace_id, organization_id, notify_code, webhook_url, mentions) except PmError as e: return common_utils.error_exception(MsgConst.ERR_DB_403, HTTPStatus.INTERNAL_SERVER_ERROR, e, pm_logger, True) # get record created try: org_notify_slack_created = pm_orgNotifySlack.query_key( trace_id, organization_id, notify_code, True) except PmError as e: return common_utils.error_exception(MsgConst.ERR_402, HTTPStatus.INTERNAL_SERVER_ERROR, e, pm_logger, True) # return data response = common_utils.get_response_by_response_body( HTTPStatus.CREATED, org_notify_slack_created) return common_utils.response(response, pm_logger)
def test_create_notifyslack_handler_success_record_exist(self): test_user = user_id.format(str(3)) path_parameters = {"organization_id": organization_id} body_request = { 'notifyCode': notify_code, 'webhookUrl': webhook_url, 'mentions': mentions } event_mock = event_create.get_event_object( path_parameters=path_parameters, trace_id=test_user, body=json.dumps(body_request)) response = notifymail.create_notifyslack_handler(event_mock, {}) response_body = json.loads(response['body']) org_notify_slack = pm_orgNotifySlack.query_key( trace_id, organization_id, body_request['notifyCode'], True) # check database self.assertEqual(org_notify_slack['organizationId'], path_parameters['organization_id']) self.assertEqual(org_notify_slack['notifyCode'], body_request['notifyCode']) self.assertEqual(org_notify_slack['webhookUrl'], body_request['webhookUrl']) self.assertEqual(org_notify_slack['mentions'], body_request['mentions']) # check response self.assertEqual(response['statusCode'], HTTPStatus.CREATED) self.assertEqual(org_notify_slack['organizationId'], response_body['organizationId']) self.assertEqual(org_notify_slack['notifyCode'], response_body['notifyCode']) self.assertEqual(org_notify_slack['webhookUrl'], response_body['webhookUrl']) self.assertEqual(org_notify_slack['mentions'], response_body['mentions']) self.assertEqual(org_notify_slack['createdAt'], response_body['createdAt']) self.assertEqual(org_notify_slack['updatedAt'], response_body['updatedAt'])
def execute_send_result_slack(trace_id, check_history_id, language): pm_logger = common_utils.begin_logger(trace_id, __name__, inspect.currentframe()) # チェック結果テーブルのCheckHistoryIndexから、チェック履歴ID{CheckHistoryId}をキーとしてチェック結果一覧を取得します。 try: list_check_result = pm_checkResults.query_history_index( trace_id, check_history_id) except PmError as e: msg_err = "チェック結果の取得に失敗しました。" pm_logger.error(msg_err) common_utils.write_log_pm_error(e, pm_logger, msg_err) return if (not list_check_result): msg_err = "チェック結果の取得に失敗しました。" pm_logger.error(msg_err) return # チェック結果一覧のうちの一つから、組織IDを取得します。 organization_id = list_check_result[0]['OrganizationID'] organization_name = list_check_result[0]['OrganizationName'] project_name = list_check_result[0]['ProjectName'] # 組織別Slack通知設定テーブルから、組織ID、通知コードCHECK_CISをキーとして設定情報を取得します。 try: org_notify_slack = pm_orgNotifySlack.query_key(trace_id, organization_id, CommonConst.NOTIFY_CODE) except PmError as e: msg_err = "Slack設定情報の取得に失敗しました。:OrganizationID={0}, CheckCode={1}".format( organization_id, CommonConst.NOTIFY_CODE) pm_logger.error(msg_err) common_utils.write_log_pm_error(e, pm_logger, msg_err) return if (not org_notify_slack): msg_err = "Slack設定情報の取得に失敗しました。:OrganizationID={0}, CheckCode={1}".format( organization_id, CommonConst.NOTIFY_CODE) pm_logger.error(msg_err) return # S3から通知Slack設定ファイルを取得します。 try: config = FileUtils.read_yaml(trace_id, CommonConst.S3_SETTING_BUCKET, CommonConst.NOTIFY_CONFIG_CIS_RESULT_MAIL) except PmError as e: msg_err = "通知Slack設定ファイルの取得に失敗しました。:s3://{0}/{1}".format( common_utils.get_environ(CommonConst.S3_SETTING_BUCKET), CommonConst.NOTIFY_CONFIG_CIS_RESULT_MAIL) pm_logger.error(msg_err) common_utils.write_log_pm_error(e, pm_logger, msg_err) return if language not in CommonConst.LANGUAGE_SUPPORT: language = CommonConst.LANGUAGE_DEFAULT path_file_template = config[ CommonConst.KEY_GET_PATH_FILE_TEMPLATE_SLACK.format(language=language)] # メッセージ本文を作成します。 try: template_message = FileUtils.read_decode(trace_id, CommonConst.S3_SETTING_BUCKET, path_file_template) except PmError as e: msg_err = "Slack通知本文テンプレートファイルの取得に失敗しました。:s3://{0}/{1}".format( common_utils.get_environ(CommonConst.S3_SETTING_BUCKET), path_file_template) pm_logger.error(msg_err) common_utils.write_log_pm_error(e, pm_logger, msg_err) return executed_date_time = date_utils.toString( date_utils.toDate(list_check_result[0]['ExecutedDateTime'], date_utils.UTC), date_utils.PATTERN_YYYYMMDDHHMM, date_utils.get_time_zone_by_language(language)) check_results = [] for check_result in list_check_result: account_aws = CommonConst.AWS_ACCOUNT_MAIL.format( check_result['AWSAccount'][:4], check_result['AWSAccount'][4:8]) check_result = { "accountAWS": account_aws, "okCount": check_result['OKCount'], "ngCount": check_result['NGCount'], "criticalCount": check_result['CriticalCount'], "managedCount": check_result['ManagedCount'], "errorCount": check_result['ErrorCount'] } check_results.append(check_result) template = Template(template_message) context = { 'organizationName': organization_name, 'projectName': project_name, 'executedDateTime': executed_date_time, 'checkResults': check_results } body = template.render(context) mentions = slack_common.convert_command_slack(org_notify_slack['Mentions']) body = CommonConst.KEY_BODY_MESSAGE_SLACK.format(mentions=mentions, body=body) notify_slack = { "username": config[CommonConst.KEY_USER_NAME_SLACK.format(language=language)], "icon_url": config['slack.iconurl'], "text": body } notify_slack = json.dumps(notify_slack) try: slack_common.send_message_slack(trace_id, org_notify_slack['WebhookURL'], notify_slack) except PmError as e: msg_err = "Slack通知のリクエスト送信に失敗しました。:OrganizationID={0}, CheckCode={1}".format( organization_id, CommonConst.NOTIFY_CODE) pm_logger.warning(msg_err) common_utils.write_log_pm_error(e, pm_logger, msg_err)
def check_result_notification(check_history_id, language): trace_id = check_history_id pm_logger = common_utils.begin_logger(trace_id, __name__, inspect.currentframe()) try: list_check_result = pm_checkResults.query_history_index( trace_id, check_history_id) except PmError as e: pm_logger.error("チェック結果取得に失敗しました。: CheckHistoryID=%s", check_history_id) return if (not list_check_result): pm_logger.error("チェック結果がありません。: CheckHistoryID=%s", check_history_id) return is_all_record_ok = True for check_result in list_check_result: if (check_result['NGCount'] > 0 or check_result['CriticalCount'] > 0 or check_result['ErrorCount'] > 0): is_all_record_ok = False break # 全てOKだった場合は、ログを出力してこの処理をスキップします。 if (is_all_record_ok is True): pm_logger.info("チェック結果が全て正常なため、結果通知処理をスキップします。") return organization_id = list_check_result[0]['OrganizationID'] org_notify_mail_destinations = [] # Lambda関数呼び出し時のPayloadには、チェック履歴IDをJSONとして渡します。 payload = {'CheckHistoryId': check_history_id, 'Language': language} service_name = common_utils.get_service_name() stage = common_utils.get_stage() try: org_notify_mail_destinations = pm_orgNotifyMailDestinations.query_key( trace_id, organization_id, CommonConst.NOTIFY_CODE) except PmError as e: pm_logger.error("宛先の取得に失敗しました。結果通知処理をスキップします。") if (not org_notify_mail_destinations): pm_logger.info("宛先が未設定のため、結果通知処理をスキップします。") else: # セキュリティチェック結果通知メール送信処理のLambdaを非同期で呼び出します。 function_name = CommonConst.EXECUTE_SEND_RESULT_EMAIL.format( service_name, stage) aws_common.lambda_invoke(trace_id, function_name, json.dumps(payload)) # 組織別Slack通知設定テーブルから、組織ID、通知コードCHECK_CISをキーとして設定情報を取得します。 try: org_notify_slack = pm_orgNotifySlack.query_key(trace_id, organization_id, CommonConst.NOTIFY_CODE) except PmError as e: pm_logger.error("Slack通知設定の取得に失敗しました。結果Slack通知処理をスキップします。") return if (not org_notify_slack): pm_logger.info("Slack通知が未設定のため、結果Slack通知処理をスキップします。") return # セキュリティチェック結果通知Slack送信のLambdaを非同期で呼び出します。 function_name_send_slack = CommonConst.EXECUTE_SEND_RESULT_SLACK.format( service_name, stage) aws_common.lambda_invoke(trace_id, function_name_send_slack, json.dumps(payload))