@ducks identified the timeouts in the SDK for acquiring IMDS credentials are very aggressive (1 second, no retries) so it’s possible that it’s hitting that timeout.
But that’s just a guess.
If you console into prod can you do it interactively, e.g.:
discourse(prod)> c = Aws::S3::Client.new(region: ENV['DISCOURSE_S3_REGION'])
=> #<Aws::S3::Client>
discourse(prod)> c.list_objects_v2(bucket: ENV['DISCOURSE_S3_BUCKET']).contents.count
=> 1000