I Tried "Early Success Criteria," a New Feature for ECS Rolling Deployments
This page has been translated by machine translation. View original
Introduction
On September 4, 2026, Early Success Criteria was added to Amazon ECS rolling deployments.
To try the new feature, I set up a Fargate service for testing, changed the conditions used to determine early success, and checked how long deployments took.
Verification
Test environment
This is the configuration of the service used for measurement.
| Item | Value |
|---|---|
| Region | ap-northeast-1 |
| Cluster launch type | AWS Fargate |
| Container image | public.ecr.aws/nginx/nginx:latest |
| CPU / Memory | 256 (.25 vCPU) / 512 MiB |
| desired count | 5 |
| ELB / Health check | None |
What is Early Success Criteria?
When Early Success Criteria is enabled, the deployment completes once the proportion of new tasks specified by healthyPercent become healthy. You specify the timing for cleaning up the tasks of the old revision with sourceServiceRevisionCleanup. With BLOCKING, the deployment completes after waiting for draining to finish, and with DEFERRED, the wait for draining can be detached from the deployment flow.
When setting healthyPercent to 20%, the deployment configuration is as follows.
{
"maximumPercent": 200,
"minimumHealthyPercent": 10,
"strategy": "ROLLING",
"earlySuccessCriteria": {
"enable": true,
"healthyPercent": 20,
"sourceServiceRevisionCleanup": "BLOCKING"
}
}
I applied this configuration with update-service.
aws ecs update-service \
--cluster <クラスター名> \
--service <サービス名> \
--deployment-configuration '{
"maximumPercent": 200,
"minimumHealthyPercent": 10,
"strategy": "ROLLING",
"earlySuccessCriteria": {
"enable": true,
"healthyPercent": 20,
"sourceServiceRevisionCleanup": "BLOCKING"
}
}' \
--region ap-northeast-1
Measuring deployment time
I lowered healthyPercent step by step starting from 100%.
| Pattern | healthyPercent | minimumHealthyPercent | Duration | Compared to baseline |
|---|---|---|---|---|
| Baseline | 100% (default) | 50% | 170.0 sec (2 min 50 sec) | — |
| Early 60% | 60% | 50% | 123.6 sec (2 min 3 sec) | -27% |
| Early 40% | 40% | 30% | 124.7 sec (2 min 4 sec) | -27% |
| Early 20% | 20% | 10% | 88.9 sec (1 min 28 sec) | -48% |
Because the configuration has no load balancer, the deregistration drain wait is not included in the duration. Each pattern was measured once.
The shortest was Early 20%. The reason minimumHealthyPercent is lowered in the 40% and 20% patterns is to comply with the constraint described above.
The difference in duration between 60% and 40% was about 1 second. With BLOCKING, the wait for draining the old tasks is long, so the difference in healthyPercent did not show up.
I checked the events recorded in the Action Logs for the baseline, Early 60%, and Early 20%.
First, the baseline.
| Elapsed time | eventName | statusReason |
|---|---|---|
| 0 sec | SERVICE_DEPLOYMENT_IN_PROGRESS | Service deployment in progress. |
| +25 sec | SERVICE_REVISION_STABLE | Service revision marked stable. |
| +170 sec | SERVICE_DEPLOYMENT_SUCCESSFUL | Service deployment completed successfully. |
Early 60% and Early 40% had almost identical durations. The statusReason changed to "met early success criteria."
| Elapsed time | eventName | statusReason |
|---|---|---|
| 0 sec | SERVICE_DEPLOYMENT_IN_PROGRESS | Service deployment in progress. |
| +30 sec | SERVICE_REVISION_STABLE | Service revision marked stable. |
| +124 sec | SERVICE_DEPLOYMENT_SUCCESSFUL | Service deployment met early success criteria. |
With Early 20%, the time until the service revision became STABLE was somewhat longer at 37 seconds, and SUCCESSFUL was recorded at 89 seconds.
| Elapsed time | eventName | statusReason |
|---|---|---|
| 0 sec | SERVICE_DEPLOYMENT_IN_PROGRESS | Service deployment in progress. |
| +37 sec | SERVICE_REVISION_STABLE | Service revision marked stable. |
| +89 sec | SERVICE_DEPLOYMENT_SUCCESSFUL | Service deployment met early success criteria. |
The event name at deployment completion remains SERVICE_DEPLOYMENT_SUCCESSFUL; what changes is the wording of statusReason. For normal completion it is "Service deployment completed successfully.", and for completion by meeting the early success criteria it is "Service deployment met early success criteria." From the Action Logs you can tell which path the deployment completed through.
Combining with DEFERRED
With the Early 20% setting, I changed sourceServiceRevisionCleanup from BLOCKING to DEFERRED and measured.
| Pattern | minimumHealthyPercent | sourceServiceRevisionCleanup | Duration |
|---|---|---|---|
| Baseline | 50% | — | 170 sec |
| Early 20% BLOCKING | 10% | BLOCKING | 88.9 sec |
| Early 20% DEFERRED | 0% | DEFERRED | 80.3 sec |
In configurations where waiting for ELB deregistration occurs, DEFERRED can detach that wait from the deployment completion determination, so a reduction in wait time can be expected. Because the test environment this time has no ELB, no deregistration wait occurred, and the difference from BLOCKING was only about 8 seconds. Although not verified this time, in configurations where DeregistrationDelay is set long on an ALB, a larger difference may appear.
Summary
With Early Success Criteria enabled, the time to deployment completion was cut by nearly half.
In environments that run multiple tasks and can tolerate a temporary decrease in the task count, Early Success Criteria is an option for shortening the wait for deployment completion. It is especially effective when you want to move faster through the downstream steps of a CI/CD pipeline that waits for deployment completion.
However, if you lower healthyPercent and minimumHealthyPercent too far, the number of running tasks may become insufficient and affect the service.
In production environments, I recommend configuring these settings carefully, balancing shorter deployment wait times against availability.
