前面 19 节课你学会了 Docker、K8s、Terraform、CI/CD 全套工具链,但有一个盲区:这些工具操作的对象——云资源本身——你还不熟悉。这节课补齐这个缺口。
JD 里「熟悉至少一个云平台」的出现率接近 100%。以 AWS 为例(概念在所有云平台通用,阿里云/腾讯云/GCP 只是名字不同),这节课覆盖 DevOps 日常高频接触的核心云服务。
| 维度 | VPS(你现有的) | 云平台(AWS/阿里云) |
|---|---|---|
| 网络 | 一个公网 IP,无隔离 | VPC = 你自己的虚拟私有网络 |
| 安全 | ufw 防火墙 | 安全组(Security Group)= 实例级防火墙 |
| 存储 | 本地磁盘 | EBS(块存储)+ S3(对象存储)+ EFS(文件存储) |
| 数据库 | 自己装 PostgreSQL | RDS = 托管数据库,自动备份/多 AZ |
| 权限 | root 一把梭 | IAM = 精细到单个 API 的权限控制 |
| 计费 | 固定月费 | 按用量计费,忘删资源 = 月底账单爆炸 |
VPC 是你云上所有资源的网络容器。一个典型的 Web 应用 VPC 架构:
Internet
│
Internet Gateway
│
┌───────────────┴───────────────┐
│ VPC (10.0.0.0/16) │
│ │
│ Public Subnet (10.0.1.0/24) │ ← 有公网 IP 的资源
│ ┌──────────┐ ┌───────────┐ │
│ │ Bastion │ │ ALB │ │
│ │ (跳板机) │ │ (负载均衡)│ │
│ └──────────┘ └───────────┘ │
│ │
│ Private Subnet (10.0.2.0/24) │ ← 无公网 IP,更安全
│ ┌──────────┐ ┌───────────┐ │
│ │ EC2 App │ │ RDS DB │ │
│ └──────────┘ └───────────┘ │
└────────────────────────────────┘
面试必知:
EC2 就是你 VPS 的云版本。但比 VPS 多了几个关键能力:
# 启动一台 EC2 的典型参数(Terraform 视角——对应 0008):
resource "aws_instance" "app" {
ami = "ami-0c55b159cbfafe1f0" # 操作系统镜像
instance_type = "t3.medium" # CPU/内存规格
subnet_id = aws_subnet.private.id # 放在哪个子网
vpc_security_group_ids = [aws_security_group.app.id]
key_name = "my-key" # SSH 密钥
root_block_device {
volume_size = 20 # 系统盘大小 GB
volume_type = "gp3" # SSD 类型
}
}
| 概念 | 含义 | 面试问什么 |
|---|---|---|
| AMI | Amazon Machine Image,OS 快照 | 选 Amazon Linux 2 还是 Ubuntu? |
| Instance Type | CPU/内存/网络规格 | t3 vs m5 vs c5 的区别? |
| Key Pair | SSH 密钥 | 丢失私钥怎么办?(答:只能换 AMI 重建) |
| User Data | 启动时自动执行的脚本 | 和 Ansible(0017) 怎么配合? |
| 弹性 IP | 静态公网 IP | 为什么不要给每台 EC2 绑弹性 IP?(答:贵且浪费) |
传统运维思维:「SSH 进去,sudo su,想干什么干什么」。
云上思维:最小权限原则(Least Privilege)——每个角色只给刚好够用的权限,多一点都不行。
# IAM Policy 示例:只允许读取 S3 里的一个 bucket
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": [
"arn:aws:s3:::my-app-config",
"arn:aws:s3:::my-app-config/*"
]
}
]
}
核心概念:
S3 不是文件系统。它是一个 key-value 存储,key 是文件名,value 是文件内容。无限容量,11 个 9 的持久性(99.999999999%)。
# S3 典型用法
# 1. 静态网站托管
# 2. CI/CD 制品仓库(存构建产物)
# 3. 日志归档
# 4. 数据库备份
# 5. Terraform state 后端(0008 学过 remote state)
# AWS CLI 操作
aws s3 ls s3://my-bucket/
aws s3 cp app.zip s3://my-bucket/releases/v1.0.0/app.zip
aws s3 sync ./dist/ s3://my-site/ # 部署静态站
| 概念 | 含义 |
|---|---|
| Bucket | 桶,S3 的顶层容器,名字全局唯一 |
| Object | 对象 = 文件 + 元数据。单个最大 5TB |
| Versioning | 版本控制——覆盖文件不丢旧版,误删可恢复 |
| Lifecycle Policy | 自动把旧文件归档或删除(30天后转 Glacier,90天后删除) |
| Static Website Hosting | 直接托管 HTML/JS/CSS,不需要 Nginx |
自己装数据库:你要管备份、升级、高可用、磁盘扩容。RDS 把这些全自动化了。
# RDS 替你做的事(对比自己装 PostgreSQL):
自己装 RDS
────── ───
pg_dump + cron 定时备份 自动备份 + 时间点恢复(PITR)
手动配置主从复制 Multi-AZ 自动故障切换
手动监控磁盘使用率 自动扩容(或告警)
手动打安全补丁 自动小版本升级
手动配置 SSL 一键强制 SSL
关键参数:
任务:注册 AWS 账号(需信用卡,free tier 免费),用 AWS CLI 完成以下操作。
# 1. 安装 AWS CLI
# 本机已有的话跳过
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o awscliv2.zip
unzip awscliv2.zip && sudo ./aws/install
aws --version
# 2. 配置凭证(在 AWS Console → IAM → 创建 access key)
aws configure
# Access Key ID: AKIA...
# Secret Access Key: ...
# Default region: us-east-1
# Output format: json
# 3. 验证身份
aws sts get-caller-identity
# 输出: { "Account": "123456789012", "UserId": "...", "Arn": "..." }
# 4. 创建 S3 bucket(名字必须全局唯一,加随机后缀)
aws s3 mb s3://my-devops-learning-bucket-$(date +%s)
# 输出: make_bucket: my-devops-learning-bucket-...
# 5. 上传一个文件
echo "Hello from AWS CLI" > test.txt
aws s3 cp test.txt s3://my-devops-learning-bucket-*/
# 6. 验证文件存在
aws s3 ls s3://my-devops-learning-bucket-*/
# 7. 删除文件 + 删除 bucket(记得清理,避免计费)
aws s3 rm s3://my-devops-learning-bucket-*/test.txt
aws s3 rb s3://my-devops-learning-bucket-*/
# 8. 用 Terraform 做同样的事(结合 0008 学的内容)
cat > s3.tf << 'EOF'
provider "aws" { region = "us-east-1" }
resource "aws_s3_bucket" "demo" {
bucket = "my-terraform-bucket-${random_id.suffix.hex}"
}
resource "random_id" "suffix" {
byte_length = 4
}
EOF
terraform init && terraform plan && terraform apply
terraform destroy # 毁灭证据,别留账单
下一课学 Lesson 0021:DevSecOps 安全基础——怎么在 CI/CD 流水线里防止把密钥提交到 Git、怎么扫描容器镜像漏洞、怎么把安全做成自动化。