UPDATE 2015-07-31: Removed the section about
.ebextensions. I have confirmed that this is not needed. This mistake was an artifact of my troubleshooting process.
UPDATE 2015-07-28: I briefly talked to Nick Humrich and Abhishek K Singh on Twitter, pointed them to this article, and it was fixed in less than 24 hours. Nice work! If you update your EB CLI tools to 3.4.7 or greater the bug will be fixed for you and you can ignore the rest of this article.
In June this year AWS added the ability to run multiple WAR files with Elastic Beanstalk in a single EC2 instance. This makes deploying several small applications a lot more cost effective.
In order to do this you need to create a ZIP file containing all of the WAR files you want to deploy
and you must include a directory called .
.ebextensions even if it is empty. In my case I just added and empty file called
.ebextensions/README.md to make it happy. Obviously if you use
.ebextensions for any kind of customization you won’t need to do anything
When Elastic Beanstalk sees that you’ve deployed a file like this it treats it differently than a normal bundle. It takes the WAR file called
ROOT.war and deploys that as the root application. The rest of the WAR files are deployed in directories derived from their file names. For example,
application1.war would be accessed through the
eb deploy creates a ZIP file that includes everything in your current directory. The problem is that
eb init creates a
.gitignore file in your deployment directory.
eb deploy picks that up that
.gitignore and adds it to the archive. On the EC2 instance that runs your application it sees that your archive doesn’t contain just WAR files and the
.ebextensions directory and it treats it like a normal single application deployment. If/when this happens you’ll see that you just get your WAR files placed in the
There are two possible fixes for this problem.
Solution #1: You can just delete the
.gitignore file. IMHO, this isn’t a great solution since you need to remember to do it for each project.
Solution #2: You can patch the Python code that creates the ZIP archive and tell it to ignore the
.gitignore file. To do that you need to modify your
ebcli/core/fileoperations.py file. On my system, since I’m not using
pip, it was located at
~/.ebvenv/lib/python2.7/site-packages/ebcli/core/fileoperations.py. If you use
pip or another package manager it will probably be in a different location.
The function you need to modify is called
zip_up_folder. My original version looks like this:
1 2 3 4 5 6 7 8 9 10 11
The code I added to set up the ignore_list is:
1 2 3
So my updated function looks like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
After updating that code and doing another
eb deploy my set of WARs were all happily running in a single EC2 instance as I’d expect.