{"id":205,"date":"2026-10-12T19:41:30","date_gmt":"2026-10-12T19:41:30","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/03\/19\/powerful-new-amazon-ec2-boot-features\/"},"modified":"2026-10-12T19:41:30","modified_gmt":"2026-10-12T19:41:30","slug":"powerful-new-amazon-ec2-boot-features","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/powerful-new-amazon-ec2-boot-features\/","title":{"rendered":"EC2 Boot from EBS Explained: Architecture, Trade-offs, and an AWS CLI Workflow"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Booting EC2 instances from Amazon EBS changed how teams manage compute lifecycle, persistence, and maintenance. If you run cloud infrastructure, this guide will help you understand the model, compare it with older instance-store roots, and apply it through a practical AWS CLI workflow.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2010-03-19; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This revision is based on the original DevOpsSchool post: <a href=\"https:\/\/www.devopsschool.com\/blog\/powerful-new-amazon-ec2-boot-features\/\">Powerful New Amazon EC2 Boot Features \u2013 Introduction<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/03\/amazon-ec2-boot-features.png\" alt=\"Amazon EC2 boot from EBS concept\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What booting from EBS introduced<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original article announced a new EC2 capability: using an EBS volume as the root device at launch time (created from an EBS snapshot), instead of relying on a local instance-store root disk. That change made EC2 instances easier to stop and restart while preserving the root filesystem.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Root disk could be created from an EBS snapshot at boot.<\/li><li>Additional EBS volumes could be attached as part of launch configuration.<\/li><li>Instances could be stopped and later started with root volume state preserved.<\/li><li>Compute and storage lifecycle became more decoupled for maintenance operations.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The original post also embedded a secondary historical image from All Things Distributed: <a href=\"http:\/\/www.allthingsdistributed.com\/images\/serverfolders-small.jpg\">serverfolders-small.jpg<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instance-store root vs EBS-backed root<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Aspect<\/th><th>Instance-store root (traditional model)<\/th><th>EBS-backed root<\/th><\/tr><\/thead><tbody><tr><td>Root disk source at launch<\/td><td>Local instance storage prepared during boot<\/td><td>EBS volume created from snapshot<\/td><\/tr><tr><td>Stop and start behavior<\/td><td>Historically limited for many instance-store-root workflows<\/td><td>Designed to support stop\/start lifecycle<\/td><\/tr><tr><td>Root data persistence<\/td><td>Ephemeral characteristics tied to host lifecycle<\/td><td>Persists on EBS unless explicitly deleted<\/td><\/tr><tr><td>Changing instance type<\/td><td>Often required replacement workflows<\/td><td>Common stop, modify, and start workflow<\/td><\/tr><tr><td>Boot-time storage composition<\/td><td>Less flexible<\/td><td>Can include additional EBS data volumes at launch<\/td><\/tr><tr><td>Typical use case<\/td><td>Short-lived or stateless patterns<\/td><td>Durable roots and operational maintenance flexibility<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Boot and restart workflow with EBS-backed instances<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The high-level lifecycle below captures the model introduced in the original announcement and still useful for operational design.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Choose EBS backed AMI] --> B[Create root EBS volume from snapshot]\n    B --> C[Attach optional data EBS volumes]\n    C --> D[Boot instance]\n    D --> E[Run workload]\n    E --> F[Stop instance]\n    F --> G[EBS volumes persist]\n    G --> H[Start instance possibly with new instance type]\n    H --> D\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">AWS CLI example workflow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use the following as a practical template. Replace IDs and names with values from your own account and region.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1) Discover EBS-backed AMIs<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\">aws ec2 describe-images \\\n  --owners amazon <span class=\"hljs-keyword\">self<\/span> \\\n  --filters Name=root-device-type,Values=ebs Name=state,Values=available \\\n  --query <span class=\"hljs-string\">'Images&#91;].{ImageId:ImageId,Name:Name,CreationDate:CreationDate}'<\/span> \\\n  --output table<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">2) Launch an instance with an additional EBS data volume<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">aws ec2 run-instances \\\n  --image-id ami<span class=\"hljs-number\">-0<\/span>abc1234example \\\n  --instance-type t3.micro \\\n  --key-name my-key \\\n  --subnet-id subnet<span class=\"hljs-number\">-0123456789<\/span>abcdef0 \\\n  --security-group-ids sg<span class=\"hljs-number\">-0123456789<\/span>abcdef0 \\\n  --block-device-mappings <span class=\"hljs-string\">'DeviceName=\/dev\/xvdb,Ebs={VolumeSize=50,VolumeType=gp3,DeleteOnTermination=false}'<\/span> \\\n  --tag-specifications <span class=\"hljs-string\">'ResourceType=instance,Tags=&#91;{Key=Name,Value=ebs-boot-demo}]'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">3) Verify root device type<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">aws ec2 describe-instances \\\n  --instance-ids i<span class=\"hljs-number\">-0123456789<\/span>abcdef0 \\\n  --query <span class=\"hljs-string\">'Reservations&#91;].Instances&#91;].{RootDeviceType:RootDeviceType,RootDeviceName:RootDeviceName,State:State.Name}'<\/span> \\\n  --output table<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">4) Stop, change instance type, and start again<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">aws ec2 stop-instances --instance-ids i-0123456789abcdef0\naws ec2 wait instance-stopped --instance-ids i-0123456789abcdef0\naws ec2 modify-instance-attribute \\\n  --instance-id i-0123456789abcdef0 \\\n  --instance-type Value=t3.small\naws ec2 start-instances --instance-ids i-0123456789abcdef0<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Important:<\/strong> changing instance type is a normal stop\/start operation. Changing operating system typically requires launching from a different AMI or replacing the root volume strategy, not just a simple restart.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Operational impact for DevOps teams<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Maintenance flexibility:<\/strong> stop instances for planned changes and resume with persistent root state.<\/li><li><strong>Cost behavior:<\/strong> compute charges pause while stopped, but EBS storage charges continue.<\/li><li><strong>Safer change windows:<\/strong> snapshot-based backup workflows are easier to integrate.<\/li><li><strong>Clearer separation of concerns:<\/strong> compute scaling and disk persistence can be managed independently.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices and common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Set <strong>DeleteOnTermination<\/strong> intentionally for every attached volume.<\/li><li>Take snapshots before high-risk changes or major patch cycles.<\/li><li>Do not assume a stopped instance keeps the same public IP unless you use an Elastic IP.<\/li><li>Use encryption and IAM controls for EBS volumes and snapshots.<\/li><li>Treat historical size and performance claims as time-bound; verify current AWS limits and behavior in official docs.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Booting Amazon EC2 instances from Amazon EBS was a major shift from ephemeral root disks to persistent root volumes. This guide explains what changed, why it mattered, and how to use the model safely in modern operations.<\/p>\n","protected":false},"author":1,"featured_media":4206,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[5633],"tags":[3717,3400,3354,3707,3715,3713,3712,3714,3709,584,3711,3710,1868,3708,3706,284,3716],"class_list":["post-205","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aws","tag-advnatage-of-amazon-ec2-boot-feature","tag-amazon-ebs","tag-amazon-ec2","tag-amazon-ec2-boot-feature","tag-amazon-ec2-boot-feature-benefits","tag-amazon-ec2-boot-feature-introduction","tag-amazon-ec2-boot-feature-overview","tag-amazon-ec2-boot-functionality","tag-amazon-ec2-new-feature","tag-boot","tag-boot-configuration","tag-boot-feature-in-amazon-ec2","tag-ec2","tag-ec2-boot-features","tag-feature","tag-update","tag-what-is-ec2-boot-feature"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/205","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=205"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/205\/revisions"}],"predecessor-version":[{"id":79035,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/205\/revisions\/79035"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4206"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=205"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=205"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=205"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}