TL/DR: Put 2 .war files in the .zip file instead of 1.
I realize this post is nearly 18 months old. But I experienced exactly the same symptoms, so this seemed as good a place as any to share my discovery.
Premise: deploying a .war file works well, exactly as expected.
Observation: Elastic Beanstalk does this automatically:
/usr/share/tomcat/webapps/ROOT/[contents of .war are placed here]
Problem: deploying a .zip file containing this .war file along with valid config files does NOT work well.
Observation: Elastic Beanstalk does this automatically:
/usr/share/tomcat/webapps/ROOT/[my-war.war is placed here]
To me this seems like a bug. Perhaps it's intended behavior... but I don't understand it. Placing the .war file in webapps would make sense. Placing the contents of the .war in ROOT would make sense. But placing the .war file there directly seems very strange.
Solution: Add a second .war file to the .zip (even if you don't need the second app!).
Observation: Elastic Beanstalk does this automatically:
/usr/share/tomcat/webapps/[my-war.war is placed here]
/usr/share/tomcat/webapps/[my-other-war.war is placed here]
Now my-war.war deploys normally, and life is good.