This week, we continue our look at the almost endless array of options for deploying your applications on AWS. We've talked extensively about Amazon Elastic Container Service (ECS) in the past. But how does it stand up against other AWS deployment features? In this article, I'll compare it to a longtime member of the AWS family, Elastic Beanstalk. Which is better? And which one should you use when?
AWS Elastic Beanstalk
Elastic Beanstalk is an AWS feature focused on rapid application deployment. It was one of the earliest attempts at AWS at simplifying deployment along the same lines as PaaS vendors such as Heroku.
Standing up a scalable application on AWS from scratch isn't easy. But with Elastic Beanstalk, you can use a handful of commands or clicks to spin up your application code and all of its required infrastructure. Just supply a pointer to your code and Elastic Beanstalk will handle creating its computing capacity, application security groups, and other required configuration. In other words, you can begin hosting applications on AWS with minimal AWS knowledge.
Another one of Elastic Beanstalk's strengths is its support for a vast array of languages and environments. Beanstalk supports Java, .NET (both Windows Server and .NET Core), PHP, Python, and Go, among others.
Beanstalk can also host any application as a Docker container, meaning it can host practically anything. Docker works by packaging applications in a container - a fully self-contained version of a full-fledged operating system (e.g., Linux) containing all of the dependencies and configuration an app needs to run.
Elastic Beanstalk also supports scaling your application. You can specify that a Beanstalk deployment use Application Load Balancer to route traffic. If your application experiences a usage spike, Beanstalk will increase the number of EC2 instances used to host it and use the load balancer to direct requests to an available instance.
It's pretty easy to monitor an Elastic Beanstalk application. By default, Beanstalk performs health checks on your EC2 instances and warns you if your application isn't responsive. You can also enable enhanced health monitoring, which installs a monitoring agent on each EC2 instance and reports additional metrics about virtual machine health and performance. Beanstalk also enables fetching and downloading EC2 instance logs directly from the AWS Console.
Beanstalk is designed primarily to be used out of the box. However, it has a number of extensibility options that you can leverage for enhanced functionality. You can use an extensions file, for example, to enable SSH access to your instances, pass custom environment variables, and more.
We've spent a ton of time discussing ECS on this blog. And with good reason! ECS is a powerful way to host your app in an infinitely scalable fashion.
Using ECS, you can host anything from a small proof of concept project to a sprawling microservices architecture serving millions of customers a day. The flexibility and scalability of ECS is why we use it at TinyStacks as the foundation of our automated DevOps offering.
ECS is a host for Docker containers. Once you have packaged your application as an container, you can create an ECS cluster on AWS to host it. You can stand up your own cluster using Amazon EC2 instances, or use AWS's Fargate service to handle hosting for you.
If you haven't used ECS before and want a detailed walkthrough, see our post on how to launch an application using Amazon Elastic Container Repository (ECR) and ECS.
Elastic Beanstalk or ECS?
The critical question: Which one should you use? This depends on three factors: your use case, your expected traffic usage, and the AWS knowledge within your current team.
Elastic Beanstalk Pros and Cons
The benefit of Elastic Beanstalk is its ease of use. The AWS Management Console makes it easy to start a highly scalable application just by supplying your application code. Your team doesn't need to be experts in AWS. And you don't need to hire a DevOps engineer or team to manage your environment for you.
Since Beanstalk can fully automated in both AWS CloudFormation and via the command line, you can also use it as part of your early journey into DevOps. When you're just getting started, you can use Beanstalk in its simplest form via the console or CLI to deploy your apps to production. As time goes on and your application grows more complex, you can integrate it into a larger AWS infrastructure deployment.
Elastic Beanstalk also has a decent pricing model. The service itself costs nothing - you only pay for the EC2 capacity, load balancer capacity, and associated data in/out.
However, Beanstalk has some limitations. First, while it's extensible, its extensibility has limitations. For example, as Merlin Carter points out, Beanstalk doesn't handle things such as worker processes well. Beanstalk also breaks down if you load it up with a lot of custom configurations, such as environment variables (there's a 4K total limit on the environment variable payload). In my own time at AWS, I've seen customers struggle to resolve issues with Elastic Beanstalk when their extensions file became too complex.
Second, Elastic Beanstalk can be hard to monitor and debug. While Beanstalk itself does provide some alerting and metrics, these are all very basic. If there's an issue with a specific EC2 instance in a Beanstalk deployment, your only way to diagnose it is to download and comb through the deployment's log files.
Third, Elastic Beanstalk only handles application hosting. If your application needs are simple - i.e., a single application, some EC2 instances, load balancing, and possible a database - then Beanstalk may serve your needs well. But if you require other AWS infrastructure, you'll still need to figure out how to provision and maintain that - and how to deploy and version it with the rest of your application. It would be very hard, for example, to orchestrate a complex microservices architecture just using Beanstalk.
In general, the more complex your infrastructure needs are, the more the ease of use benefits of Beanstalk dwindle.
Finally, Beanstalk is old. It's been an AWS service since 2011. And while it does receive regular updates, these are mainly for maintaining supportability for new versions of existing frameworks and virtual machine environments. Compared to other AWS services, Elastic Beanstalk hasn't added many notable new features in the past several years.
ECS Pros and Cons
The greatest benefit of ECS is its scalability. ECS was designed to handle everything from a small internal application to a large enterprise app that handles millions of requests an hour. ECS is also well suited to enabling complex design patterns, such as microservices architectures.
The major downside of ECS compared to Elastic Beanstalk is that ECS is much, much more complex to use. Users need to understand a host of concepts surrounding containerization, clusters, services, tasks, and other ECS-specific concepts.
Teams that are just starting out can mitigate some of this complexity with tools such as AWS Copilot. Copilot is a command line application that enables standing up an ECS cluster in a few minutes with a simple command-line interface. It's basically Elastic Beanstalk for containers.
Like Beanstalk, however, Copilot has its own limitations. It's ideally suited to launching a single containerized application hosted behind a load balancer with auto scaling. Ultimately, most ECS users will want to automate their deployments using either AWS CloudFormation or one of the language-specific SDKs. And that, of course, introduces additional complexity and time into the application development process.
Elastic Beanstalk is a solid way to get started with application deployment on AWS. However, many teams will likely find themselves running up against its limitations as their application grows in scale and complexity. If you're just starting out on AWS, it's worth investigating whether Beanstalk will fill your needs in the short term while preparing to a migration to containerization and ECS in the near-term future.
TinyStacks: ECS Without the Complexity
We here at TinyStacks are pretty fond of AWS, and of ECS in particular. But we also believe that the cloud is too complex. That's why we've built TinyStacks to help combine the ease of use of tools like Elastic Beanstalk with the scalability of ECS. With TinyStacks, you can containerize your app and have it up in running on the cloud in minutes - not days.
We also do one thing that other tools don't do: automated DevOps. We not only launch your app in a scalable and secure manner - we make it easy to create a full application pipeline that covers all stages of the process of application development. TinyStacks acts as your in-house, point-and-click AWS and DevOps expert.
Want to see for yourself? Contact us and give it a try!