AWS Elastic Beanstalk, Explained From Zero
How a single AWS service takes your application code and turns it into a running, load-balanced, auto-scaled, self-healing web application — without you touching a server by hand.
Imagine you have finished writing a web application. It works perfectly on your laptop. Now you need it to run on the internet, reachable by thousands of people, staying online even when a server crashes, and growing bigger automatically when traffic spikes. To do that by hand, you would need to launch virtual machines, install an operating system, configure a web server, set up a load balancer to spread traffic across machines, configure auto-scaling rules, set up health checks, wire up logging, and repeat all of that every single time you deploy a new version. AWS Elastic Beanstalk exists to do all of that for you. You hand it your code, and it builds and manages the entire running environment behind the scenes, while still letting you reach in and adjust anything you want. This guide walks through what Elastic Beanstalk actually is, how it works under the hood, and how to use it well — assuming you have never touched it before.
AWhat Elastic Beanstalk Actually Is
AWS Elastic Beanstalk is a Platform as a Service (PaaS) offered by Amazon Web Services. In plain terms, it is an orchestration layer that sits on top of ordinary AWS building blocks — EC2 virtual machines, Elastic Load Balancers, Auto Scaling Groups, Amazon S3 storage, and Amazon CloudWatch monitoring — and wires them together automatically based on the code you upload. You are not learning a brand-new proprietary technology. You are learning a service that configures technologies you likely already know about, so you do not have to configure them by hand every time.
Think of moving into a new apartment. You could buy raw land, pour concrete, run electrical wiring, and build a house from scratch — that is like manually provisioning EC2 instances, load balancers, and networking yourself. Or you could move into a fully built apartment where the plumbing, electricity, and walls are already done, and you just bring your furniture and start living — that is Elastic Beanstalk. The building (infrastructure) is prepared for you, but you still own the keys and can renovate any room whenever you like.
Elastic Beanstalk supports a wide range of “platforms” out of the box, including Java, .NET, PHP, Node.js, Python, Ruby, Go, and Docker containers. When you upload your application code (typically as a ZIP file or a container image), Elastic Beanstalk provisions the AWS resources needed to run it, deploys your code onto those resources, and continues to monitor and manage the environment for the lifetime of your application.
Elastic Beanstalk is not a separate compute engine like AWS Lambda. It does not run your code inside some mystery black box. It runs your code on real EC2 instances (or containers) that exist inside your own AWS account, and you can see, inspect, and log into every one of them if you need to. This is what separates it from a pure serverless platform — you get automation without losing visibility or control.
A common point of confusion for beginners is thinking Elastic Beanstalk itself is a hosting product with its own pricing. It is not. Elastic Beanstalk itself is free to use. You only pay for the underlying AWS resources it creates on your behalf — the EC2 instances, the load balancer, the storage, and so on — at their normal AWS prices. Elastic Beanstalk is simply the automation and management layer stacked on top.
Another way to understand what Elastic Beanstalk is doing is to think about the two very different jobs a running web application requires. The first job is writing the actual business logic — the routes, the database queries, the page templates. The second job is entirely different: keeping a computer online, patched, reachable, and able to survive one machine dying without taking the whole application down. Most developers are trained for the first job, not the second. Elastic Beanstalk exists specifically to absorb the second job, so a small team, or even a single developer, can ship something that behaves like it was built by a dedicated operations team.
It is also worth being precise about where Elastic Beanstalk sits within AWS’s broader family of compute services, since AWS offers several ways to run code and beginners often mix them up. At one extreme sits raw EC2, where you control every detail but must build every layer yourself. At the other extreme sits AWS Lambda, where AWS controls almost everything and you supply only a small function. Elastic Beanstalk deliberately sits in the middle: it automates the layers most applications need every time (load balancing, scaling, health checks, deployment) while leaving the underlying servers visible and adjustable, which is exactly the balance most beginner and intermediate teams need before their requirements become unusual enough to justify something more custom.
BArchitecture and Core Components
When you create an Elastic Beanstalk environment, several AWS resources are created and connected automatically. Understanding each piece makes everything else in this guide easier to follow.
Elastic Load Balancer (ELB)
Sits in front of your application and distributes incoming traffic across all healthy instances. Also performs health checks and stops sending traffic to any instance that fails them.
Auto Scaling Group (ASG)
A managed pool of EC2 instances that automatically grows when demand rises and shrinks when demand falls, based on rules you (or Elastic Beanstalk’s defaults) define.
EC2 Instances
The actual virtual machines running your application code, provisioned with a pre-baked Amazon Machine Image matching your chosen platform (Node.js, Python, Java, and so on).
Amazon S3 Bucket
Stores every application version you upload, so Elastic Beanstalk can deploy, roll back, and re-deploy any past version at any time.
Security Groups
Virtual firewalls automatically configured to allow only the necessary traffic between the load balancer, the instances, and the outside world.
Amazon CloudWatch
Collects metrics (CPU, latency, request counts) and logs from your environment, and triggers Auto Scaling actions and health alarms.
All of this is coordinated by a component you never directly provision yourself: the Elastic Beanstalk service, which watches over the environment, redeploys code when you push updates, and enforces the deployment policy you have chosen.
flowchart TB
U["End Users"] --> R53["Route 53
DNS"]
R53 --> ELB["Elastic Load Balancer
(health checks + routing)"]
subgraph EB["Elastic Beanstalk Environment"]
direction TB
ASG["Auto Scaling Group"]
ELB --> EC2A["EC2 Instance 1
App Code + Web Server"]
ELB --> EC2B["EC2 Instance 2
App Code + Web Server"]
ELB --> EC2C["EC2 Instance N
App Code + Web Server"]
ASG -. manages .-> EC2A
ASG -. manages .-> EC2B
ASG -. manages .-> EC2C
end
EC2A --> CW["CloudWatch
Metrics + Alarms"]
EC2B --> CW
EC2C --> CW
CW -. scale up/down .-> ASG
DEV["Developer"] -- "eb deploy / zip upload" --> S3["S3 Bucket
App Versions"]
S3 --> EBS["Elastic Beanstalk
Orchestration Service"]
EBS -- "provisions & updates" --> EC2A
EBS -- "provisions & updates" --> EC2B
EBS -- "provisions & updates" --> EC2C
EC2A -.optional.-> RDS["Amazon RDS
(optional database)"]
Fig 1. Request path (top) and deployment path (bottom) inside a typical Elastic Beanstalk web server environment
Notice two separate flows in the diagram. The top flow is what happens on every single page view: a user’s request goes through DNS, hits the load balancer, and lands on one of the healthy EC2 instances. The bottom flow is what happens only when you deploy: your code goes to S3, and the Elastic Beanstalk service reads it from there and rolls it out to the instances using whichever deployment strategy you have configured.
Each EC2 instance in the environment also runs a small piece of software called the host manager, which is easy to overlook but does a surprising amount of work. The host manager is responsible for pulling the application bundle down from S3, applying any custom configuration written in .ebextensions files, restarting the web server process after a deploy, rotating log files, and reporting instance-level health data back up to the Elastic Beanstalk service. Beginners rarely interact with the host manager directly, but understanding that it exists explains why, for example, a syntax error in an .ebextensions configuration file can cause an entire deployment to fail even though the application code itself is perfectly correct — the host manager failed to apply the customization step before the application could even start.
It also helps to know that not every one of these components is mandatory. A very small development environment can be created with no load balancer at all, running on a single EC2 instance, which is cheaper but sacrifices high availability. Similarly, an environment can be created without an attached database entirely, since most real applications keep their database as a separate, independently managed resource rather than something bound to the lifecycle of the web tier. The architecture shown above represents the common, production-ready shape of a Web Server Environment, not a fixed requirement.
CEnvironments, Applications, and Environment Tiers
Elastic Beanstalk organizes everything into two levels: an Application, and one or more Environments underneath it.
An Application is simply a logical container — a name and a place to store your uploaded code versions. It does not run anything by itself. An Environment is where the actual running infrastructure lives. A single Application can have multiple Environments, which is how teams commonly run separate “staging” and “production” copies of the same codebase, each with its own URL, its own instances, and its own configuration.
| Environment Tier | Sits Behind | Typical Use |
|---|---|---|
| Web Server Environment | Load Balancer, handles HTTP(S) requests | Public-facing web apps and REST APIs |
| Worker Environment | Amazon SQS queue, no public load balancer | Background jobs — sending emails, processing images, generating reports |
The Worker Environment tier is one of the most misunderstood parts of Elastic Beanstalk for beginners. Instead of a load balancer routing HTTP traffic to your instances, Elastic Beanstalk sets up an SQS (Simple Queue Service) queue in front of the instances. Your instances poll that queue for messages and process them one at a time. This is the correct tier to choose whenever your application does slow, asynchronous work that should not block a user waiting on a webpage.
A helpful mental model is to picture a restaurant kitchen. The Web Server Environment is the waiter taking orders at the counter — it needs to respond quickly, because a customer is standing there waiting. The Worker Environment is the kitchen staff cooking those orders in the back — the customer does not watch every step of that process, and the kitchen can work through a backlog of tickets at its own pace without the waiter ever being blocked. In a real application, this split commonly separates something like “render the checkout page instantly” (Web Server Environment) from something like “generate a PDF invoice and email it” (Worker Environment), so a slow, non-urgent task never makes the whole website feel sluggish.
Applications and Environments also interact with a third concept worth knowing early: Application Versions. Every time you deploy, Elastic Beanstalk stores the uploaded bundle as a distinct, numbered Application Version tied to the parent Application, independent of which Environment it is eventually deployed into. This is what makes it possible to deploy the exact same version to both a staging Environment and a production Environment, or to instantly redeploy an older version to a fresh Environment months later, since the historical bundle was never discarded.
DHow It Works Internally — The Deployment Lifecycle
Understanding what happens between the moment you run a deploy command and the moment your new code is live removes a lot of the “magic” and helps you debug problems later.
Package the source code
Your application code, along with any Elastic Beanstalk configuration files (a hidden folder named .ebextensions, or a Procfile/Dockerrun.aws.json), is zipped into an “application version”.
Upload to Amazon S3
The zip file is uploaded to an S3 bucket that Elastic Beanstalk created for your application. This becomes a permanent, versioned record you can redeploy or roll back to later.
Provision or update infrastructure via CloudFormation
Behind the scenes, Elastic Beanstalk generates and runs an AWS CloudFormation template describing every resource your environment needs, and creates or updates them.
Bootstrap each EC2 instance
Every EC2 instance runs a small agent (the “host manager”) that downloads the application version from S3, installs any dependencies, runs your .ebextensions customizations, and starts the web server or application process.
Register with the load balancer and begin health checks
Once an instance reports itself healthy, the load balancer starts routing real user traffic to it. Instances that fail health checks are pulled out of rotation automatically.
Continuous monitoring
Elastic Beanstalk’s enhanced health agent continues watching CPU, memory, request latency, and HTTP error rates for the lifetime of the environment, feeding data into the console’s health dashboard.
It is worth pausing on why this sequence matters so much in practice. Many beginners assume that a deploy is a single, instantaneous action, but in reality it is a chain of dependent steps, and a failure at any link stops the rollout before it reaches users. If step three fails because a CloudFormation update was rejected (for example, because a requested instance type is not available in the chosen Availability Zone), no new code ever reaches an instance, and the environment simply keeps serving the previous version. If step four fails because a dependency could not be installed, that specific instance is marked unhealthy and is never registered with the load balancer, so broken code is never silently exposed to real users. This built-in insistence on health checks before traffic registration is one of the main reasons Elastic Beanstalk deployments are safer by default than a naive manual deployment script.
Because Elastic Beanstalk uses AWS CloudFormation internally, every environment you create is really a CloudFormation stack. This is why deleting an Elastic Beanstalk environment cleanly removes every resource it created — the load balancer, the Auto Scaling Group, the security groups — instead of leaving orphaned resources behind, as long as you did not detach or manually modify those resources outside of Elastic Beanstalk.
EDeployment Policies — How New Code Reaches Users
| Policy | How It Behaves | Downtime Risk |
|---|---|---|
| All at once | Deploys to every instance simultaneously | Highest — brief full outage possible |
| Rolling | Deploys in batches, taking each batch out of service temporarily | Reduced capacity during deploy |
| Rolling with additional batch | Launches one extra batch of new instances first, then rolls the rest | Low — full capacity maintained |
| Immutable | Launches an entirely new, parallel Auto Scaling Group with the new version, then swaps traffic over | Very low, easiest safe rollback |
| Traffic splitting | Sends a small percentage of live traffic to the new version before a full rollout | Lowest — canary-style testing in production |
| Blue/Green (via CNAME swap) | Deploy to an entirely separate environment, then swap the environment URLs | Near-zero — instant rollback by swapping back |
Beginners typically start with the “All at once” default while learning, then move to “Rolling with additional batch” or “Immutable” once an application is handling real production traffic, because those strategies avoid taking capacity offline during a deploy.
The Immutable strategy deserves a closer look, because it solves a subtle problem the other rolling strategies do not. With a standard rolling deployment, old and new code run side by side, on the same shared Auto Scaling Group, for the duration of the rollout. If the new version has introduced an incompatible change — for example, a database schema field the old code does not expect — both versions can end up serving traffic to the same users simultaneously, producing inconsistent behavior. Immutable deployments avoid this entirely by launching a completely separate, temporary Auto Scaling Group running only the new version, verifying its health in isolation, and only then merging it into the environment while terminating the old group. This is slower and briefly doubles the number of running instances, but it guarantees that no two incompatible versions of your code ever answer requests at the same moment.
The Blue/Green pattern, implemented in Elastic Beanstalk by swapping the CNAME of two independent environments, goes a step further still. Because staging and production are entirely separate environments with their own resources, a deployment to staging cannot affect production traffic at all, no matter what happens. Once the new version has been fully verified in the staging environment, swapping the CNAME redirects the production domain to point at what used to be staging, and vice versa, essentially instantaneously from the end user’s perspective. If a problem is discovered after the swap, reversing it is just another CNAME swap, making this the fastest rollback strategy Elastic Beanstalk offers.
FPerformance and Scalability
Elastic Beanstalk’s scalability comes entirely from the Auto Scaling Group it manages, not from any special trick of its own. You define scaling triggers — commonly average CPU utilization, but also network throughput or request count per target — and the Auto Scaling Group launches new EC2 instances when the trigger’s upper threshold is crossed, and terminates instances when load drops below the lower threshold.
Production Example — Expedia
Travel booking platform Expedia has used Elastic Beanstalk to host portions of its web infrastructure, relying on its Auto Scaling integration to absorb large, unpredictable traffic surges around holidays and flash sales without manual capacity planning for every event.
Because scaling decisions are based on real CloudWatch metrics rather than guesswork, the environment reacts to actual load rather than a fixed, over-provisioned capacity. The trade-off beginners must understand is scaling latency: a brand-new EC2 instance takes anywhere from tens of seconds to a few minutes to boot, install dependencies, and pass health checks before it can serve traffic, so Auto Scaling reacts to sustained load trends, not instantaneous traffic spikes.
Two settings shape almost every scaling decision an Elastic Beanstalk environment makes: the minimum and maximum instance count of the Auto Scaling Group. The minimum guarantees a floor of capacity even during quiet periods, which matters for high availability as much as for performance, since it is also what keeps the environment spread across multiple Availability Zones at all times. The maximum acts as a safety ceiling, preventing a runaway scaling loop (caused, for instance, by a bug that makes every request unusually slow) from silently launching hundreds of instances and generating an unexpectedly large bill. Setting these two numbers thoughtfully, rather than leaving default values in place, is one of the simplest and most effective performance and cost decisions a beginner can make early on.
GHigh Availability and Reliability
A single EC2 instance is a single point of failure. Elastic Beanstalk avoids this by default whenever you choose a load-balanced, multi-instance environment: it spreads your instances across multiple Availability Zones (physically separate data centers within the same AWS region), so the failure of one data center does not take your whole application offline.
It is the difference between having one cashier at a store versus three cashiers spread across three separate store locations in different neighborhoods. If one location loses power, the other two keep serving customers, and the load balancer is like a dispatcher directing shoppers to whichever location is currently open and not overcrowded.
Elastic Beanstalk’s enhanced health reporting continuously checks each instance’s operating system metrics, application response codes, and process status, assigning each instance and the environment overall a color-coded status (green, yellow, red) so problems surface long before a total outage happens.
Reliability also depends on how gracefully instances are replaced, not just on how many exist. When the Auto Scaling Group terminates an instance — whether because it failed a health check or because a scale-in event reduced desired capacity — the load balancer is first given a chance to finish routing any in-flight requests to that instance and to stop sending it new ones, a behavior known as connection draining. Without this grace period, a user could be sent a partial or broken response right at the moment their request happened to land on the instance being removed. Elastic Beanstalk configures connection draining automatically, which is one of many small defaults that add up to a genuinely reliable system without requiring the developer to know the term exists.
HSecurity
Security in Elastic Beanstalk follows AWS’s shared responsibility model: AWS secures the underlying infrastructure, and you are responsible for configuring access correctly and keeping your application code and platform version patched.
Instance Profile
Every EC2 instance in the environment runs under an IAM role, granting only the AWS permissions your application actually needs — never broad account-wide access.
Security Groups
Auto-generated firewall rules restrict which ports and sources can reach your instances, typically allowing inbound traffic only from the load balancer, not directly from the internet.
HTTPS Termination
TLS/SSL certificates (often via AWS Certificate Manager) can be attached to the load balancer, so encrypted traffic is terminated there before reaching your instances.
VPC Placement
Environments run inside your Virtual Private Cloud, letting you place instances in private subnets with no direct public IP address at all.
Elastic Beanstalk does not automatically patch your application’s dependencies or your chosen platform version. Leaving an environment on an old, deprecated platform version (for example, an unsupported Node.js runtime) is one of the most common real-world security gaps — AWS periodically retires old platform versions, and you are responsible for upgrading before that happens.
IMonitoring, Logging, and Observability
Every Elastic Beanstalk environment ships with a built-in health dashboard in the AWS Console showing per-instance CPU, latency, and HTTP status code breakdowns at a glance, powered by CloudWatch under the hood. Beyond the built-in dashboard, logs from your web server and application process can be pulled on demand or streamed continuously to Amazon CloudWatch Logs, so you are not limited to log data that disappears when an instance is replaced.
A frequent beginner mistake is relying only on the console’s health color and never enabling log streaming to CloudWatch Logs. When an Auto Scaling event terminates an unhealthy instance, its local log files go with it unless they were streamed off the box beforehand — making a real production incident impossible to diagnose after the fact.
Observability in Elastic Beanstalk is really two separate stories that beginners tend to conflate: infrastructure health and application health. Infrastructure health answers “is the machine itself okay” — CPU load, disk space, memory pressure. Application health answers a different question entirely: “is the code running on that machine actually serving correct responses.” A machine can look perfectly healthy at the infrastructure level (low CPU, plenty of memory) while the application running on it returns nothing but error pages, if, for example, it lost its database connection. Elastic Beanstalk’s enhanced health reporting tier was built specifically to close this gap, by inspecting HTTP status codes returned by the application itself and folding that signal into the overall health color, rather than trusting infrastructure metrics alone.
JCost, Consistency, and Trade-offs
Elastic Beanstalk itself carries no additional service fee — you pay standard AWS rates for whatever EC2 instances, load balancer, storage, and data transfer your environment consumes, exactly as if you had provisioned them yourself. The value it provides is time and operational consistency, not lower infrastructure cost.
On consistency: because environment configuration can be saved as versioned Saved Configurations and reapplied, teams can guarantee that staging and production environments were built from an identical blueprint, reducing the classic “it worked in staging” class of bug caused by drifted, hand-configured infrastructure.
Cost visibility is one area where Elastic Beanstalk genuinely helps beginners avoid a common trap. Because every resource it creates is tagged and grouped under a single Environment, reading an AWS bill and understanding exactly which application is responsible for which charge is far easier than it would be with a sprawling set of manually created, loosely related resources. A developer can look at the Auto Scaling Group’s instance count, the chosen instance type, and the load balancer type, and estimate a monthly cost fairly precisely before ever deploying, simply by pricing those same components on the standard EC2 and Elastic Load Balancing pricing pages, since Elastic Beanstalk introduces no hidden or marked-up pricing of its own.
Context
A team is choosing between Elastic Beanstalk and manually assembling EC2, an Auto Scaling Group, and a load balancer with Infrastructure-as-Code tools like Terraform or raw CloudFormation.
Decision
Elastic Beanstalk trades a small amount of fine-grained control for a large reduction in setup time and ongoing operational overhead, using .ebextensions and configuration options to recover most of that control when needed.
Consequence
Teams gain fast onboarding and consistent environments, but must accept that very unusual or highly custom infrastructure topologies may eventually outgrow what Elastic Beanstalk can express, at which point a migration to raw CloudFormation, Terraform, or container orchestration (ECS/EKS) becomes more attractive.
KPros and Cons
Advantages
- Fast path from code to a running, load-balanced, auto-scaled environment
- No extra Elastic Beanstalk fee — you only pay for the AWS resources used
- Full access to underlying EC2 instances when deeper control is needed
- Built-in blue/green style deployments via environment swap
- Supports many languages and Docker, covering most common stacks
- Automatic health monitoring and unhealthy-instance replacement
Disadvantages
- Not truly serverless — you still own patching and platform upgrades
- New instance provisioning has meaningful cold-start latency during scale-out
- Very unusual custom architectures can outgrow its configuration model
- Manual changes made outside Elastic Beanstalk can cause configuration drift
- Debugging
.ebextensionsfailures can be unintuitive for beginners
None of these disadvantages are unique flaws of Elastic Beanstalk so much as they are the natural cost of choosing a PaaS layer instead of hand-rolled infrastructure or a fully serverless platform. Every point on that spectrum trades some amount of control for some amount of convenience, and the disadvantages listed here are simply what that trade looks like from the Elastic Beanstalk position on the spectrum — more convenience than raw EC2 or Terraform, more visible infrastructure and operational responsibility than Lambda or App Runner.
LCommon Traps, Gotchas, and Myths
MFailure Scenarios and Recovery
Bad Deployment Breaks the App
Recovery: roll back to the previous application version stored in S3, or redeploy the last known-good version, within seconds via the console or CLI.
An Instance Fails Health Checks
Recovery: the load balancer stops routing traffic to it immediately; the Auto Scaling Group terminates and replaces it automatically without manual intervention.
An Entire Availability Zone Outage
Recovery: remaining instances in unaffected Availability Zones continue serving traffic; the Auto Scaling Group launches replacements in healthy zones.
A Bad Configuration Change
Recovery: apply a previously saved configuration, or use the environment’s configuration history to revert the specific setting that was changed.
It is useful to separate these recovery mechanisms into two categories, because they operate on very different timescales. Instance-level recovery — replacing a single unhealthy server — is fully automatic and typically resolves within a few minutes without anyone noticing. Deployment-level recovery — rolling back a bad release — requires a human decision, because Elastic Beanstalk cannot know on its own whether a spike in error rates after a deploy is an actual bug or an expected, temporary side effect of the new code warming up. This is exactly why monitoring and alerting matter as much as the automation itself: automation handles the mechanical part of recovery, but a person still has to notice something is wrong and choose to roll back.
NBest Practices and Anti-Patterns
Best Practices
- Use immutable or rolling-with-additional-batch deployments in production
- Decouple the database from the environment (use a standalone RDS instance)
- Store configuration in version-controlled
.ebextensionsfiles - Enable log streaming to CloudWatch Logs before you need it
- Keep platform versions current rather than deferring upgrades
Anti-Patterns
- Attaching a production database directly inside the Elastic Beanstalk environment
- Hand-editing infrastructure resources outside the Elastic Beanstalk console/CLI
- Running production traffic on a single-instance environment
- Storing user-uploaded files on local instance disk instead of S3
- Ignoring platform end-of-life notices from AWS
OReal-World Usage Patterns
Startup MVP Hosting
Early-stage teams frequently choose Elastic Beanstalk to get a production-grade, auto-scaled deployment running within a day, without hiring a dedicated infrastructure engineer, then migrate to more custom infrastructure only once genuinely outgrowing it.
Background Job Processing
Companies commonly pair a Web Server Environment (handling user requests) with a Worker Environment (processing queued background jobs like report generation or email sending) under the same Application, so heavy async work never slows down the user-facing site.
Enterprise Internal Tools
Organizations often use Elastic Beanstalk for internal dashboards and admin tools, valuing the fast setup and built-in monitoring over the deeper customization that customer-facing flagship products might eventually need.
Staging and Production Parity
Teams frequently create two Environments under the same Application — one named staging and one named production — deployed from the same Saved Configuration, so a release is tested against infrastructure that is a near-exact copy of what real users will hit, catching configuration-related bugs before they reach customers.
PFAQ
QSummary and Key Takeaways
What to Remember
- Elastic Beanstalk is an orchestration layer, not a new compute technology — it configures EC2, ELB, Auto Scaling, S3, and CloudWatch on your behalf.
- It is free to use; you only pay for the standard AWS resources it provisions.
- Choose between a Web Server Environment for HTTP traffic and a Worker Environment for queue-driven background jobs.
- Deployment policies (Rolling, Immutable, Traffic Splitting, Blue/Green) let you trade deploy speed for safety as an application matures.
- High availability comes from spreading instances across multiple Availability Zones behind a load balancer — a single-instance environment is not highly available.
- You retain full access to underlying EC2 instances, which is the key difference from fully serverless platforms like Lambda.
- Following best practices — decoupled databases, version-controlled configuration, streamed logs, current platform versions — avoids nearly all of the common production pitfalls covered in this guide.