@Alexander Lindgren The best approach would be to leverage a distributed lock like blob storage leases which is what Azure WebJobs and Functions use for Timer Triggered functions themselves.
Only one instance of your web app would be able to acquire the lease at a time and would have to renew the lock periodically. If the instance holding the lock goes down (say it crashes), another instance could get the lease and continue processing as required. This would of course require the instances poll the status of the lease periodically as well.