I've used step functions a bit, and Lambda a lot more, but it's been a little while. Some things that stand out to me:
• step functions is more of a general task-orchestration framework. Dagster is a very opinionated data-orchestration framework which can also orchestrate tasks. The difference is that the latter has strong first-class support for abstractions which generalize common problems in data engineering and ML ops (i.e. the whole Software-Defined Asset paradigm, things like partitioned datasets, auto-materialization). This is a very big difference in tooling and ethos, but may or may not be interesting / helpful to your use case.
• step functions will be much lower latency than Dagster when it comes to task startup (at least when orchestrating Lambda tasks).
• step functions have similar limitations to Lambda when it comes to maximum cpu / memory - Dagster is only limited by the technology you deploy it on, ECS Fargate and Kubernetes being popular although deploying on EC2 or compute on other platforms is supported (except Lambda)
• step functions integrate deeply with different AWS services and have a myriad of ways to trigger different services using event-based workflows. Dagster doesn't have a true event-based trigger mechanism, although you can simulate this if you build external tools to react to events and trigger the GraphQL API to submit jobs. In Dagster you can also respond to events with a polling mechanism (Sensors)
• Dagster integrates your data processing logic with your workflow logic. In step functions you're generally operating at the level where you're orchestrating services, inside of which your data processing is going to occur.
• I believe step functions allow for cycles in workflows, which is something Dagster does not (hence the DAG part of the name)
• step functions is language agnostic, Dagster is mostly for running Python code, although it's possible to orchestrate arbitrary docker images / kubernetes jobs / shell commands
The first difference is really the biggest by far. I think of step functions as a tool with no real opinions on how you use it. It doesn't provide abstractions as part of a framework to achieve specific tasks or goals.
Whereas I think of Dagster as a highly opinionated framework for processing data, with abstractions built to push your projects to adopt certain common best practices in software / data engineering (for example, dependency injection, which is implemented through Dagster's Resource mechanism, and validation of data and configuration, implemented through the config system and type loaders). Dagster also enables characteristics of your data to influence scheduling, such as scheduling jobs based on data partitioning. In other words, Dagster is specialized for data engineering, whereas step functions is extremely generalized