If enough of these considerations match your needs, then AWS looks great, otherwise look to dedicated servers.
I want to save time by not having to learn Amazon specific APIs (which seem to be terribly engineered, cause every time I want to throw a small project that way I find myself in a morass of poor documentation and way too complificated configurations.)
So, I see that really as an added cost.
Most of the standard infrastructure is quite replaceable. S3 can be easily replaced by more or less any file storage system (in Django it's 1 line of configuration), ELB can be replaced by any load balancer, ec2 by dedicated servers, etc.
Admittedly, some code changes are required, but nothing architectural (e.g., S3BotoStorage -> RackspaceStorage in django). For anything bigger than a hobby project, it shouldn't be a major barrier.
Your point on vendor lockin is certainly valid: if you really take advantage of AWS services, you are locked in without a porting effort (like AppEngine).