CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
DevOps 入门实战/课时/AWS
RawBlame
课时目录12 节

DevOps 入门实战

  1. 01DevOps 入门
  2. 02操作系统
  3. 03Git 与 GitHub
  4. 04脚本语言
  5. 05网络协议
  6. 06Docker
  7. 07AWS
  8. 08Terraform
  9. 09Ansible
  10. 10GitHub Actions
  11. 11Nginx
  12. 12综合练习

AWS

云基础服务。

30 分钟

AWS

这一课你将能做到

  1. 说清楚 AWS 核心服务(EC2、VPC、IAM、S3、RDS)各自解决什么问题
  2. 在 AWS 控制台创建一台 EC2 实例,并配置安全组只允许 22、80、443 端口
  3. 用 AWS CLI 管理资源,理解「区域(Region)」和「可用区(AZ)」的容灾含义

为什么要学

你写的 Spring Boot 应用要跑在物理机器上,但自己买服务器、拉网线、配机房太重了。云计算的本质是「租用别人的机房和服务器」,AWS 是这个领域事实上的标准。即使国内项目多用阿里云、腾讯云,AWS 的概念和术语(VPC、安全组、AMI、IAM)在其他云厂商那里是 1:1 对应的。

人话:AWS 就是一个「服务器超市」。你进去说「我要一台 2 核 4G 的 Linux 机器,放在上海,只开 22 和 443 端口」,30 秒后这台机器就创建好了,密码自动发到你邮箱(或你用密钥登录)。这就是 EC2(弹性云服务器)。

先建立图像

AWS 核心服务关系图:

┌─────────────────────────────────────────┐
│              AWS 全球基础设施              │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  │
│  │ Region  │  │ Region  │  │ Region  │  │
│  │  (北京)  │  │ (上海)  │  │(新加坡) │  │
│  └────┬────┘  └────┬────┘  └────┬────┘  │
│       │AZ-a, AZ-b   │AZ-a, AZ-b  │AZ-a, AZ-b│  ← 每个 Region 含多个物理隔离的机房
└───────┼─────────────┼────────────┼────────┘
        │             │            │
        ▼             ▼            ▼
   ┌─────────────────────────────────────┐
   │           VPC(你的私有网络)            │
   │  10.0.0.0/16                        │
   │  ├─ 公有子网(10.0.1.0/24):放 Nginx、LB │
   │  └─ 私有子网(10.0.2.0/24):放 MySQL、Redis│
   └─────────────────────────────────────┘
        │
   ┌────┴────┐  ┌────┴────┐  ┌────┴────┐
   │   EC2   │  │   RDS   │  │   S3    │
   │  虚拟服务器│  │ 托管数据库 │  │ 对象存储  │
   └─────────┘  └─────────┘  └─────────┘
        │             │            │
        └─────────────┴────────────┘
                      │
                   IAM(权限与身份)

跟着做

步骤 1:创建 VPC 和子网

# 安装 AWS CLI(参考 https://aws.amazon.com/cli/)
aws configure
# 输入 Access Key ID、Secret、默认区域(如 cn-north-1)、输出格式(json)

# 创建 VPC(命令行版本,控制台点点点也行)
aws ec2 create-vpc --cidr-block 10.0.0.0/16 --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=myapp-vpc}]'
# 返回 VpcId,比如 vpc-0123456789abcdef0

# 创建公有子网(在可用区 a)
aws ec2 create-subnet --vpc-id vpc-xxx --cidr-block 10.0.1.0/24 --availability-zone cn-north-1a

# 创建私有子网(在可用区 b,跨机房容灾)
aws ec2 create-subnet --vpc-id vpc-xxx --cidr-block 10.0.2.0/24 --availability-zone cn-north-1b

公有子网:绑定 Internet Gateway(IGW),能从公网访问;私有子网:不绑定 IGW,外部无法直接访问,数据库放这里。

步骤 2:创建安全组(防火墙)

# 创建安全组
aws ec2 create-security-group --group-name web-sg --description "Web server" --vpc-id vpc-xxx
# 返回 sg-xxx

# 放行 22(SSH)、80(HTTP)、443(HTTPS)
aws ec2 authorize-security-group-ingress --group-id sg-xxx --protocol tcp --port 22 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-id sg-xxx --protocol tcp --port 80 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-id sg-xxx --protocol tcp --port 443 --cidr 0.0.0.0/0

# 注意:绝对不要放行 3306、6379、8080 到 0.0.0.0/0

步骤 3:启动 EC2 实例

# 查找最新 Amazon Linux 2023 AMI
aws ec2 describe-images --owners amazon --filters "Name=name,Values=al2023-ami-2023.*-x86_64" --query 'Images | sort_by(@, &CreationDate) | [-1].ImageId' --output text

# 创建密钥对(如果你还没有)
aws ec2 create-key-pair --key-name myapp-key --query 'KeyMaterial' --output text > ~/.ssh/myapp-key.pem
chmod 400 ~/.ssh/myapp-key.pem

# 启动实例(t3.micro 免费套餐)
aws ec2 run-instances \
  --image-id ami-xxx \
  --instance-type t3.micro \
  --key-name myapp-key \
  --security-group-ids sg-xxx \
  --subnet-id subnet-xxx \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=myapp-web}]'

# 等 30 秒,查看公网 IP
aws ec2 describe-instances --filters "Name=tag:Name,Values=myapp-web" --query 'Reservations[].Instances[].PublicIpAddress' --output text

步骤 4:SSH 登录并部署 Docker

ssh -i ~/.ssh/myapp-key.pem ec2-user@<公网IP>

# 安装 Docker
sudo yum update -y
sudo yum install docker -y
sudo systemctl enable --now docker
sudo usermod -aG docker ec2-user
# 退出重登

# 验证
docker run hello-world

步骤 5:IAM 最小权限实践

IAM 是 AWS 的权限系统。常见错误:给 EC2 实例配了 AdministratorAccess,等于裸奔。

正确做法:创建一个「角色(Role)」,只授予需要的权限:

# 创建信任策略文件 trust-policy.json
cat > trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {"Service": "ec2.amazonaws.com"},
    "Action": "sts:AssumeRole"
  }]
}
EOF

# 创建角色
aws iam create-role --role-name EC2-S3-ReadOnly --assume-role-policy-document file://trust-policy.json

# 附加只读 S3 策略(不要给 AdministratorAccess)
aws iam attach-role-policy --role-name EC2-S3-ReadOnly --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

# 创建实例配置文件并关联到 EC2
aws iam create-instance-profile --instance-profile-name EC2-S3-ReadOnly-Profile
aws iam add-role-to-instance-profile --instance-profile-name EC2-S3-ReadOnly-Profile --role-name EC2-S3-ReadOnly

讲清楚要点

  1. Region 是地理大区,AZ 是物理机房:选 Region 看用户在哪(就近原则),选 AZ 做高可用(跨机房部署防单机房断电)。国内 Region 需要 ICP 备案,国外 Region 不用。
  2. VPC 是你的私有网络:所有资源都在 VPC 里。公有子网放「门面」(Nginx、负载均衡器),私有子网放「后台」(数据库、缓存),外部只能通过公有子网的门面访问。
  3. 安全组是虚拟防火墙:默认拒绝所有入站,按需放行。规则只支持「允许」,不支持「拒绝」。出方向默认全开。
  4. IAM 最小权限原则:永远不要给 root 账号日常用,给程序用的 Access Key 只授予刚好够用的权限。
  5. EC2 只是起点:真实生产环境,Spring Boot 会跑在 ECS(容器服务)或 EKS(K8s)上,数据库用 RDS,静态资源放 S3+CDN,日志进 CloudWatch。但先学会「一台 EC2 部署单体应用」是必经之路。

你可能会懵的地方

  • AWS 和阿里云/腾讯云有什么区别? 核心概念完全一致:EC2=ECS,VPC=VPC,安全组=安全组,S3=OSS,RDS=RDS。术语不同但功能 1:1 对应。学会 AWS,其他云 1 天上手。

  • t3.micro 免费套餐有什么坑? 每月 750 小时免费(约 31 天),但超出时间或配置升级会产生费用。一定要设预算告警(Billing Alert),防止意外扣费。不用的实例及时停止或终止。

  • 公有子网和私有子网怎么选? 需要被公网直接访问的(Web 服务器、负载均衡器)放公有子网;不需要被公网访问的(数据库、缓存、内部服务)放私有子网。私有子网的机器要访问外网(比如 yum 更新),需要 NAT Gateway。

  • 为什么不能用 root 账号 Access Key 给程序用? root 账号权限无限大,一旦泄露(比如代码里硬编码),别人可以创建无数资源刷爆你的账单。程序应该用 IAM Role 或最小权限的 IAM User。

  • 安全组和网络 ACL 有什么区别? 安全组是实例级别的防火墙(有状态,回包自动放行),NACL 是子网级别的防火墙(无状态,进出都要配)。日常用安全组就够了。

错法对照

错法问题正解
安全组放行 0.0.0.0/0 所有端口服务器裸奔按需放行 22/80/443,源 IP 精确控制
用 root 账号 Access Key 部署泄露即破产IAM Role 或最小权限 User
把 MySQL 装在 EC2 上并绑定公网数据暴露风险用 RDS 放私有子网,或自建但绑定 127.0.0.1
不设置预算告警月底收到天价账单Billing Console 设 5 美元告警
所有资源放一个 AZ机房断电全站挂关键服务跨 AZ 部署

卡点急救

  1. EC2 启动后 SSH 连不上:检查安全组 22 端口是否放行你的 IP;确认用的是正确的用户名(Amazon Linux 是 ec2-user,Ubuntu 是 ubuntu);确认密钥文件权限是 400。
  2. 实例能启动但 yum 装不了包:实例在私有子网,没有 NAT Gateway 无法访问外网。临时方案:给实例绑弹性 IP 放公有子网;长期方案:配 NAT Gateway。
  3. 网站 80 端口访问不了:按顺序查——安全组 80 放行?Nginx 在跑?Nginx 监听 0.0.0.0 还是 127.0.0.1?实例是公有子网且绑了弹性 IP?

面试常问

  • AWS 上部署一个高可用 Web 应用的基本架构? 答:两个 AZ 各放一台 EC2(或 ECS 容器),前面挂 Application Load Balancer(ALB),数据库用 RDS Multi-AZ(主备跨机房),静态资源放 S3+CloudFront CDN。这样单机房故障不影响服务。

  • IAM 的 Role 和 User 有什么区别? User 是长期凭证(Access Key),适合人或程序;Role 是临时凭证(通过 STS 获取,自动轮换),适合 AWS 服务(EC2、Lambda)之间授权。EC2 应该用 Instance Profile 关联 Role,而不是硬编码 Access Key。

  • VPC 的 CIDR 块 10.0.0.0/16 和 /24 有什么区别? /16 提供 65536 个 IP(10.0.0.0 ~ 10.0.255.255),适合 VPC;/24 提供 256 个 IP(如 10.0.1.0~10.0.1.255),适合子网。VPC 规划时要给每个 AZ 留一个 /24 子网。

自测三问

  1. 为什么数据库要放私有子网,Web 服务器放公有子网?
  2. 安全组规则 允许 22 端口 from 0.0.0.0/0 和 允许 22 端口 from 你的公司IP/32 哪个更安全?为什么?
  3. 你在 AWS 上创建了一台 EC2,但不想让它被公网直接访问,只想通过内网被其他服务器调用,应该怎么做?

小结一句话

AWS 提供了「租用服务器和网络」的标准接口,核心概念(EC2/VPC/IAM/安全组)在所有云厂商都是通用的。

延伸

  • AWS 官方入门指南
  • 下一课:Terraform——用代码描述你的 AWS 基础设施,告别手动点控制台。
加载本节练习…
← 上一课Docker下一课 →Terraform