Ruby Net::HTTP Retries a Timed-Out GET by Default: Why That Doubles Your Bill
Net::HTTP.new(...).max_retries defaults to 1, so a GET that times out while the Amazon API is still answering gets silently re-sent once by Ruby itself, before your own retry code runs - and every send to a billed endpoint is billed. Here is a local test that proves it (2 requests for 1 call), the stdlib source line that causes it, and the one-line fix.