What Is AWS Elastic Beanstalk? Standard vs Cluster Mode

Logeshwaran
—

AWS Elastic Beanstalk is the service to use when you already have an application and want to deploy it on AWS without manually assembling every server, load balancer, Auto Scaling rule, deployment script, and health check first. You give Beanstalk your Node.js, Python, Java, .NET, PHP, Ruby, Go, or Docker application and it manages much of the environment around it. The counterintuitive part is the new Cluster mode: it is advertised with no additional charge, yet the Amazon EKS cluster under it costs about $73 a month before your app serves a single request, roughly six times AWS’s own minimal Standard setup.

Quick answer: Elastic Beanstalk is AWS's managed application deployment platform. Upload an application, choose a runtime or container model, create an environment, and Beanstalk handles much of the provisioning, deployment, scaling integration, health reporting, and platform management. It is especially useful when your goal is simply, "Get my normal web application running on AWS before I learn every infrastructure service."

You can think of Elastic Beanstalk as an orchestration layer between your source code and services such as Amazon EC2, Auto Scaling, Elastic Load Balancing, CloudWatch, IAM, and networking. You still own those resources and pay for them, but you do not have to construct the whole hosting platform manually before your first deployment.

That makes Beanstalk a practical starting point for an Express API, Django application, Flask service, Spring Boot application, ASP.NET Core project, PHP application, Rails application, Go service, or Dockerized web application that needs traditional long-running compute.

What Elastic Beanstalk actually does

Suppose you have finished a Node.js application on your laptop. The application works locally, and now you want customers to reach it over the internet.

If you build the hosting environment manually, your first list might include an EC2 instance, an operating system, Node.js installation, a reverse proxy, security groups, an IAM role, a deployment mechanism, health checks, CloudWatch monitoring, DNS, HTTPS, Auto Scaling, and perhaps an Application Load Balancer.

None of those pieces is impossible to learn. The problem is that you may need to understand all of them before the first customer can see a page.

Elastic Beanstalk changes the workflow. You create an application and an environment, choose a platform, provide your source bundle, and let Beanstalk provision the environment.

Your source code
        ↓
Elastic Beanstalk
        ↓
Application version
        ↓
Environment
        ↓
EC2 / load balancer / Auto Scaling / monitoring
        ↓
Customers

The most important word there is environment. Beanstalk manages a running environment for your application rather than merely giving you a virtual machine.

Task Direct infrastructure approach Elastic Beanstalk approach
Create compute Launch and configure instances yourself Environment provisions the required capacity
Runtime Install and maintain it yourself Choose a managed platform branch
Deployment Build your own process Deploy application versions
Load balancing Configure separately Can be integrated into the environment
Scaling Configure Auto Scaling directly Configure environment capacity and scaling
Health Assemble monitoring yourself Environment health is a first-class concept

Beanstalk therefore sits higher in the stack than EC2 but lower than a service that completely hides servers and infrastructure from you.

Learn these four terms before anything else

You do not need to memorize the whole Elastic Beanstalk console. Learn four nouns first: application, application version, environment, and platform.

Term Plain-English meaning
Application The logical project that contains related environments and application versions.
Application version A deployable build or source bundle of your application.
Environment The running AWS resources serving one application version.
Platform The operating system, runtime, web or application server, and Beanstalk components used to run the application in a Standard environment.

Jake owns a phone shop and has built a small inventory application. He could create one Beanstalk application named:

jakes-phone-shop

Inside that application he could have:

jakes-phone-shop
├── shop-development
└── shop-production

The development and production environments can run different configurations while both remain part of the same logical application.

Jake: "So the Beanstalk application is not an EC2 instance?"

Ethan: "Exactly. The application is your project. The environment is where a version of that project runs. Keep those two ideas separate and half the console immediately makes more sense."

The fastest sensible first deployment

The beginner mistake is trying to design the final production architecture before confirming that the application can even start inside Beanstalk.

Your first goal should be one healthy environment.

  1. Open Elastic Beanstalk in the AWS console.
  2. Create an application.
  3. Create a web server environment.
  4. Choose the platform that matches the project.
  5. Use a currently supported platform branch.
  6. Start with the sample application if you have never used Beanstalk before.
  7. Create the environment and wait for provisioning to finish.
  8. Open the generated environment domain.
  9. Confirm that the sample environment is healthy.
  10. Deploy your own application version.
  11. If it fails, read environment events and logs before changing networking settings.

This sequence separates two questions:

Question one: Can Beanstalk create a functioning environment in this account and Region?

Question two: Can your application run correctly inside that environment?

If the sample application works and your code does not, you have dramatically reduced the troubleshooting space.

A complete minimal Node.js example

Here is a small Express application that follows the basic pattern you want on Beanstalk.

package.json

{
  "name": "beanstalk-demo",
  "version": "1.0.0",
  "description": "Elastic Beanstalk demo",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "^5.0.0"
  }
}

app.js

const express = require("express");

const app = express();

const port = process.env.PORT || 8080;

app.get("/", (req, res) => {
  res.send(`
    <h1>Elastic Beanstalk is working</h1>
    <p>Version 1.0.0</p>
  `);
});

app.get("/health", (req, res) => {
  res.status(200).json({
    status: "ok",
    timestamp: new Date().toISOString()
  });
});

app.listen(port, "0.0.0.0", () => {
  console.log(`Application listening on port ${port}`);
});

Install and run it locally:

npm install
npm start

Then visit:

http://localhost:8080

The important detail is that the application reads its port from the environment rather than assuming that a hard-coded public port will always be correct.

When a Beanstalk application returns a 502 immediately after deployment, a wrong startup command or wrong listening port is often more likely than an exotic AWS networking problem.

Get the source bundle structure right

One simple packaging mistake can make a completely valid application fail after upload.

If Beanstalk expects application files at the root of your source bundle, do not create an unnecessary outer folder.

Good:

app.zip
├── app.js
├── package.json
├── public/
└── .ebextensions/

Avoid packaging it like this when the platform expects the project files at the archive root:

app.zip
└── my-project/
    ├── app.js
    └── package.json

The archive can upload successfully while the deployment later fails because the runtime cannot find the expected project files.

Also avoid shipping unnecessary directories such as local caches, enormous development-only dependency folders, editor metadata, test fixtures, and secrets.

Use the EB CLI once console uploads become annoying

The console is excellent for learning. Repeatedly building a ZIP file and uploading it manually becomes tedious quickly.

The EB CLI gives you commands centered on the application environment.

eb init
eb create
eb status
eb health
eb deploy
eb logs
eb open
Command Why you use it
eb init Initialize Beanstalk settings for the local project.
eb create Create an environment.
eb deploy Deploy a new application version.
eb status See environment status information.
eb health Inspect health information.
eb logs Retrieve logs.
eb open Open the environment in a browser.

The conceptual workflow becomes:

Edit code
   ↓
Test locally
   ↓
Commit
   ↓
eb deploy
   ↓
Check health
   ↓
Check logs if needed

That is a much more useful development loop than treating every deployment as a one-off server operation.

.ebextensions and .platform: where custom behavior belongs

Eventually you will need environment behavior that cannot be expressed by application code alone.

Two names appear repeatedly on modern Linux Beanstalk environments:

  • .ebextensions for Beanstalk configuration files and option settings.
  • .platform for platform-level extensions such as hooks and proxy configuration.

An application source tree might look like:

my-app/
├── app.js
├── package.json
├── .ebextensions/
│   └── deployment.config
└── .platform/
    └── hooks/
        ├── prebuild/
        ├── predeploy/
        └── postdeploy/

Platform hooks are useful when you need scripts to run at defined stages during instance provisioning or deployment.

For example, a post-deployment script belongs under:

.platform/hooks/postdeploy/

Do not use a deployment hook as an excuse to turn your application deployment into an undocumented operating system installation script. If the environment requires dozens of fragile imperative steps, reconsider whether those dependencies belong in the application image, platform configuration, or another service.

Choose the deployment policy based on failure tolerance

Once customers depend on the environment, deployment strategy matters almost as much as whether the code itself works.

Beanstalk Standard supports several application deployment approaches.

Policy How it works Main tradeoff
All at once Deploys to all existing instances together. Fast, but can create downtime.
Rolling Deploys to batches of existing instances. Maintains service, but temporarily reduces capacity.
Rolling with additional batch Launches extra capacity before rolling through existing instances. Maintains capacity but takes longer and temporarily uses more resources.
Immutable Launches a fresh fleet for the new version. Safer rollback behavior, but slower and temporarily more expensive.
Traffic splitting Creates new instances and sends a percentage of traffic to the new version first. Excellent for canary validation but requires suitable load-balanced architecture.

The default choice should not be "whatever sounds most advanced."

For a disposable development environment, all-at-once deployment can be perfectly reasonable.

For an important production environment, reducing deployment blast radius becomes more valuable.

An example rolling configuration using .ebextensions is:

option_settings:
  aws:elasticbeanstalk:command:
    DeploymentPolicy: Rolling
    BatchSizeType: Percentage
    BatchSize: 25

If the environment has four instances, a 25-percent rolling batch means one instance is updated at a time. During that batch, the remaining three instances must carry the live traffic.

With rolling-with-additional-batch behavior, extra capacity is started before existing capacity is removed.

Worked example: a 15-percent canary for 10 minutes

Imagine Jake's production store runs four application instances and version 2.0 contains a redesigned checkout flow.

He does not want every customer to see version 2.0 immediately.

He configures a traffic-splitting deployment:

option_settings:
  aws:elasticbeanstalk:command:
    DeploymentPolicy: TrafficSplitting

  aws:elasticbeanstalk:trafficsplitting:
    NewVersionPercent: "15"
    EvaluationTime: "10"

The sequence is:

  1. Beanstalk launches a fresh group of instances with version 2.0.
  2. The existing version continues serving most traffic.
  3. Fifteen percent of incoming traffic is directed to version 2.0.
  4. Beanstalk evaluates the new fleet for 10 minutes.
  5. If the deployment remains healthy, the remaining traffic can move to the new version.
  6. If the new instances fail health checks or the deployment is aborted, traffic can return to the original fleet and the new fleet can be removed.

This is a real reason to use traffic splitting: not because "canary" sounds sophisticated, but because you are intentionally limiting how many customer requests encounter a risky version before committing fully.

Traffic splitting requires an Application Load Balancer in Beanstalk Standard.

Blue/green deployment: use a second environment for bigger changes

Some changes deserve a completely separate environment.

Suppose the production environment runs:

shop-prod-blue
Version: 1.9

Create another environment:

shop-prod-green
Version: 2.0

The green environment can have its own instances and configuration. You can deploy version 2.0, allow it to become healthy, run application checks, and then switch the environment URL relationship when you are ready.

This is especially valuable when a deployment includes application changes and major infrastructure changes that are tightly related.

The rollback story is also easy to understand: the old environment still exists.

The cost tradeoff is equally easy to understand: for a period of time, you are paying for two environments.

Service role vs EC2 instance profile: do not mix them up

Elastic Beanstalk permissions become much easier when you ask one question: who is performing the action?

There are two different actors to think about.

Elastic Beanstalk itself may need a service role so it can perform environment-management operations on your behalf.

The EC2 instance running your application uses an instance profile when code or Beanstalk components on that instance need AWS permissions.

For example, imagine the application loads product images from a private S3 bucket.

The application code runs on the instance, so the relevant permissions belong with the role associated with the instance profile.

Do not solve that problem by embedding long-lived access keys in:

AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=...

Use an IAM role and temporary credentials instead.

The same principle applies to Secrets Manager, SQS, DynamoDB, SNS, and other AWS APIs used by application code.

Grant the instance role only the actions and resources the application requires.

Environment variables, secrets, and configuration

Configuration should not require editing source code every time you move between development and production.

A Node.js application might read:

const apiUrl = process.env.API_URL;
const environment = process.env.APP_ENV;

Development:

APP_ENV=development
API_URL=https://dev-api.example.com

Production:

APP_ENV=production
API_URL=https://api.example.com

The same source code can therefore run in both environments.

Sensitive material deserves additional care. A password, private API key, signing key, or database credential is not merely another convenient text setting.

A stronger design stores secrets in a dedicated service such as Secrets Manager or Systems Manager Parameter Store and authorizes the application role to retrieve only what it requires.

Custom domain and HTTPS without changing the application

The environment URL Beanstalk gives you is useful for testing, but production users normally expect a real domain such as:

https://shop.example.com

For a load-balanced web environment, a common architecture is:

Route 53 / DNS
      ↓
Application Load Balancer
      ↓
HTTPS certificate
      ↓
Elastic Beanstalk instances

The TLS certificate can be managed with AWS Certificate Manager and associated with the HTTPS listener on the load balancer.

DNS then directs the application hostname toward the environment's load-balancing endpoint.

Keep HTTP-to-HTTPS redirection, certificate configuration, and application-level URL behavior separate in your mind. A certificate does not automatically fix an application that generates incorrect redirect URLs, and application middleware cannot repair a certificate that was never attached to the load balancer.

Make health checks test something useful

A health endpoint should answer a simple question quickly: can this application instance serve requests?

A basic endpoint might be:

app.get("/health", (req, res) => {
  res.status(200).json({ status: "ok" });
});

A bad health endpoint performs a five-second report generation, sends email, calls six third-party APIs, and queries every database table.

Health checks happen repeatedly. They should be predictable and inexpensive.

If the health path returns redirects, authentication failures, application errors, or timeouts, the load balancer can treat an otherwise running instance as unhealthy.

When an environment turns red after deployment, check the health endpoint before assuming that the EC2 instance itself has failed.

502 Bad Gateway: follow this order instead of guessing

A 502 commonly means a proxy or load-balancing component accepted the request but could not obtain a valid response from the application process.

Start with application execution, not the VPC.

  1. Read the latest Beanstalk environment events.
  2. Confirm that the deployment completed.
  3. Confirm that dependency installation succeeded.
  4. Read the application stdout and stderr logs.
  5. Confirm the application process is still running.
  6. Confirm the startup command launches the correct file.
  7. Confirm the application listens on the expected port.
  8. Confirm it is not bound only to an inaccessible interface.
  9. Check nginx or other proxy error logs.
  10. Check target health if a load balancer is present.
  11. Check the configured health path.
  12. Only then move deeper into security groups, routing, or external dependencies if the evidence points there.

The highest-value question is:

Is my application process alive and listening where the proxy expects it?

If the answer is no, changing a security group will not help.

Procfile mistakes can look like infrastructure failures

A Procfile can define how the application starts.

Node.js:

web: npm start

Python with Gunicorn:

web: gunicorn application:application

If the command references a file that does not exist, a virtual environment that was never created, or a package that was not installed, the environment may provision successfully while the application itself remains unavailable.

The web process must also stay running. A startup script that launches a server in the background and then exits can produce confusing behavior because the platform may consider the command complete while the intended process lifecycle is wrong.

Know which logs answer which question

Logs become much more useful when you stop treating them as one giant file.

Question Where to look
Did Beanstalk fail during deployment? Environment events and Beanstalk engine deployment logs
Did my application crash? Application stdout and stderr
Why is nginx returning 502? nginx error log plus application log
Are users reaching the proxy? Web server or proxy access logs
Why is the target unhealthy? Environment health, target health, application logs, health endpoint

For a Linux web environment, files such as nginx access/error logs, application output, and eb-engine.log are particularly useful during deployment and 502 investigations.

If you need logs after instances terminate or rotate, configure log streaming or retention so the only copy does not disappear with the instance.

Single instance vs load-balanced Auto Scaling

A small development environment does not automatically need a load balancer.

A single-instance environment is simpler and can be appropriate for development, demonstrations, test environments, or low-risk internal applications where temporary unavailability is acceptable.

A load-balanced environment becomes more appropriate when the application needs horizontal scaling, multiple instances, load distribution, or better availability.

Requirement Single instance Load balanced
Simple dev environment Good fit Often unnecessary
Multiple app instances No Yes
Horizontal Auto Scaling Not the main model Yes
Traffic splitting deployment No Requires an Application Load Balancer
Production redundancy Limited Better foundation

Do not scale because the console has scaling controls. Scale because metrics show a need.

Also set a deliberate maximum. An Auto Scaling configuration without a cost-aware upper boundary can turn a traffic spike, application bug, or load-test mistake into a billing surprise.

Keep production data separate from disposable application instances

A Beanstalk instance should be replaceable.

It can disappear because of scaling, recovery, deployment, a platform update, an immutable operation, or an environment rebuild.

That means important business data should not live only on the local filesystem of one application instance.

For relational applications, a common architecture is:

Customers
    ↓
Load Balancer
    ↓
Beanstalk application instances
    ↓
Amazon RDS
    ↓
Backups / snapshots / database lifecycle

The application fleet can then be replaced without treating the database as part of the same disposable lifecycle.

For user uploads, object storage such as S3 is often a better fit than writing files to one EC2 instance.

Remember the scaling implication. If customer A uploads a file to instance one and the next request goes to instance two, instance two cannot magically see a file stored only on instance one's local disk.

Worker environments: move slow jobs away from web requests

A web request should normally finish quickly.

Suppose a user uploads a video and your application needs three minutes to convert it.

The weak design is:

User request
   ↓
Web instance
   ↓
Process video for 3 minutes
   ↓
Finally return response

The web server spends those three minutes tied up with background work.

A worker architecture separates the jobs:

Web environment
     ↓
Amazon SQS
     ↓
Worker environment
     ↓
Process job

Beanstalk worker environments use an SQS-backed model. A daemon on worker instances reads messages and sends them to the worker application over local HTTP.

When processing succeeds, the message can be acknowledged and removed. Failed work can be retried and eventually isolated in a dead-letter queue.

This design is useful for work such as image processing, video conversion, sending large batches of email, archive generation, report generation, and other tasks that should not make the customer wait on an HTTP connection.

Managed platform updates are part of operating the environment

A Beanstalk platform includes more than your language runtime.

Operating-system packages, runtime versions, proxy software, Beanstalk components, and related dependencies evolve.

Do not create an environment and assume that platform maintenance is finished forever.

Managed platform updates can help keep environments on newer supported platform versions. These updates use an immutable process so the new platform can be introduced on new instances rather than modifying the existing fleet in place and simply hoping for the best.

You should still test significant runtime or platform changes in a non-production environment first.

A Node.js major-version change, Python version change, Java runtime change, native dependency change, or proxy behavior change can expose application assumptions that were invisible on the old platform.

Is your environment on a retired platform? The 2026 dates

Elastic Beanstalk retires a platform branch when one of its parts, the operating system, the language runtime, or the web or application server, reaches end of life. 2026 has been a heavy year for that, because Amazon Linux 2 reached end of life on June 30, 2026, and every AL2-based branch went with it.

Platform branch Status
Docker AL2, ECS AL2, Go 1 AL2, .NET Core AL2, Corretto 8, 11 and 17 AL2, Corretto 8 and 11 with Tomcat 9 AL2 Retired August 6, 2026
Node.js 20, Python 3.9 and Ruby 3.2 on AL2023 Retired August 13, 2026
PHP 8.1 on AL2 and on AL2023 Retired April 16, 2026
IIS 10.0 on Windows Server 2016 (and Core) Scheduled for September 30, 2026
PHP 8.2, .NET 8 and .NET 9 on AL2023 Scheduled for March 31, 2027
Node.js 22 and Ruby 3.3 on AL2023 Scheduled for July 31, 2027

Retired does not mean deleted. When a branch retires, Elastic Beanstalk stops shipping maintenance and security updates for it, stops technical support for it, and removes it from the console for new environments. Existing environments get a 90-day grace period from the retirement date, and even after that, AWS does not remove your environment or delete its resources. What goes away is the safety net: no security patches, no hotfixes, and a growing chance that some Elastic Beanstalk operation stops working for that environment over time.

Do the date math for the August batch. The AL2 branches retired on August 6, 2026, so their 90-day grace period runs to about November 4, 2026. Node.js 20, Python 3.9, and Ruby 3.2 on AL2023 retired on August 13, so theirs runs to about November 11, 2026. If one of those names still appears as your environment's platform, plan the move before those dates rather than after them.

Newer branches are on the way as well. AWS's platform schedule lists Node.js 26 and Python 3.15 on Amazon Linux 2023 for November 2026 and .NET 11 for December 2026, as tentative dates. A new branch is the calm moment to try an upgrade in a staging environment, which is far better than the week after a retirement notice.

To see what you are running, open the environment in the console and read the Platform panel, or run eb status and read the Platform line.

Jake: "Mine still says Node.js 20. Is the shop going to go dark in November?"

Ethan: "No. Nothing gets switched off. But after the grace period nobody is patching it. Build a second environment on a supported Node.js branch, test checkout there, then swap the URLs. That is an afternoon of work, not an emergency."

Beanstalk Standard vs Beanstalk Cluster

Elastic Beanstalk now has two models worth recognizing.

Beanstalk Standard is the traditional application-platform model. Choose a supported platform such as Node.js, Python, Java, PHP, Ruby, Go, .NET, or Docker and run the application in a Beanstalk environment.

Beanstalk Cluster runs containerized workloads using Amazon EKS underneath.

Question Standard Cluster
Traditional Beanstalk runtime platform? Yes Container/EKS model
Good first model for an Express app? Usually yes Usually more architecture than necessary
Kubernetes underneath? No requirement Uses EKS
Best for Conventional managed web application deployments Containerized workloads where the cluster model fits

If you are reading this because you want to deploy your first Express, Django, Flask, Spring Boot, PHP, Rails, Go, or .NET application, understand Standard first.

Cluster mode: what changed on September 17, 2026, and what it really costs

Cluster mode arrived on September 17, 2026. Instead of giving every application its own EC2 fleet, Elastic Beanstalk runs your application as containers on an Amazon EKS cluster that it creates and operates inside your account. You hand it source code, a Dockerfile, or a container image in Amazon ECR, and it handles the build and the rollout through the same console, CLI, and API you already know.

Here is the part the launch headline does not shout about. Cluster mode has no charge of its own, but it brings two charges that Standard never had: the Amazon EKS cluster fee, which is $0.10 per cluster per hour (about $73 for a 730-hour month), and an EKS Auto Mode management fee on top of the EC2 instances it launches. Discounts such as Savings Plans lower the instance price, not that Auto Mode fee. Cluster environments are also normally fronted by an Application Load Balancer, which has its own hourly charge.

Now compare that with the other end of the scale. AWS's own minimal Standard example, one t3.micro instance with an 8 GB gp3 volume and a public IPv4 address, comes to about $12 a month, and for a new account it sits inside the Free Tier credits. Cluster mode is not Free Tier eligible at all.

Question Beanstalk Standard Beanstalk Cluster
Where the app runs Dedicated EC2 instances: one instance, or an Auto Scaling group Containers on a shared EKS cluster; EKS Auto Mode supplies the nodes
What you deploy A source bundle on a managed platform (or Docker) A container image in ECR, or source or a Dockerfile that Beanstalk builds into one
Deployment policies All at once, rolling, rolling with additional batch, immutable, traffic splitting Rolling update (the default) or all at once, called Recreate
Scaling Instances, within Auto Scaling limits Application replicas, within min-replica and max-replica
Health Per instance, from the host manager and load balancer Environment level only; per-instance health is not reported
Free Tier for new accounts Yes No
Extra fees None beyond the resources EKS cluster fee plus the EKS Auto Mode fee

Three details catch people in their first week with Cluster mode.

1. Your first environment waits for a cluster. Elastic Beanstalk groups Cluster environments by the set of VPC subnets they use. The first environment on a new subnet set makes it build a cluster, and the events say so plainly: "Creating CloudFormation stack for cluster infrastructure. This is a one-time operation and generally takes about 10 minutes." Later environments on the same subnets join that cluster and share its single cluster fee, which is where the savings come from.

2. Subnets and cluster roles are set at creation. You cannot change the subnets, or the cluster, node, and observability roles, of an existing Cluster environment. The update is rejected with Changes to EKS cluster configuration (subnets and IAM roles) are not currently supported for an existing environment. Please revert these option settings to continue. The way out is the same blue/green move described above: create a new environment with the settings you want, then swap the CNAMEs.

3. The Kubernetes version stays with the cluster. Elastic Beanstalk picks the newest Kubernetes version it supports when it creates a cluster, and that version remains fixed for the life of the cluster. Amazon EKS charges $0.10 per cluster per hour while a version is in its 14 months of standard support and $0.60 per cluster per hour once it moves into extended support. A calendar note about a year after you create the cluster costs nothing and avoids a surprise.

Two smaller differences matter if you come from Standard. Each replica's local storage disappears when that copy restarts, so uploads and working files belong in S3 or a database. And there are no instances of yours to inspect, so health is judged at the environment level, from the load balancer's request, error, and latency figures when one is attached.

Jake: "So which one do I pick for the shop?"

Ethan: "Standard, today. One app, one small instance, and the Free Tier while the account is new. The cluster fee alone is about six times AWS's minimal Standard example. Look at Cluster when you run several small services that would otherwise each pay for their own instances, because they can share one cluster fee and one pool of nodes."

Elastic Beanstalk vs EC2 vs ECS vs Lambda

These services operate at different abstraction levels.

Service Think in terms of Good fit when
EC2 Virtual servers You want strong host-level control.
Elastic Beanstalk Applications and environments You have a conventional app and want managed deployment infrastructure.
ECS Containers, tasks, and services Container orchestration is part of the architecture.
Lambda Functions and events The workload fits event-driven, short-lived execution.

The decision is not "Which service is newest?"

Ask what the application already looks like.

A traditional Spring Boot process that listens continuously for requests fits naturally into a long-running application environment.

An image-resize function triggered whenever a file is uploaded to S3 is a natural Lambda workload.

A platform composed of many independently deployed Docker services may fit ECS better.

A customized server that runs unusual software and needs precise host configuration may belong directly on EC2.

Elastic Beanstalk pricing: the service is not the bill

Elastic Beanstalk itself does not add a separate service fee. You pay for the AWS resources the environment uses.

That can include:

  • EC2 instances
  • EBS storage
  • Application Load Balancer usage
  • public IPv4 addresses where applicable
  • data transfer
  • CloudWatch usage
  • RDS databases
  • NAT gateways
  • S3 storage
  • other services connected to the application

So this statement:

Elastic Beanstalk has no additional service charge.

does not mean:

My environment costs $0.

A single-instance development environment can be materially simpler than a production environment containing multiple EC2 instances, an Application Load Balancer, a database, NAT gateways, and high log ingestion.

Architecture choices are billing choices.

If an environment exists only for development during working hours, consider whether it needs to run continuously.

If you create a temporary green environment for a blue/green deployment, remember that you temporarily have two fleets.

If traffic-splitting or immutable deployment launches a new fleet alongside the old one, expect temporary additional compute use during that deployment.

A realistic path from first deployment to production

Do not attempt to learn all of AWS before deploying. Learn the layers in the order the application requires them.

  1. Deploy the sample application. Establish that Beanstalk can create a healthy environment.
  2. Deploy your application. Solve startup, dependency, port, and packaging problems.
  3. Create a health endpoint. Give the environment a predictable readiness signal.
  4. Separate configuration from code. Use environment variables appropriately.
  5. Move secrets out of source control. Use dedicated secret storage and IAM roles.
  6. Learn the logs. Know where deployment, application, and proxy failures appear.
  7. Choose the environment type deliberately. Use a load balancer because you need it, not because production sounds impressive.
  8. Move persistent state out of application instances. Use suitable managed data services.
  9. Add HTTPS and a custom hostname. Configure the certificate, listener, and DNS correctly.
  10. Set scaling boundaries. Define useful minimum and maximum capacity.
  11. Choose a deployment policy. Match it to acceptable downtime and rollback requirements.
  12. Create a staging environment. Test platform and application changes away from production.
  13. Stream or retain important logs. Do not depend on the only copy existing on a disposable instance.
  14. Review IAM. Remove permissions the application does not need.
  15. Plan failure. Know how you will roll back a broken application version before you need to do it.

You do not need all fifteen on day one.

You do want all fifteen to become intentional decisions before a business-critical environment quietly depends on accidental defaults.

When Elastic Beanstalk is the wrong answer

Beanstalk is useful precisely because it is opinionated. That also means some workloads fit poorly.

Consider another approach when:

  • The application is entirely static HTML, CSS, and JavaScript.
  • The architecture is fundamentally event-driven and serverless.
  • You need fine-grained container orchestration across many services.
  • Kubernetes is an explicit organizational requirement.
  • You need unusual host-level software or operating-system customization.
  • The workload is a short-lived batch task rather than a long-running application environment.
  • You require infrastructure behavior that constantly fights the Beanstalk platform conventions.

The goal is not to force the application into Beanstalk because you already learned Beanstalk.

The goal is to choose the least complicated service that fits the workload.

Elastic Beanstalk FAQ

1. What is AWS Elastic Beanstalk?

AWS Elastic Beanstalk is an application deployment and environment-management service. You supply application code or a supported container workload, and Beanstalk manages much of the infrastructure provisioning, deployment workflow, scaling integration, platform configuration, and environment health around it.

2. Is Elastic Beanstalk free?

Elastic Beanstalk does not add a separate service charge. You still pay for the AWS resources used by the environment, such as EC2, EBS, load balancing, data transfer, public IPv4 addresses where applicable, CloudWatch, databases, NAT gateways, and other connected services.

3. Does Elastic Beanstalk use EC2?

Beanstalk Standard commonly uses EC2 instances as the compute layer for the application environment. Those instances and related resources remain in your AWS account even though Beanstalk manages them as part of the environment.

4. What is an Elastic Beanstalk environment?

An environment is the running collection of AWS resources serving a particular application version. One Beanstalk application can contain separate development, staging, and production environments.

5. What is an Elastic Beanstalk application?

An application is the logical project containing related environments, configuration, and deployable application versions. It is not the same thing as one EC2 instance.

6. Which languages can Elastic Beanstalk run?

Beanstalk Standard has managed platform families for common application stacks including Node.js, Python, Java, Tomcat, PHP, Ruby, Go, .NET, and Docker. Specific runtime versions change as platform branches are introduced, updated, and retired.

7. Is Elastic Beanstalk easier than using EC2 directly?

For a conventional web application, usually. Direct EC2 gives you more server-level control, while Beanstalk gives you an application-oriented deployment model and manages many of the repetitive environment tasks.

8. Elastic Beanstalk vs ECS: which one should I use?

Choose Beanstalk when you want a higher-level application environment and deployment workflow. Choose ECS when container orchestration itself matters and you want explicit control over container tasks, services, resource definitions, networking, and scheduling behavior.

9. Can Elastic Beanstalk run Docker?

Yes. Docker is a supported Beanstalk deployment model and is useful when packaging the application's runtime and dependencies into a container is cleaner than relying on a language-specific managed platform.

10. Why does Elastic Beanstalk return 502 Bad Gateway?

A common cause is that the proxy cannot obtain a valid response from the application process. Confirm that the app started successfully, uses the expected startup command, listens on the expected port, remains running, and passes the configured health check before changing networking settings.

11. What is a Procfile in Elastic Beanstalk?

A Procfile can define the command used to start the application's web process. For example, a Node.js application might use web: npm start, while a Python application might launch Gunicorn.

12. What is the safest Elastic Beanstalk deployment type?

There is no universal safest choice for every environment. Immutable and traffic-splitting deployments reduce several risks associated with modifying the existing fleet, while blue/green deployment provides strong isolation by creating a separate environment. The right choice depends on acceptable downtime, cost, rollback requirements, and architecture.

13. Can I use RDS with Elastic Beanstalk?

Yes. For production, keeping the database lifecycle separate from the disposable application environment is usually easier to operate because application instances and entire environments can then be replaced without treating the database as disposable.

14. What are Elastic Beanstalk worker environments?

Worker environments are designed for background jobs. They use an SQS-backed workflow so long-running work such as image processing, email, report generation, or archive creation can run separately from the web environment.

15. What is Beanstalk Cluster?

Beanstalk Cluster, added on September 17, 2026, runs your application as containers on an Amazon EKS cluster that Elastic Beanstalk creates and operates. It has no charge of its own, but you pay the EKS cluster fee and the EKS Auto Mode fee, and it is not Free Tier eligible. If you are learning Beanstalk simply to deploy a conventional Node.js, Python, Java, PHP, Go, Ruby, or .NET application, the Standard model is usually the easier place to begin.

16. Is Elastic Beanstalk still worth using?

Yes when its application-environment model matches the workload. It remains useful when you want to deploy a traditional web application on AWS without manually designing every infrastructure and deployment component before the first release.

The one mental model to remember

Elastic Beanstalk sits between your application and the AWS infrastructure required to operate that application.

Developer
   ↓
Source code
   ↓
Application version
   ↓
Elastic Beanstalk environment
   ↓
AWS infrastructure
   ↓
Customers

It does not remove EC2, IAM, load balancing, Auto Scaling, DNS, monitoring, databases, networking, or security from the architecture.

It removes the requirement that you personally assemble every one of those pieces before your first useful deployment.

Jake: "So I can deploy my app before I become an expert in EC2, ALB, Auto Scaling, IAM, CloudWatch, and deployment automation?"

Ethan: "Yes. That is exactly where Beanstalk earns its keep. Deploy something small, understand what Beanstalk created, and then learn each underlying service when your application gives you a reason to learn it."

If your application is a normal long-running web service and your biggest blocker is the feeling that you need to master half of AWS before you are allowed to deploy anything, Elastic Beanstalk is designed for that gap.

If you keep one line from this page:
Elastic Beanstalk lets you deploy a conventional application first, while still giving you access to the AWS infrastructure underneath when you are ready to understand and customize it.

Revision note. Written October 7, 2026. If your first environment turns red, it almost always has a plain explanation, and the logs will usually tell you which one.

Related