You can always use step functions or some janky recursive calls to work around the 15 min timeout.
I would recommend using docker containers and writing it in a way that you can swap out lambda/ecs/k8s/etc as the backend infrastructure. That way you you can punt on doing any fancy work to try and break the jobs up across lambdas under that 15 min constraint.