AWS
这一课你将能做到
- 说清楚 AWS 核心服务(EC2、VPC、IAM、S3、RDS)各自解决什么问题
- 在 AWS 控制台创建一台 EC2 实例,并配置安全组只允许 22、80、443 端口
- 用 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
讲清楚要点
- Region 是地理大区,AZ 是物理机房:选 Region 看用户在哪(就近原则),选 AZ 做高可用(跨机房部署防单机房断电)。国内 Region 需要 ICP 备案,国外 Region 不用。
- VPC 是你的私有网络:所有资源都在 VPC 里。公有子网放「门面」(Nginx、负载均衡器),私有子网放「后台」(数据库、缓存),外部只能通过公有子网的门面访问。
- 安全组是虚拟防火墙:默认拒绝所有入站,按需放行。规则只支持「允许」,不支持「拒绝」。出方向默认全开。
- IAM 最小权限原则:永远不要给 root 账号日常用,给程序用的 Access Key 只授予刚好够用的权限。
- 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 部署 |
卡点急救
- EC2 启动后 SSH 连不上:检查安全组 22 端口是否放行你的 IP;确认用的是正确的用户名(Amazon Linux 是 ec2-user,Ubuntu 是 ubuntu);确认密钥文件权限是 400。
- 实例能启动但 yum 装不了包:实例在私有子网,没有 NAT Gateway 无法访问外网。临时方案:给实例绑弹性 IP 放公有子网;长期方案:配 NAT Gateway。
- 网站 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 子网。
自测三问
- 为什么数据库要放私有子网,Web 服务器放公有子网?
- 安全组规则
允许 22 端口 from 0.0.0.0/0 和 允许 22 端口 from 你的公司IP/32 哪个更安全?为什么?
- 你在 AWS 上创建了一台 EC2,但不想让它被公网直接访问,只想通过内网被其他服务器调用,应该怎么做?
小结一句话
AWS 提供了「租用服务器和网络」的标准接口,核心概念(EC2/VPC/IAM/安全组)在所有云厂商都是通用的。
延伸
- AWS 官方入门指南
- 下一课:Terraform——用代码描述你的 AWS 基础设施,告别手动点控制台。