My understanding of Elastic Beanstalk is that when you deploy a new version of your app, that it deploys it to the Amazon EC2 instances one at a time (if you have more than one). However, even with a minimum of two instances, my application incurs a short amount of downtime when I upload a new .war
when it is deploying it, as if it is updating them both simultaneously. Is there a way I can ensure there is no downtime and that one instance is fully updated and accepting requests before the next starts: Here is how the events look. Note this is with zero load on the app, so it will only get worse with production traffic.
INFO
Environment update completed successfully.
INFO
New application version was deployed to running EC2 instances.
ERROR
The application did not respond at the health check URL.
INFO
Waiting for 8 seconds while EC2 instances download the updated application version.
INFO
Deploying version SomethingMore to 2 instance(s).
To achieve this goal in Elastic Beanstalk, you'll need to expand your deployment procedure to facilitate multiple Environments (see AWS Elastic Beanstalk Components):
An environment is a version that is deployed onto AWS resources. Each environment runs only a single version, however you can run the same version or different versions in many environments at the same time. [...] For more information about the environment and the resources that are created, see Architectural Overview. [emphasis mine]
This feature is useful for testing/debugging separate versions already, but specifically this enables hot swapping of environments as well, see Deploying Versions With Zero Downtime for a respective walkthrough:
Since AWS Elastic Beanstalk performs an in-place update when you update your application versions, you will experience some downtime. However, it is possible to avoid this downtime by swapping the CNAMEs for your environments. This section walks you through how to perform a CNAME swap using the AWS Management Console, the command line interface, or APIs. [emphasis mine]