- 文档
- 教程
- DevOps
- 运维
【免费下载链接】devops-exercises
Linux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions
本指南基于 devops-exercises 仓库中 AWS 模块的create_ami练习,系统讲解如何在一台运行中的 EC2 实例上完成系统定制后,将其制作为自定义 AMI(Amazon Machine Image),并基于该 AMI 启动一台全新实例以验证定制内容是否完整保留。读者将掌握控制台与 CLI 两种创建 AMI 的完整路径,理解 AMI、EBS 快照与实例启动之间的底层关系,并能在真实环境中复现一套"定制 → 镜像化 → 克隆部署"的完整工作流。
练习目标与前置条件
该练习的原始定义见 练习文件,其要求与目标非常明确:
- 前置条件:至少有一台正在运行的 EC2 实例(running EC2 instance)。
- 目标 1:在实例的操作系统中做出一些修改,例如创建文件、修改文件、安装软件包等。
- 目标 2:从这台运行中的 EC2 实例创建一份 AMI 镜像。
- 目标 3:使用刚创建的自定义 AMI 启动一台新实例,并确认修改已被继承。
官方参考解法见 解法文件,其核心思路是"先定制、再镜像、后克隆"三步法。仓库的 AWS 模块 README 同时提醒:部分练习会产生真实费用、无法在免费套餐内完成,且官方解法基于 AWS 控制台,更推荐使用 IaC(如 Terraform、Pulumi)来完成——本指南将在控制台方案之外补充 CLI 与 IaC 思路。
AMI 是什么:理解镜像的底层构成
在动手之前,先明确 AMI 的概念。仓库的 AWS 模块 README 中专门设有 AMI 问答区,可以提炼出以下关键事实:
- 定义:AMI(Amazon Machine Image)提供了启动一台实例所需的全部信息——包括操作系统、启动卷(由 EBS 快照承载)、启动权限与块设备映射等。
- 来源分类:AMI 主要有三类——个人 AMI(自己创建)、AWS Marketplace AMI(他人发布,多为付费)、公共 AMI(AWS 官方提供,如练习中反复出现的 Amazon Linux 2)。
- 区域性:AMI 是针对特定区域构建的,但可以通过"复制(Copy)"跨区域迁移。
- 创建流程(高层视角):先启动实例 → 定制实例(安装软件包、修改 OS 配置)→ 停止实例(避免数据一致性问题)→ 创建 EBS 快照并构建 AMI → 用该 AMI 启动实例进行验证。
这一点与本练习的步骤完全吻合:练习的官方解法没有要求显式操作快照,但 AMI 在底层正是由 EBS 快照与元数据构成的——理解了这一点,就理解了为什么"修改操作系统内容"最终能被完整继承到新实例。
方案一:控制台操作(仓库官方解法)
按照 解法文件 的步骤,完整流程如下,每一步都补充了可操作的细节:
步骤 1:连接到你的 EC2 实例
选择 SSH、EC2 Instance Connect 控制台或 Session Manager 等任意方式登录实例。例如使用密钥对直连:
ssh -i your-key.pem ec2-user@<实例公网IP>步骤 2:在操作系统中做出修改
这是整个练习的"定制"环节,目的是让这台实例与通用公共镜像产生差异。可以做任意组合的修改,例如:
# 创建文件 touch /home/ec2-user/custom-marker.txt echo "custom-ami-demo" >> /home/ec2-user/custom-marker.txt # 安装软件包(Amazon Linux 2 示例) sudo yum update -y sudo yum install -y htop # 修改配置文件 sudo bash -c 'echo "server_name custom-ami-demo;" > /etc/nginx/conf.d/demo.conf'这些修改会被写入实例的 EBS 根卷,从而成为后续 AMI 的内容来源。
步骤 3:进入 EC2 服务控制台
在 AWS 控制台中切换到 EC2 服务,进入"Instances"(实例)列表,找到刚才完成定制的实例。
步骤 4:右键实例 → Image and templates → Create image
对目标实例点击右键,选择Image and templates子菜单下的Create image。控制台会弹出创建镜像对话框,这里需要关注的典型配置项包括:
- Image name:镜像名称,建议包含用途与版本信息,例如
my-custom-ami-v1; - Image description:镜像描述,可记录定制内容摘要;
- No reboot 选项(控制台对应 "No reboot" 复选框):默认情况下 AWS 会先重启实例以确保文件系统一致性,勾选该选项可避免重启、加快镜像创建,但要求文件系统本身处于一致状态;
- 块设备映射默认继承原实例的卷配置,通常无需改动。
步骤 5:填写名称并点击 Create image
填写好 Image name 后点击Create image。镜像创建不是即时的:AWS 会先为相关 EBS 卷创建快照,再基于快照构建 AMI。可以在左侧菜单AMIs页面查看进度,状态从pending变为available后即可使用。在Snapshots页面下可以看到伴随生成的 EBS 快照,这也印证了上一节"AMI 底层由 EBS 快照构成"的原理——相关快照操作可参考仓库中的 快照练习解法。
步骤 6:使用自定义 AMI 启动新实例
镜像状态变为available后,点击Launch instances from AMI(或进入 AMIs 列表选择镜像后启动)。在实例配置向导中,选择镜像(Choose an Amazon Machine Image)的步骤里选中My AMIs选项卡下的自定义镜像,其余步骤(实例类型、存储、安全组等)与普通启动一致。启动完成后,登录新实例验证定制内容:
ssh -i your-key.pem ec2-user@<新实例公网IP> cat /home/ec2-user/custom-marker.txt # 应输出 custom-ami-demo htop # 应已安装如果输出符合预期,说明定制内容已通过 AMI 完整克隆到新实例,练习目标全部达成。
方案二:AWS CLI 自动化创建
若希望脚本化、可重复执行,可使用 AWS CLI。核心命令是aws ec2 create-image:
aws ec2 create-image \ --instance-id i-0abcdef1234567890 \ --name "my-custom-ami-v1" \ --description "AMI created from customized web instance" \ --no-reboot--instance-id:要镜像化的源实例 ID;--name:AMI 名称,需在区域内唯一;--no-reboot:跳过重启(默认会重启以确保一致性,与控制的台选项对应);- 命令返回
ImageId(形如ami-xxxx),可用于后续启动。
验证镜像创建结果:
aws ec2 describe-images --image-ids ami-xxxx --region us-east-1使用该 AMI 启动新实例:
aws ec2 run-instances \ --image-id ami-xxxx \ --instance-type t2.micro \ --key-name your-key \ --security-group-ids sg-xxxx \ --subnet-id subnet-xxxx将 CLI 封装为脚本后,即可把"定制实例 → 生成镜像 → 批量克隆"固化为团队内的标准发布流程。
结合仓库其他练习:AMI 在实战链路中的位置
AMI 创建并非孤立操作,仓库中多个 AWS 练习共同构成一条完整的实践链路,本练习是其中承上启下的一环:
- 上游——如何获得一台可定制实例:启动 EC2 Web 实例练习 演示了如何用 Amazon Linux 2 启动实例,并通过 EC2 User Data 在首次启动时自动安装 httpd、写入首页内容。这正是本练习"运行中的实例"的常见来源;你也可以把 User Data 的引导脚本效果固化进 AMI,实现"一次引导、到处克隆"。
- 中游——本练习:把定制结果固化为 AMI。
- 下游——镜像的规模化使用:
- Auto Scaling Groups 基础练习 展示了在创建启动模板(Launch Template)时选择 AMI(如 Amazon Linux 2),随后 ASG 依据该模板批量扩容——若将自定义 AMI 填入启动模板,则扩出的每台实例都自动携带你的定制内容,这正是 AMI 在生产中的核心价值;
- Spot 实例练习 在发起 Spot 请求时同样需要指定 AMI,自定义 AMI 可以帮助 Spot 实例在数分钟内即可投入服务。
仓库的 AWS 模块 README 还建议优先采用 IaC(如 Terraform、Pulumi)复现这些练习,你可以在 new_vpc 练习 与 subnets 练习 中看到仓库提供的 Terraform/Pulumi 配套文件,作为把本练习升级为基础设施即代码的起点。
关键原理与注意事项
- 数据一致性:官方解法直接对运行中的实例创建镜像。AWS 的默认行为是临时重启实例以确保文件系统一致(对应
--no-reboot选项的反面)。对于写入中的数据库、日志等场景,建议先停止实例(或使用--no-reboot并确保应用处于一致状态),这也是 AWS 模块 README 中"停止实例以避免数据完整性问题的"的原因所在。 - 区域隔离:AMI 只存在于创建它的区域,跨区域使用必须执行"复制镜像"操作(
aws ec2 copy-image),复制后在新区域获得新的ImageId。 - 费用提示:镜像由 EBS 快照支撑,快照与存储会持续产生费用;仓库 README 也提示部分练习无法在免费套餐内完成。练习完成后,可删除不再使用的 AMI 与快照(删除 AMI 后其底层快照不会自动删除,需手动清理)以避免持续计费。
- 验证闭环:镜像的价值必须通过"用镜像启动新实例并验证"来确认——这正是本练习目标 3 的意义所在,切勿省略。
小结
本练习用最小的资源消耗,完整覆盖了 AWS 镜像化的核心链路:定制一台实例 → 基于其 EBS 卷生成 AMI → 用 AMI 启动克隆实例并验证。配合仓库中 启动实例练习、快照练习 与 Auto Scaling 练习 串读,你可以进一步理解 AMI 在弹性伸缩、批量部署与跨区域容灾中的生产价值,并把同样的镜像化能力迁移到 Terraform、Pulumi 等 IaC 工作流中。
- 文档
- 教程
- DevOps
- 运维
【免费下载链接】devops-exercises
Linux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions
相关推荐
RTranslator Android 离线翻译快速上手
RTranslator Android 离线翻译快速上手 手机在机场信号不好,柜台的人开始说泰语,你怎么办?RTranslator 是一款开源的 Android
文档教程DevOps运维GroundingDINO SwinT vs SwinB:开放集目标检测模型配置选型完全指南
GroundingDINO SwinT vs SwinB:开放集目标检测模型配置选型完全指南 GroundingDINO 是 ECCV 2024 的开放集目标检
文档教程DevOps运维Hyperresearch 16步研究流水线完全解析:从分解到可读性审计
Hyperresearch 16步研究流水线完全解析:从分解到可读性审计 Hyperresearch 是一款将 Claude Code 变成深度研究智能体(de
文档教程DevOps运维
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考