All of the posts with missing images are at least two or three days old. Do you have any form of object expiration configured on your bucket?
If you followed the S3 guide it isn’t being used as a cache, it’s the place discourse is offloading originals to. Any expiration settings means the file gets offloaded and then totally separate from discourse it’s being deleted by a process at amazon.
Why are you using a cdn and cloudflare in addition to S3? Is maxcdn providing the S3 bucket?