I tried 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 deployments without waiting for stabilization checks (Eventual consistency checks). Here is a summary of the differences from normal mode.
| Normal Mode | Express Mode | |
|---|---|---|
| Deployment completion timing | After resource stabilization check completes | After resource configuration application is confirmed |
| Stabilization check (Eventual consistency check) | Waits until complete | Deployment completes without waiting (continues in background) |
| Rollback | Enabled by default | Disabled by default |
| Temporary errors in dependent resources | — | CloudFormation automatically retries |
| Template changes | — | Not required |
| Additional charges | — | None |
The official blog introduces this as "up to 4x faster."
Previously, I verified the same configuration using cdkd (a tool that deploys directly via SDK without going through CloudFormation). I confirmed that deploying an IAM Role + InstanceProfile + EC2 configuration was approximately 6.7x faster.
This article uses the same configuration to verify how much faster CloudFormation's Express mode alone can be. Rather than a direct comparison with cdkd, the focus is on the difference from CloudFormation's normal mode.
Verification
Verification Configuration
This is the same 5-resource configuration as 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 create-stack execution to aws cloudformation wait stack-create-complete completion)
Deployment in Express Mode
Simply 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 (measurement method is the same as normal mode)
Deployment Time Comparison
| Method | Time Required | Multiplier |
|---|---|---|
| CloudFormation Normal Mode | 182 seconds | 1.0x |
| CloudFormation Express Mode | 61 seconds | 3.0x |
Stack Event Comparison
Let's compare stack events to see where the difference in time occurred.
Normal mode: 2 minutes 11 seconds waiting for InstanceProfile completion
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 completes in 1 second
In Express mode, InstanceProfile creation completes instantly.
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, indicating 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 upon completion of the entire stack.
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 InstanceProfile completion alone accounted for 2 minutes 11 seconds = 131 seconds (72% of the total).
In Express mode, this wait does not block the deployment, so the entire process completed in 61 seconds.
Notes
Here are things to know when using Express mode.
- The
--deployment-configoption was added in AWS CLI 2.35.13 (released June 30, 2026). This option cannot be used with earlier versions - Rollback is disabled by default. On one hand, failures can be immediately fixed and retried, but on the other hand, resources in an incomplete state may remain. For production environments, consider specifying an option to enable rollback
- Resources continue to stabilize in the background. Resources may not be fully available immediately after deployment completes. Normal mode is more appropriate for cases where you need to wait for stabilization before routing traffic
- 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). As it was unreleased at the time of writing, this verification was conducted using only the CloudFormation API (AWS CLI)
Summary
I verified CloudFormation Express mode using an IAM Role + InstanceProfile + EC2 configuration.
The deployment time was reduced from 182 seconds to 61 seconds, approximately 3.0x faster.
The main factor in the reduction was the 131 seconds that normal mode spent waiting for InstanceProfile completion. In Express mode, deployment completes without waiting for stabilization to finish, so this wait time no longer blocks the overall completion time.
No template changes were needed for this template, and it could be used simply by adding --deployment-config '{"Mode": "EXPRESS"}'. While it's important to be aware that stabilization continues in the background, this appears to be an effective time-saving measure for scenarios involving repeated deployments in development environments.
With Pre-deployment Validation announced on the same day, errors can now be detected before provisioning in CreateStack / UpdateStack as well. Especially in Express mode where rollback is disabled by default, the peace of mind from being able to catch errors before deployment becomes even greater. Details are verified in the following article.
