- 文档
- 教程
- 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 仓库中的 Launch EC2 Web Instance 练习 展开,完整演示如何在 AWS 上按要求启动一台运行 Apache(httpd)的 EC2 实例,覆盖控制台图形化操作、User Data 开机脚本、根卷 Delete on Termination 配置、标签与安全组规则,并给出等价的 Terraform 基础设施即代码(IaC)实现。读完本文,你将掌握一套可复制的"一条命令式" Web 实例交付方案,并能理解 User Data 的执行时机、存储生命周期与安全组放行的底层逻辑。
一、练习目标拆解:从需求到验收标准
该练习对目标实例提出了 6 项硬性要求(见 exercise.md),它们分别对应 EC2 的镜像、机型、存储、引导脚本、元数据标签与网络访问控制:
| 编号 | 需求 | 对应的 EC2 配置项 |
|---|---|---|
| 1 | Amazon Linux 2 镜像 | AMI 选择 |
| 2 | 1 vCPU + 1 GiB 内存机型 | 实例类型(t2.micro) |
| 3 | 实例终止时删除存储 | 根卷 "Delete on Termination" |
| 4 | 开机自动安装并启动 httpd、写入指定网页内容 | User Data(用户数据)引导脚本 |
| 5 | 标签 Type=web、名称 web-1 | Tags 键值对 |
| 6 | 允许来自任意地址的 80 端口 HTTP 流量 | 安全组入站规则 |
这套需求模拟了真实生产中的常见场景:把一台"裸"云主机变成一台开箱即用的 Web 服务器。其中第 4 项是核心难点——它要求实例在首次启动时自动完成软件安装与服务配置,这正是 EC2 User Data 机制的典型应用。
仓库的 AWS 主题页(topics/aws/README.md)将本练习列入 EC2 系列的首个实战条目,与之配套的还有 Security Groups、EBS Volume Creation、Create AMI 等练习,建议按顺序完成以建立完整的 EC2 知识链。
二、控制台实操:十一步启动 web-1 实例
1. 准备工作:选择区域与进入 EC2 服务
- 登录 AWS 控制台,选择一个离你较近的区域(如 us-east-1、ap-northeast-1)。不同区域的 AMI ID、价格与可用区不同,后续 Terraform 与安全组配置都基于同一区域进行。
- 进入EC2 服务页面。
- 左侧菜单点击Instances(实例),再点击Launch instances(启动实例)。
2. 镜像与机型选择
- 镜像(Image):选择Amazon Linux 2。它是练习中指定的系统镜像,内置 yum 包管理器,与后续 User Data 脚本中的
yum命令天然配套。 - 机型(Instance type):选择t2.micro。该机型提供 1 vCPU 与 1 GiB 内存,正好满足"1 vCPU + 1 GiB"的要求,且通常处于免费套餐额度内。其他满足同等规格的机型(如 t3.micro)同样可行,但需注意是否超出免费额度。
提示:同一机型在不同区域的可用性可能不同,若目标机型不可选,可在控制台的机型筛选器中按 vCPU 与内存规格过滤。
3. 存储:确保 "Delete on Termination" 已勾选
在Storage(存储)部分,确认根卷(root block device)的Delete on Termination选项处于勾选状态。该选项决定实例终止(Terminate)时根 EBS 卷是否被一并删除:
- 勾选:实例终止后根卷被自动销毁,不会残留产生费用的孤立卷,适合本练习这类临时/一次性实例;
- 不勾选:根卷会保留,数据可用于事后恢复,但会持续计费。
仓库中 EBS Volume Creation 练习 从反面验证了这一点:手动创建的附加卷在实例终止后仍会保留,而默认根卷(勾选了 Delete on Termination)会随实例删除。可见理解该开关对控制云成本至关重要。
4. 写入 User Data 引导脚本
在User data(用户数据)字段中粘贴以下脚本:
yum update -y yum install -y httpd systemctl start httpd systemctl enable httpd echo "<h1>I made it! This is is awesome!</h1>" > /var/www/html/index.html逐行解读(本脚本在实例首次启动时以 root 权限执行):
| 命令 | 作用 |
|---|---|
yum update -y | 更新系统软件包,保证依赖源最新,避免安装 httpd 时遇到缺失依赖 |
yum install -y httpd | 安装 Apache HTTP Server(httpd),-y自动确认 |
systemctl start httpd | 立即启动 httpd 服务 |
systemctl enable httpd | 设置 httpd 开机自启,实例重启后服务仍然在线 |
echo ... > /var/www/html/index.html | 写入练习要求的首页内容(注意原练习文本中为 "This is is awesome!",控制台脚本中带<h1>标签;Terraform 版本为修正后的 "This is awesome!") |
关于 User Data 的三个关键事实(可从仓库 Terraform 主题的 user_data 问答 印证):
- User Data 只在实例首次启动时执行一次;对已经运行中的实例修改 user_data 并
apply不会生效; - 在 Terraform 中若需让脚本变更真正落地,需要显式使用
user_data_replace_on_change = true触发实例替换重建; - 执行日志位于实例内的
/var/log/cloud-init-output.log,是排查引导失败的第一现场。
5. 添加标签:Type=web 与 Name=web-1
在Tags(标签)部分添加两条键值对:
- key:
Type,value:web - key:
Name,value:web-1
其中Name是 AWS 约定俗成的实例"显示名称"标签,控制台实例列表会直接展示它;Type: web则用于标记实例角色,便于后续按角色进行成本分账、批量筛选或与其他资源(如自动伸缩组)联动。
6. 安全组:放行 80 端口入站流量
在Security group(安全组)部分,添加一条入站规则:
- Type:HTTP
- Port range:80
- Protocol:TCP
- Source:Anywhere-IPv4(即
0.0.0.0/0,允许来自任意 IPv4 地址的 HTTP 请求)
这条规则的意义是:EC2 默认会拒绝所有入站流量,即使 httpd 已经监听 80 端口,没有安全组放行,外部浏览器依然无法访问首页。仓库的 Security Groups 练习 对该机制做了直观演示——删除 HTTP 规则后访问立即超时,重新添加后恢复访问。若希望限制来源,也可将 Source 改为指定 CIDR(如办公网段x.x.x.x/32)或另一个安全组 ID。
7. 审核与启动、密钥对
点击Review(审核)确认所有配置,然后点击Launch(启动)。若账户中还没有密钥对,按提示创建一个(如web-1-key)并下载保存.pem私钥文件——这是之后通过 SSH 登录实例验证结果的唯一凭证,控制台不会再次提供。
8. 验证结果
实例状态变为Running后,等待 1~2 分钟让 User Data 脚本执行完毕,然后:
- 在浏览器访问
http://<实例公网IP>/,应看到 "I made it! This is is awesome!"; - 或 SSH 登录后执行
cat /var/www/html/index.html、systemctl status httpd验证文件内容与服务状态; - 若页面无法访问,优先查看
/var/log/cloud-init-output.log与安全组规则。
三、Terraform 实现:把整套需求写成可复用的 IaC
仓库 AWS 主题页明确建议优先使用 IaC 技术(Terraform、Pulumi)完成练习,这比控制台手工点击更接近生产实践。以下配置完整覆盖练习的全部 6 项需求(源文件见 solution.md):
provider "aws" { region = "us-east-1" // Or your desired region } resource "aws_instance" "web_server" { ami = "ami-12345678" // Replace with the correct AMI for Amazon Linux 2 instance_type = "t2.micro" // Or any instance type with 1 vCPU and 1 GiB memory tags = { Name = "web-1" Type = "web" } root_block_device { volume_size = 8 // Or any desired size delete_on_termination = true } provisioner "remote-exec" { inline = [ "sudo yum update -y", "sudo yum install -y httpd", "sudo systemctl start httpd", "sudo bash -c 'echo \"I made it! This is awesome!\" > /var/www/html/index.html'", "sudo systemctl enable httpd" ] connection { type = "ssh" user = "ec2-user" private_key = file("~/.ssh/your_private_key.pem") // Replace with the path to your private key host = self.public_ip } } security_group_ids = [aws_security_group.web_sg.id] } resource "aws_security_group" "web_sg" { name = "web_sg" description = "Security group for web server" ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } }配置要点逐项解析
- provider 区域:与"选择接近你的区域"同理,
region = "us-east-1"可替换为你的目标区域。 aws_instance资源:ami需要替换为 Amazon Linux 2 在当前区域对应的真实 AMI ID(可用aws ssm get-parameter查询最新 AMI 或从控制台 AMI 目录获取);instance_type = "t2.micro"满足 1 vCPU + 1 GiB。- tags:
Name = "web-1"与Type = "web"直接映射需求第 5 项。 root_block_device:delete_on_termination = true对应需求第 3 项;volume_size = 8为 Amazon Linux 2 默认根卷大小,可按需调整。remote-execprovisioner:通过 SSH 在实例上执行引导命令,实现需求第 4 项。这里与控制台 User Data 的思路等价但机制不同——User Data 由 cloud-init 在实例内自动执行,而 provisioner 依赖你提供的私钥建立 SSH 连接后逐条执行。注意:remote-exec仅在创建时执行,且需要private_key与host(self.public_ip)配置正确,这是它比 User Data 更容易出错的环节。aws_security_group资源:ingress块放行 TCP 80 端口、源0.0.0.0/0,对应需求第 6 项;通过security_group_ids挂载到实例。该安全组默认没有出站限制(Terraform AWS provider 默认允许所有出站流量),因此实例拉取 yum 软件包不受影响。
从创建到销毁的完整工作流
参考仓库中 Terraform Launch EC2 instance 练习 的标准操作序列:
# 1. 初始化(下载 AWS provider 插件) terraform init # 2. 校验语法 terraform validate # 3. 预览将要创建的资源,应看到 "Plan: 2 to add"(实例 + 安全组) terraform plan # 4. 应用变更 terraform apply -auto-approve # 5. 再次 apply:Terraform 对比真实基础设施与配置, # 未发现差异,输出 "0 added, 0 changed, 0 destroyed"(幂等性验证) # 6. 销毁资源,避免产生持续费用 terraform destroy -auto-approve由于本练习的实例启用了delete_on_termination = true,terraform destroy后实例、根卷与安全组都会被清理,不会残留孤立 EBS 卷产生额外账单——这与练习"存储随实例终止而删除"的要求在 IaC 层面形成了闭环。
四、两种实现方式的对比与选择建议
| 维度 | 控制台 + User Data | Terraform |
|---|---|---|
| 上手门槛 | 低,适合学习概念 | 中,需要掌握 HCL 语法与 CLI |
| 可重复性 | 手工操作,难以审计 | 配置即代码,可版本化、可复用 |
| 引导执行机制 | cloud-init 自动执行,无需额外凭证 | 需要私钥建立 SSH 连接(remote-exec) |
| 适合场景 | 一次性实验、快速验证 | 生产交付、团队协作、CI/CD 集成 |
仓库 AWS 主题页 的建议是:优先用 IaC 完成练习。对初学者,建议先用控制台完整走一遍本文第二节的流程建立感性认知,再切换到 Terraform 复现,这样既能理解每一步背后的云资源语义,又能获得工程化的交付能力。
五、延伸阅读:继续巩固 EC2 知识链
本练习只是 EC2 实战系列的起点,仓库提供了完整的进阶练习路线(均见 topics/aws/README.md 的 EC2 条目):
- Security Groups:验证入站规则的增删对访问的即时影响,理解安全组有状态防火墙的本质;
- EBS Volume Creation:深入理解 Delete on Termination 与手动附加卷的生命周期差异;
- Create AMI:把配置好的实例固化为镜像,实现快速批量复制;
- Create EFS:为多实例提供共享文件存储;
- Terraform Launch EC2 instance:掌握
init/validate/plan/apply/destroy完整 IaC 工作流。
完成上述练习后,你将能独立完成"启动实例 → 配置引导 → 固化镜像 → 规模化交付"的完整链路,为后续接触 Auto Scaling、负载均衡等更复杂的 AWS 架构打下扎实基础。
- 文档
- 教程
- 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
相关推荐
AWS EC2 实战:使用 User Data 与 Terraform 启动一个 Web 实例(devops-exercises 演练)
AWS EC2 实战:使用 User Data 与 Terraform 启动一个 Web 实例(devops exercises 演练) 本文基于开源仓库 de
文档教程DevOps运维Hyperresearch 16步研究流水线完全解析:从分解到可读性审计
Hyperresearch 16步研究流水线完全解析:从分解到可读性审计 Hyperresearch 是一款将 Claude Code 变成深度研究智能体(de
文档教程DevOps运维tweakcn 完整上手指南:3步跑通本地环境到 shadcn/ui 主题导出
tweakcn 完整上手指南:3步跑通本地环境到 shadcn/ui 主题导出 用 shadcn/ui 做项目,十有八九长一个样。tweakcn 是专为 sha
文档教程DevOps运维
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考