AppEngine had the misfortune of being too early.
I remember checking out both in 2007, right when AppEngine first launched. EC2 was just Linux; you had a familiar virtual machine to work with, and you could port your existing code over with virtually no effort. AppEngine required learning a whole new API, which was completely non-portable and locked in to Google, and that was a complete non-starter.
Also, being a PaaS, there was a lot more to get right with AppEngine, and the API changed a lot over the years. I remember looking at it in 2007 and thinking "There is no possible way I can get work done with this." In 2009, it was "Well, it might work, but it's way too much hassle." In 2010, it was "Nope, still too hard." Finally in 2012, I tried it again and it was like "Woah, finally this stuff is usable, and it's actually pretty pleasant." But by then, the outside world had Heroku, it had Beanstalk, it had Parse & Firebase, and there's a huge ecosystem around AWS.
It's a pretty good example of path dependence. If you're just coming to cloud computing now and have never run your own software before, AppEngine is actually a fairly nice alternative. But in 2007-2009, when a lot of us were first checking it out, it was an overly-complicated, vendor-lock-in mess. And vendor lock-in mattered a lot more then; now many developers have just accepted that they're going to be locked into certain platforms, but back then, building on anything that didn't have a publicly-specified API was a huge mistake.