Trying Out CloudFormation's New Feature, Express Mode
This page has been translated by machine translation. View original
Introduction
On June 30, 2026, Express mode was added to CloudFormation.
Express mode is a new mode that completes the deployment without waiting for the stabilization check (Eventual consistency check). Let's sort out the differences from the normal mode.
| Normal mode | Express mode | |
|---|---|---|
| Deployment completion timing | After the resource stabilization check completes | After confirmation that the resource configuration has been applied |
| Stabilization check (Eventual consistency check) | Waits until completion | Deployment completes without waiting (continues in the background) |
| Rollback | Enabled by default | Disabled by default |
| Temporary errors in dependent resources | — | CloudFormation retries automatically |
| Template changes | — | Not required |
| Additional charges | — | None |
The official blog describes it as "up to 4x faster."
Previously, I verified the same configuration using cdkd (a tool that deploys directly via the SDK without going through CloudFormation). I confirmed that deploying an IAM Role + InstanceProfile + EC2 configuration was about 6.7x faster.
In this article, I use the same configuration to verify how much faster CloudFormation's Express mode alone is. Rather than a direct comparison with cdkd, I focus on the difference from CloudFormation's normal mode.
Verification
Verification configuration
This is the same 5-resource configuration as in the cdkd article.
IAM Role → IAM Policy
→ InstanceProfile → EC2 Instance ← SecurityGroup
Verification environment
- Region: ap-northeast-1 (Tokyo)
- VPC: Default VPC
- Instance type: t3.micro
- AMI: Amazon Linux 2023 (x86_64)
- AWS CLI: 2.35.13
CloudFormation template
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Benchmark: IAM Role + InstanceProfile + SecurityGroup + EC2 (Express mode comparison)'
Parameters:
VpcId:
Type: AWS::EC2::VPC::Id
SubnetId:
Type: AWS::EC2::Subnet::Id
AmiId:
Type: AWS::EC2::Image::Id
Resources:
BenchRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: ec2.amazonaws.com
Action: sts:AssumeRole
BenchPolicy:
Type: AWS::IAM::Policy
Properties:
PolicyName: bench-policy
Roles:
- !Ref BenchRole
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action: s3:GetObject
Resource: '*'
BenchInstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Roles:
- !Ref BenchRole
BenchSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Benchmark security group
VpcId: !Ref VpcId
BenchInstance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t3.micro
ImageId: !Ref AmiId
SubnetId: !Ref SubnetId
IamInstanceProfile: !Ref BenchInstanceProfile
SecurityGroupIds:
- !GetAtt BenchSecurityGroup.GroupId
Tags:
- Key: Name
Value: bench-express-test
Deployment in normal mode
aws cloudformation create-stack \
--stack-name bench-normal-mode \
--template-body file://template.yaml \
--parameters \
ParameterKey=VpcId,ParameterValue=vpc-xxxxx \
ParameterKey=SubnetId,ParameterValue=subnet-xxxxx \
ParameterKey=AmiId,ParameterValue=ami-xxxxx \
--capabilities CAPABILITY_IAM \
--region ap-northeast-1
Result: 182 seconds (wall clock time from running create-stack to the completion of aws cloudformation wait stack-create-complete)
Deployment in Express mode
Just add {"Mode": "EXPRESS"} to --deployment-config. No template changes are required.
aws cloudformation create-stack \
--stack-name bench-express-mode \
--template-body file://template.yaml \
--parameters \
ParameterKey=VpcId,ParameterValue=vpc-xxxxx \
ParameterKey=SubnetId,ParameterValue=subnet-xxxxx \
ParameterKey=AmiId,ParameterValue=ami-xxxxx \
--capabilities CAPABILITY_IAM \
--deployment-config '{"Mode": "EXPRESS"}' \
--region ap-northeast-1
Result: 61 seconds (measured the same way as in normal mode)
Comparison of deployment times
| Method | Time required | Speedup |
|---|---|---|
| CloudFormation normal mode | 182 seconds | 1.0x |
| CloudFormation Express mode | 61 seconds | 3.0x |
Comparison of stack events
Let's compare the stack events to see where the difference in time came from.
Normal mode: 2 minutes 11 seconds waiting for InstanceProfile to complete
It took 2 minutes 11 seconds from InstanceProfile's Resource creation Initiated to CREATE_COMPLETE.
00:46:18 | CREATE_IN_PROGRESS | AWS::IAM::InstanceProfile | Resource creation Initiated
00:48:29 | CREATE_COMPLETE | AWS::IAM::InstanceProfile
Express mode: InstanceProfile completed in 1 second
In Express mode, the creation of the InstanceProfile completed immediately.
00:53:01 | CREATE_IN_PROGRESS | AWS::IAM::InstanceProfile | Resource creation Initiated
00:53:02 | CREATE_COMPLETE | AWS::IAM::InstanceProfile | Resource operation completed using Express Mode. It may continue becoming available in the background.
The following message was recorded, showing that the deployment completed without waiting for stabilization to finish.
Resource operation completed using Express Mode. It may continue becoming available in the background.
A similar message was also recorded when the entire stack completed.
00:53:19 | CREATE_COMPLETE | bench-express-mode | Stack operation completed using Express Mode. Resources may continue becoming available in the background.
Full stack events for normal mode
00:45:54 | CREATE_IN_PROGRESS | bench-normal-mode | User Initiated
00:45:59 | CREATE_IN_PROGRESS | BenchRole |
00:45:59 | CREATE_IN_PROGRESS | BenchSecurityGroup |
00:46:00 | CREATE_IN_PROGRESS | BenchRole | Resource creation Initiated
00:46:01 | CREATE_IN_PROGRESS | BenchSecurityGroup | Resource creation Initiated
00:46:02 | CREATE_IN_PROGRESS | BenchSecurityGroup | Eventual consistency check initiated
00:46:07 | CREATE_COMPLETE | BenchSecurityGroup |
00:46:17 | CREATE_COMPLETE | BenchRole |
00:46:17 | CREATE_IN_PROGRESS | BenchInstanceProfile|
00:46:17 | CREATE_IN_PROGRESS | BenchPolicy |
00:46:18 | CREATE_IN_PROGRESS | BenchInstanceProfile| Resource creation Initiated
00:46:18 | CREATE_IN_PROGRESS | BenchPolicy | Resource creation Initiated
00:46:34 | CREATE_COMPLETE | BenchPolicy |
00:48:29 | CREATE_COMPLETE | BenchInstanceProfile|
00:48:30 | CREATE_IN_PROGRESS | BenchInstance |
00:48:32 | CREATE_IN_PROGRESS | BenchInstance | Resource creation Initiated
00:48:44 | CREATE_IN_PROGRESS | BenchInstance | Eventual consistency check initiated
00:48:44 | CREATE_COMPLETE | BenchInstance |
00:48:44 | CREATE_IN_PROGRESS | bench-normal-mode | Eventual consistency check initiated
00:48:45 | CREATE_COMPLETE | bench-normal-mode |
Full stack events for Express mode
00:52:47 | CREATE_IN_PROGRESS | bench-express-mode | User Initiated
00:52:52 | CREATE_IN_PROGRESS | BenchRole |
00:52:52 | CREATE_IN_PROGRESS | BenchSecurityGroup |
00:52:53 | CREATE_IN_PROGRESS | BenchRole | Resource creation Initiated
00:52:54 | CREATE_IN_PROGRESS | BenchSecurityGroup | Resource creation Initiated
00:52:54 | CREATE_IN_PROGRESS | BenchSecurityGroup | Eventual consistency check initiated
00:52:55 | CREATE_COMPLETE | BenchSecurityGroup | Resource operation completed using Express Mode.
00:53:00 | CREATE_IN_PROGRESS | BenchRole | Eventual consistency check initiated
00:53:02 | CREATE_COMPLETE | BenchRole | Resource operation completed using Express Mode.
00:53:00 | CREATE_IN_PROGRESS | BenchInstanceProfile|
00:53:00 | CREATE_IN_PROGRESS | BenchPolicy |
00:53:01 | CREATE_IN_PROGRESS | BenchInstanceProfile| Resource creation Initiated
00:53:01 | CREATE_IN_PROGRESS | BenchInstanceProfile| Eventual consistency check initiated
00:53:02 | CREATE_COMPLETE | BenchInstanceProfile| Resource operation completed using Express Mode. It may continue becoming available in the background.
00:53:02 | CREATE_IN_PROGRESS | BenchPolicy | Resource creation Initiated
00:53:02 | CREATE_IN_PROGRESS | BenchPolicy | Eventual consistency check initiated
00:53:02 | CREATE_COMPLETE | BenchPolicy | Resource operation completed using Express Mode.
00:53:02 | CREATE_IN_PROGRESS | BenchInstance |
00:53:12 | CREATE_IN_PROGRESS | BenchInstance | Resource creation Initiated
00:53:17 | CREATE_IN_PROGRESS | BenchInstance | Eventual consistency check initiated
00:53:18 | CREATE_COMPLETE | BenchInstance | Resource operation completed using Express Mode.
00:53:17 | CREATE_IN_PROGRESS | bench-express-mode | Eventual consistency check initiated
00:53:19 | CREATE_COMPLETE | bench-express-mode | Stack operation completed using Express Mode. Resources may continue becoming available in the background.
Of the 182 seconds in normal mode, waiting for the InstanceProfile to complete alone took 2 minutes 11 seconds = 131 seconds (72% of the total).
In Express mode, this wait does not block the deployment, so the whole thing completed in 61 seconds.
Notes
These are points to be aware of when using Express mode.
- The
--deployment-configoption was added in AWS CLI 2.35.13 (released June 30, 2026). This option cannot be used in earlier versions - Rollback is disabled by default. While you can fix and retry immediately upon failure, resources in a half-finished state may be left behind. For production environments, consider specifying the option to enable rollback
- Resources continue stabilizing in the background. Resources are not necessarily fully available immediately after the deployment completes. In cases where you need to wait for stabilization before sending traffic, normal mode is more suitable
- CloudFormation is said to retry temporary errors in dependent resources. Some timing-related errors, such as waiting for IAM propagation, may resolve without additional intervention
- In CDK, it is planned to be enabled with
cdk deploy --express(corresponding PR). Since it was not yet released at the time of writing, this verification was done only with the CloudFormation API (AWS CLI)
Summary
I verified CloudFormation Express mode with the IAM Role + InstanceProfile + EC2 configuration used here.
The deployment time was reduced from 182 seconds to 61 seconds, about 3.0x faster.
The main reason for the reduction was the 131 seconds spent in normal mode waiting for the InstanceProfile to complete. In Express mode, the deployment completes without waiting for stabilization to finish, so this wait no longer blocks the overall completion time.
No changes were needed to this template; simply adding --deployment-config '{"Mode": "EXPRESS"}' was enough. While keeping in mind that stabilization continues in the background, it looks like an effective way to save time when deploying repeatedly, such as in development environments.
With Pre-deployment Validation, announced on the same day, errors are now detected before provisioning in CreateStack / UpdateStack as well. In Express mode, where rollback is disabled by default, the reassurance of being able to catch errors before deployment is especially significant. I cover the details in the following article.
