大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
EC2 计算
这一课你将能做到
- 根据业务场景选择合适的 EC2 实例类型(通用型/计算型/内存型/存储型),并说出选型理由
- 用 AWS CLI 或控制台启动一台 EC2,安装 Java 环境并部署本站后端服务
- 理解 AMI、Launch Template、Key Pair、EIP、IAM Role 的作用,并能独立配置
为什么要学
EC2 是 AWS 的「心脏」,几乎所有后端服务最终都要跑在 EC2 上。本站目前部署在阿里云 ECS,AWS EC2 是它的直接对标。面试中「你们服务器怎么部署的」「实例类型怎么选的」是必问题。不会 EC2,等于不会云上运维。
人话:EC2 就是 AWS 给你的一台远程电脑,你可以选 CPU、内存、硬盘,装 Linux,跑 Java 服务。跟阿里云 ECS 一样,但 AWS 的实例类型分得细得多,价格也复杂得多。
先建立图像
EC2 实例类型速查表:
| 系列 | 类型 | 特点 | 适用场景 | 本站场景 |
|---|---|---|---|---|
| t3/t4g | 通用型(突发) | 基线 CPU + 突发积分 | 低负载 Web、开发环境 | 个人博客、测试 |
| m5/m6i | 通用型 | 均衡 CPU/内存 | 中型 Web、企业应用 | 本站生产(Spring Boot) |
| c5/c6i | 计算优化型 | 高 CPU | 视频编码、科学计算 | 不推荐 |
| r5/r6i | 内存优化型 | 大内存 | 缓存、数据库、大数据 | Redis、Elasticsearch |
| i4i/d2 | 存储优化型 | 高速本地盘 | 日志、数据仓库 | 日志分析 |
| g4dn/p3 | GPU 型 | 带显卡 | 机器学习、图形渲染 | 不推荐 |
EC2 启动流程:
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ 选 AMI │ → │ 选实例类型│ → │ 配网络 │ → │ 配存储 │
│(Ubuntu/ │ │(t3.micro)│ │(VPC/子网)│ │(EBS 20G)│
│ Amazon │ │ │ │ │ │ │
│ Linux) │ │ │ │ │ │ │
└─────────┘ └─────────┘ └─────────┘ └─────────┘
↓
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 配安全组 │ → │ 配 Key │ → │ 启动! │
│(开22/80/│ │ Pair │ │ │
│ 8080) │ │(.pem文件)│ │ │
└─────────┘ └─────────┘ └─────────┘
跟着做
步骤 1:准备密钥对(Key Pair)
# 创建密钥对(会输出私钥,保存好)
aws ec2 create-key-pair --key-name codenav-key --query "KeyMaterial" --output text > codenav-key.pem
# 修改权限(Windows 用 icacls,Mac/Linux 用 chmod 400)
icacls codenav-key.pem /inheritance:r /grant:r "$($env:USERNAME):(R)"
步骤 2:创建安全组(防火墙)
# 创建安全组
aws ec2 create-security-group --group-name codenav-sg --description "CodeNav Security Group" --vpc-id vpc-xxxxxxxx
# 开放 22 端口(SSH)
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 22 --cidr 0.0.0.0/0
# 开放 8080 端口(本站后端)
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 8080 --cidr 0.0.0.0/0
步骤 3:查找最新 Amazon Linux 2023 AMI
aws ec2 describe-images --owners amazon --filters "Name=name,Values=al2023-ami-2023.*-x86_64" "Name=state,Values=available" --query "Images | sort_by(@, &CreationDate) | [-1].ImageId" --output text
步骤 4:启动实例
aws ec2 run-instances --image-id ami-xxxxxxxx --count 1 --instance-type t3.micro --key-name codenav-key --security-group-ids sg-xxxxxxxx --subnet-id subnet-xxxxxxxx --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=codenav-backend}]"
步骤 5:连接实例并部署本站
# 获取公网 IP
aws ec2 describe-instances --instance-ids i-xxxxxxxx --query "Reservations[0].Instances[0].PublicIpAddress" --output text
# SSH 连接
ssh -i codenav-key.pem ec2-user@<公网IP>
# 安装 Java 17(Amazon Linux 2023)
sudo dnf install java-17-amazon-corretto -y
# 上传 jar 包(本地执行)
scp -i codenav-key.pem target/code-nav-0.0.1-SNAPSHOT.jar ec2-user@<公网IP>:/home/ec2-user/
# 启动(在 EC2 上执行)
nohup java -jar code-nav-0.0.1-SNAPSHOT.jar --server.port=8080 > app.log 2>&1 &
步骤 6:分配弹性 IP(EIP)
# 申请 EIP
aws ec2 allocate-address --domain vpc
# 绑定到实例
aws ec2 associate-address --instance-id i-xxxxxxxx --allocation-id eipalloc-xxxxxxxx
注意:EIP 绑定到运行中的实例免费,闲置的 EIP 收费($0.005/小时)。
步骤 7:创建 IAM Role 让 EC2 访问 S3
# 创建 Role
aws iam create-role --role-name codenav-ec2-role --assume-role-policy-document file://trust-policy.json
# 附加 S3 只读策略
aws iam attach-role-policy --role-name codenav-ec2-role --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
# 创建 Instance Profile 并绑定
aws iam create-instance-profile --instance-profile-name codenav-ec2-profile
aws iam add-role-to-instance-profile --instance-profile-name codenav-ec2-profile --role-name codenav-ec2-role
aws ec2 associate-iam-instance-profile --instance-id i-xxxxxxxx --iam-instance-profile Name=codenav-ec2-profile
讲清楚要点
- AMI(Amazon Machine Image):实例的「装机镜像」,包含 OS + 预装软件。可以用 AWS 官方镜像,也可以自己打镜像(
aws ec2 create-image)。 - 实例类型命名规则:
t3.micro= 系列(t3)+ 规格(micro)。系列决定 CPU/内存配比,规格决定具体大小(nano/micro/small/medium/large/xlarge/2xlarge...)。 - t 系列突发模式:t3/t4g 有 CPU 基线(如 20%),空闲时攒积分,忙时爆发。长时间高负载会耗尽积分,性能骤降。生产环境慎用。
- EBS(弹性块存储):EC2 的系统盘和数据盘。gp3(通用 SSD)性价比最高,io2(高性能 SSD)给数据库用,st1(吞吐优化 HDD)给大数据用。
- IAM Role on EC2:不要在 EC2 上放 Access Key!用 IAM Role 让实例自动获得权限,AWS 会自动轮换临时凭证。
你可能会懵的地方
-
EC2 和 Lightsail 有什么区别? Lightsail 是「简化版 EC2」,固定套餐、固定价格,适合初学者和个人项目。EC2 更灵活,适合生产环境。Lightsail 的实例底层也是 EC2。
-
t3.micro 免费套餐能跑本站吗? 能跑,但很勉强。Spring Boot 启动就吃 500MB+ 内存,t3.micro 只有 1GB,还要留给 OS。建议至少 t3.small(2GB)或 m6i.large(8GB)用于生产。
-
实例停止(Stop)和终止(Terminate)有什么区别? Stop:实例关机,EBS 保留,IP 释放(除非绑了 EIP),数据不丢,不收实例费但收 EBS 费。 Terminate:实例删除,EBS 默认也删(除非勾选保留),数据全丢。
-
为什么我的实例没有公网 IP? 子网的「自动分配公网 IP」没开,或者实例启动时没勾选。解决:绑 EIP,或修改子网设置。
-
EC2 用户数据(User Data)是干什么的? 实例首次启动时自动执行的脚本。可以用它自动装 Java、拉代码、启动服务,实现「开箱即用」。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| 用 root 账号 Access Key 在 EC2 上调用 AWS API | 密钥泄露风险,无法审计 | 用 IAM Role,临时凭证自动轮换 |
| 生产环境用 t3.micro | CPU 积分耗尽后性能暴跌 | 至少 t3.small,或 m5/m6i 系列 |
| 安全组开 0.0.0.0/0 的 3389/22 到生产 | 被爆破扫描 | 用 VPN/ bastion host,或限制公司 IP 段 |
| 实例终止后发现数据没了 | EBS 默认随实例删除 | 重要数据挂独立 EBS,取消「随实例删除」 |
| 不监控直接跑 | 挂了都不知道 | 装 CloudWatch Agent,配告警 |
卡点急救
- SSH 连不上:检查安全组 22 端口是否开放;检查密钥权限(Windows 用 icacls);检查实例是否在公有子网且有公网 IP。
- 实例启动后状态
pending很久:AMI 或实例类型在当前 AZ 缺货。换 AZ 或换实例类型。 - Java 服务启动报内存不足:t3.micro 只有 1GB。加 swap,或升级实例,或换用
-Xmx512m限制堆内存。
面试常问
-
EC2 实例类型怎么选? 看业务特征:Web 服务选通用型(m5/m6i),计算密集选 c 系,内存密集(缓存/数据库)选 r 系,存储密集选 i/d 系。开发测试用 t 系省钱。还要考虑网络带宽(实例规格越大带宽越高)和 EBS 优化。
-
AMI 和 Snapshot 的区别? AMI 是整机镜像,包含 OS + 软件,用来启动新实例。Snapshot 是磁盘快照,只包含 EBS 数据,用来备份或创建新 EBS。AMI 底层由 Snapshot 组成。
-
EC2 的 User Data 和 IAM Role 能一起用吗? 能,而且应该一起用。User Data 负责「装机初始化」,IAM Role 负责「运行时权限」。比如 User Data 里装 Java、从 S3 拉 jar 包(靠 IAM Role 授权访问 S3),然后启动服务。
自测三问
- t3.micro 和 m5.large 分别适合什么场景?为什么生产环境慎用 t 系?
- EC2 实例终止后,默认情况下 EBS 数据会保留吗?怎么防止数据丢失?
- 在 EC2 上访问 S3,推荐用什么方式授权?为什么不推荐放 Access Key?
小结一句话
EC2 是云上虚拟机,选型看业务特征,安全用 IAM Role,数据靠 EBS 快照,生产远离 t 系突发型。
延伸
- AWS EC2 官方文档
- EC2 实例类型详解
- 下一课:VPC 网络——学会给本站搭一个安全的云上内网。