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 confirmation (Eventual consistency check). Here is a summary of the differences from normal mode.
| Normal Mode | Express Mode | |
|---|---|---|
| Deployment completion timing | After resource stabilization confirmation is complete | After resource configuration application is confirmed |
| Stabilization confirmation (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 cost | — | None |
The official blog introduces it 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.
In this article, I use the same configuration to verify how much CloudFormation's Express mode alone speeds things up. 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 Resource creation Initiated to CREATE_COMPLETE for the InstanceProfile.
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, the 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 is recorded, indicating that the deployment was 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 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 with earlier versions - Rollback is disabled by default. While failures can be fixed and retried immediately, there is also a possibility that resources may be left in an incomplete state. In 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 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 expected to be enabled with
cdk deploy --express(corresponding PR). As it was not yet released 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.
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.
For this template, no changes were required — it was available simply by adding --deployment-config '{"Mode": "EXPRESS"}'. While being mindful that stabilization continues in the background, this appears to be an effective time-saving measure in scenarios involving repeated deployments in development environments.
With Pre-deployment Validation announced on the same day, errors are now 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.
