Not disagreeing per se, but I believe it's much more important to design for migration between providers instead of designing for abstraction over providers. The difference is subtle, but trying to make predictions about what needs abstraction will most likely lead to the same (or bigger) costs when a migration actually happens.
It's a bit like the general advice to design to avoid getting stuck in a hole as opposed to designing to getting out of future holes.