Nice article, thanks for sharing.
I am not aware of any out of box solution.
One possible issue I see in the proposed solution is the use of absolute clock time. Some guardrails needs to be put in place to define a threshold after which it is assumed to be safe re ingesting a duplicate message.
This threshold must take into account what’s the biggest clock screw we can expect (at least with high probability).
The solution can be improved by using relative time. This is basically what’s done in Dynamo DB lock.
Using relative time if different machines disagree about what time it is, they will still avoid re ingesting the message.
You can still get in trouble if one machine clock runs faster than the other, but by setting the heartbeat period much smaller than the lock lease, it is possible to reduce the probability low enough to be considered negligible.
This also has the additional benefit of reusing an existing library, instead of rolling out your own.
TL;DR
I would approach the problem by using Dynamo DB Locks library: https://aws.amazon.com/blogs/database/building-distributed-locks-with-the-dynamodb-lock-client/