For my backups I use restic and sync the restic repository data to S3. Even if the source data is corrupted, I can always roll back to the set of S3 object versions from a particular time.
The downside to using S3 object versioning is that I haven't found any good tools to work with object versions across multiple objects.
For example, I need to prune old backups from my restic repository. To do that I have to delete object versions that are no longer current (i.e. the latest version of an object). To accomplish this I had to write a script that uses Boto3 (AWS SDK for Python) that lets me delete non-current object versions and deletes any delete-marker versions.
The code was pretty straightforward, but I wish there was a tool that made it easier to do that.