These requirements basically entail that you're able to achieve feature parity with an on-premises datacenter; thus, you're treating various cloud providers as vendors for VMs, storage, and network. "Treating the cloud like it's a datacenter" isn't exactly a best practice from a pure architectural perspective.
That said, there may well be business constraints forcing the decision, and that's fine--I'm not trying to pass judgement any! My point is simply that by building something that can be deployed to any and all environments you're reducing the list of what can be used down to a very small set of primitives.
That said, there may well be business constraints forcing the decision, and that's fine--I'm not trying to pass judgement any! My point is simply that by building something that can be deployed to any and all environments you're reducing the list of what can be used down to a very small set of primitives.