11# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22# SPDX-License-Identifier: Apache-2.0
3- import os
3+ from typing import Any , Dict
44
55import boto3
66from botocore .exceptions import ClientError
7- from layer import tracer_utils , utils
7+ from layer import utils
88from layer .awsapi_cached_client import BotoSession
99from layer .cloudwatch_metrics import CloudWatchMetrics
10- from layer .logger import Logger
10+ from layer .powertools_logger import get_logger
1111from layer .sechub_findings import Finding
12+ from layer .tracer_utils import init_tracer
1213
1314ORCH_ROLE_NAME = "SO0111-ASR-Orchestrator-Member" # role to use for cross-account
1415
15- # initialise loggers
16- LOG_LEVEL = os . getenv ( "log_level" , "info" )
17- LOGGER = Logger ( loglevel = LOG_LEVEL )
16+ logger = get_logger ( "check_ssm_doc_state" )
17+ tracer = init_tracer ( )
18+
1819session = boto3 .session .Session ()
1920AWS_REGION = session .region_name
2021
21- tracer = tracer_utils .init_tracer ()
22-
2322
2423def _get_ssm_client (account , role , region = "" ):
2524 """
2625 Create a client for ssm
2726 """
2827 kwargs = {}
29-
3028 if region :
3129 kwargs ["region_name" ] = region
3230
3331 return BotoSession (account , f"{ role } " ).client ("ssm" , ** kwargs )
3432
3533
36- def _add_doc_state_to_answer (doc , account , region , answer ) :
34+ def _add_doc_state_to_answer (doc : str , account : str , region : str , answer : Any ) -> None :
3735 try :
3836 # Connect to APIs
3937 ssm = _get_ssm_client (account , ORCH_ROLE_NAME , region )
@@ -50,7 +48,7 @@ def _add_doc_state_to_answer(doc, account, region, answer):
5048 "message" : 'Document Type is not "Automation": ' + str (doctype ),
5149 }
5250 )
53- LOGGER .error (answer .message )
51+ logger .error (answer .message )
5452
5553 docstate = docinfo .get ("Status" , "unknown" )
5654 if docstate != "Active" :
@@ -60,7 +58,7 @@ def _add_doc_state_to_answer(doc, account, region, answer):
6058 "message" : 'Document Status is not "Active": ' + str (docstate ),
6159 }
6260 )
63- LOGGER .error (answer .message )
61+ logger .error (answer .message )
6462
6563 answer .update ({"status" : "ACTIVE" })
6664
@@ -70,15 +68,15 @@ def _add_doc_state_to_answer(doc, account, region, answer):
7068 answer .update (
7169 {"status" : "NOTFOUND" , "message" : f"Document { doc } does not exist." }
7270 )
73- LOGGER .error (answer .message )
71+ logger .error (answer .message )
7472 elif exception_type == "AccessDenied" :
7573 answer .update (
7674 {
7775 "status" : "ACCESSDENIED" ,
7876 "message" : f"Could not assume role for { doc } in { account } in { region } " ,
7977 }
8078 )
81- LOGGER .error (answer .message )
79+ logger .error (answer .message )
8280 try :
8381 cloudwatch_metrics = CloudWatchMetrics ()
8482 cloudwatch_metric = {
@@ -88,33 +86,33 @@ def _add_doc_state_to_answer(doc, account, region, answer):
8886 }
8987 cloudwatch_metrics .send_metric (cloudwatch_metric )
9088 except Exception :
91- LOGGER .debug ("Did not send Cloudwatch metric" )
89+ logger .debug ("Did not send Cloudwatch metric" )
9290 else :
9391 answer .update (
9492 {
9593 "status" : "CLIENTERROR" ,
9694 "message" : "An unhandled client error occurred: " + exception_type ,
9795 }
9896 )
99- LOGGER .error (answer .message )
97+ logger .error (answer .message )
10098
10199 except Exception as e :
102100 answer .update (
103101 {"status" : "ERROR" , "message" : "An unhandled error occurred: " + str (e )}
104102 )
105- LOGGER .error (answer .message )
103+ logger .error (answer .message )
106104
107105
108- @tracer .capture_lambda_handler
109- def lambda_handler (event , _ ) :
110- answer = utils .StepFunctionLambdaAnswer () # holds the response to the step function
111- LOGGER .info (event )
106+ @tracer .capture_lambda_handler # type: ignore[misc]
107+ def lambda_handler (event : Dict [ str , Any ], _ : Any ) -> Dict [ str , Any ] :
108+ answer = utils .StepFunctionLambdaAnswer ()
109+ logger .info ("Processing SSM doc state check" , ** event )
112110 if "Finding" not in event or "EventType" not in event :
113111 answer .update (
114112 {"status" : "ERROR" , "message" : "Missing required data in request" }
115113 )
116- LOGGER .error (answer .message )
117- return answer .json ()
114+ logger .error (answer .message )
115+ return answer .json () # type: ignore[no-any-return]
118116
119117 product_name = (
120118 event ["Finding" ]
@@ -146,7 +144,7 @@ def lambda_handler(event, _):
146144 }
147145 )
148146 answer .update ({"status" : "ACTIVE" })
149- return answer .json ()
147+ return answer .json () # type: ignore[no-any-return]
150148
151149 finding = Finding (event ["Finding" ])
152150
@@ -174,7 +172,7 @@ def lambda_handler(event, _):
174172 "message" : f'Security Standard is not enabled": "{ finding .standard_name } version { finding .standard_version } "' ,
175173 }
176174 )
177- return answer .json ()
175+ return answer .json () # type: ignore[no-any-return]
178176
179177 # Is there alt workflow configuration?
180178 alt_workflow_doc = event .get ("Workflow" , {}).get ("WorkflowDocument" , None )
@@ -195,4 +193,4 @@ def lambda_handler(event, _):
195193 automation_docid , finding .account_id , finding .resource_region , answer
196194 )
197195
198- return answer .json ()
196+ return answer .json () # type: ignore[no-any-return]
0 commit comments