3030LOGGER = logging .getLogger (__name__ )
3131log_level = os .environ .get ("LOG_LEVEL" , logging .INFO )
3232LOGGER .setLevel (log_level )
33+ LOGGER .info (f"boto3 version: { boto3 .__version__ } " )
3334
3435# Initialise the helper
3536helper = CfnResource (json_logging = True , log_level = "DEBUG" , boto_level = "CRITICAL" )
3637
3738# Global Variables
3839UNEXPECTED = "Unexpected!"
3940BOTO3_CONFIG = Config (retries = {"max_attempts" : 10 , "mode" : "standard" })
41+ MAX_RETRIES = 12
42+ SLEEP_TIME = 5
4043
4144
4245def assume_role (role : str , role_session_name : str , account : str = None , session : boto3 .Session = None ) -> boto3 .Session :
@@ -70,7 +73,7 @@ def assume_role(role: str, role_session_name: str, account: str = None, session:
7073 )
7174
7275
73- def associate_admin_account (delegated_admin_account_id : str ) -> None :
76+ def associate_admin_account (delegated_admin_account_id : str ) -> None : # noqa CCR001
7477 """Associate an administrator account for Firewall Manager.
7578
7679 Args:
@@ -79,6 +82,7 @@ def associate_admin_account(delegated_admin_account_id: str) -> None:
7982 Raises:
8083 ValueError: Admin account already exists.
8184 """
85+ LOGGER .info (f"Admin account: { delegated_admin_account_id } " )
8286 firewall_manager_client : FMSClient = boto3 .client ("fms" , region_name = "us-east-1" , config = BOTO3_CONFIG ) # APIs only work in us-east-1 region
8387
8488 try :
@@ -90,8 +94,32 @@ def associate_admin_account(delegated_admin_account_id: str) -> None:
9094 except firewall_manager_client .exceptions .ResourceNotFoundException :
9195 LOGGER .info ("Administrator account does not exist. Continuing..." )
9296
93- LOGGER .info ("Associating admin account in Firewall Manager" )
94- firewall_manager_client .associate_admin_account (AdminAccount = delegated_admin_account_id )
97+ LOGGER .info ("Attempting to associate the admin account in Firewall Manager" )
98+ try :
99+ firewall_manager_client .associate_admin_account (AdminAccount = delegated_admin_account_id )
100+ except botocore .exceptions .ClientError as error :
101+ LOGGER .info (f"Error associating admin account: { error .response ['Error' ]['Message' ]} " )
102+ if error .response ["Error" ]["Code" ] == "InvalidOperationException" :
103+ LOGGER .info (f"Invalid operation exception occurred; waiting { SLEEP_TIME } seconds before trying again..." )
104+ i_retry = 0
105+ while i_retry <= MAX_RETRIES :
106+ time .sleep (SLEEP_TIME )
107+ try :
108+ firewall_manager_client .associate_admin_account (AdminAccount = delegated_admin_account_id )
109+ associated = True
110+ except botocore .exceptions .ClientError as retry_error :
111+ LOGGER .info (f"Attempt { i_retry } - error associating admin account: { retry_error .response ['Error' ]['Message' ]} " )
112+ associated = False
113+ if associated is True :
114+ break
115+ else :
116+ i_retry += 1
117+ if associated is False :
118+ LOGGER .error ("Unable to associate admin account." )
119+ raise ValueError ("Unable to associate admin account." ) from None
120+ else :
121+ LOGGER .error ("Unexpected error. Unable to associate admin account due to error unrelated to an invalid operation." )
122+ raise ValueError ("Unexpected error. Unable to associate admin account due to error unrelated to an invalid operation." ) from None
95123 LOGGER .info ("...Waiting 5 minutes for admin account association." )
96124 time .sleep (300 ) # use 5 minute wait
97125 while True :
0 commit comments