"""Connects to AWS SFN""" import boto3 def start_execution(sfn_arn, execution_name, input): """Starts an execution of an SFN""" client = boto3.client('stepfunctions') response = client.start_execution( stateMachineArn=sfn_arn, name=execution_name, input=input ) execution_arn = response.get('executionArn') return execution_arn def get_execution_log_by_arn(exec_arn, max_res=50): """Get an aws SFN by sfn name.""" sfn_client = boto3.client('stepfunctions') full_event_list = list() execution_list = sfn_client.get_execution_history( executionArn=exec_arn, maxResults=50, reverseOrder=True, includeExecutionData=True ) next_token = execution_list.get('nextToken') for event in execution_list['events']: full_event_list.append(event) while next_token: execution_list = sfn_client.get_execution_history( executionArn=exec_arn, maxResults=max_res, reverseOrder=True, includeExecutionData=True, nextToken=next_token ) next_token = execution_list.get('nextToken') for event in execution_list['events']: full_event_list.append(event) return full_event_list def get_exec_by_arn(exec_arn): """Get an aws SFN Execution by execution ARN.""" sfn_client = boto3.client('stepfunctions') sfn_exec = sfn_client.describe_execution( executionArn=exec_arn) return sfn_exec def get_sfn_arn_by_name(sfn_name): """Get an aws SFN by sfn name.""" sfn_client = boto3.client('stepfunctions') sfn_list = sfn_client.list_state_machines() next_token = sfn_list.get('nextToken') status = next( (sfn for sfn in sfn_list['stateMachines'] if sfn.get('name') == sfn_name), None ) while not status and next_token: sfn_list = sfn_client.list_state_machines(nextToken=next_token) status = next( (sfn for sfn in sfn_list['stateMachines'] if sfn.get('name') == sfn_name), None ) next_token = sfn_list.get('nextToken') if not status: raise RuntimeError(f'No state machine found for sfn name: {sfn_name}') return status def get_full_execution_count_by_arn(sfn_arn, status='RUNNING'): """Get the count of SFN exections by sfn name and status. Args: sfn_arn (str): The ARN of the SFN to query. status (str, optional): Filter by status. Defaults to 'RUNNING'. Returns: int: The count of SFN exexcutions matching the passed status. """ sfn_client = boto3.client('stepfunctions') current_executions = sfn_client.list_executions( stateMachineArn=sfn_arn, statusFilter=status, maxResults=50 ) next_token = current_executions.get('nextToken') current_sfn_count = len(current_executions['executions']) while next_token: current_executions = sfn_client.list_executions( stateMachineArn=sfn_arn, statusFilter=status, maxResults=50, nextToken=next_token ) current_sfn_count = current_sfn_count + len( current_executions['executions']) next_token = current_executions.get('nextToken') return current_sfn_count def get_full_execution_name_list_by_arn(sfn_arn, status='RUNNING'): """Get a list of SFN execution names by SFN ARN matching a given status. Args: sfn_arn (str): The SFN ARN. status (str, optional): Only match executions of this status. Defaults to 'RUNNING'. Returns: list: A list containing execution names as strings. """ sfn_client = boto3.client('stepfunctions') current_executions = sfn_client.list_executions( stateMachineArn=sfn_arn, statusFilter=status, maxResults=50 ) next_token = current_executions.get('nextToken') name_list = [x['name'] for x in current_executions['executions']] while next_token: current_executions = sfn_client.list_executions( stateMachineArn=sfn_arn, statusFilter=status, maxResults=50, nextToken=next_token ) name_list = name_list + [x['name'] for x in current_executions['executions']] next_token = current_executions.get('nextToken') return name_list