☰
devops-exercises 实战:在 AWS 上通过控制台与 Terraform 启动 EC2 Web 实例(httpd + User Data + 安全组)
2026/9/30 6:37:33 网站建设 项目流程
  • 文档
  • 教程
  • 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

项目地址:https://gitcode.com/GitHub_Trending/de/devops-exercises
点击查看免费下载

本文基于 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 配置项
1Amazon Linux 2 镜像AMI 选择
21 vCPU + 1 GiB 内存机型实例类型(t2.micro)
3实例终止时删除存储根卷 "Delete on Termination"
4开机自动安装并启动 httpd、写入指定网页内容User Data(用户数据)引导脚本
5标签 Type=web、名称 web-1Tags 键值对
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 服务

  1. 登录 AWS 控制台,选择一个离你较近的区域(如 us-east-1、ap-northeast-1)。不同区域的 AMI ID、价格与可用区不同,后续 Terraform 与安全组配置都基于同一区域进行。
  2. 进入EC2 服务页面。
  3. 左侧菜单点击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 脚本执行完毕,然后:

  1. 在浏览器访问http://<实例公网IP>/,应看到 "I made it! This is is awesome!";
  2. 或 SSH 登录后执行cat /var/www/html/index.html、systemctl status httpd验证文件内容与服务状态;
  3. 若页面无法访问,优先查看/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 DataTerraform
上手门槛低,适合学习概念中,需要掌握 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

项目地址:https://gitcode.com/GitHub_Trending/de/devops-exercises
点击查看免费下载
上一篇:Realtek RTL8125 2.5GbE网卡驱动:从零开始的完整安装配置指南
下一篇:Obsidian GitHub Publisher 项目常见问题解决方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询