import json import boto3 import os from typing import Any, Dict from datetime import datetime class StepFunctionsClient: def __init__(self): self.region = os.getenv("AWS_REGION", "us-east-1") self.client = boto3.client("stepfunctions", region_name=self.region) def start_execution( self, state_machine_arn: str, input_data: Dict[str, Any], name: str = None ) -> Dict: """Start a Step Functions execution.""" try: response = self.client.start_execution( stateMachineArn=state_machine_arn, name=name, input=json.dumps(input_data) ) return { "execution_arn": response["executionArn"], "start_date": response["startDate"].isoformat() } except Exception as e: return {"error": str(e)} def describe_execution(self, execution_arn: str) -> Dict: """Get details about a Step Functions execution.""" try: response = self.client.describe_execution(executionArn=execution_arn) return { "name": response["name"], "status": response["status"], "start_date": response["startDate"].isoformat(), "stop_date": response.get("stopDate", "").isoformat() if response.get("stopDate") else None, "input": json.loads(response["input"]), "output": json.loads(response.get("output", "{}")), "error": response.get("error"), "cause": response.get("cause") } except Exception as e: return {"error": str(e)} def list_state_machines(self) -> list: """List all state machines.""" try: paginator = self.client.get_paginator("list_state_machines") machines = [] for page in paginator.paginate(): machines.extend(page["stateMachines"]) return machines except Exception as e: return {"error": str(e)} def get_execution_history(self, execution_arn: str) -> list: """Get execution history for a Step Functions execution.""" try: paginator = self.client.get_paginator("get_execution_history") events = [] for page in paginator.paginate(executionArn=execution_arn): events.extend(page["events"]) return events except Exception as e: return {"error": str(e)}