什么是 Serverless

# 什么是 Serverless

Serverless 是一种云计算服务模型,允许开发者构建和运行应用程序,而无需关心底层服务器的管理。

在 Serverless 架构中,应用程序由事件触发的小型函数组成,这些函数由云服务提供商动态地管理和扩展。

# Serverless 解决了什么问题

  • 运维复杂性:传统的服务器管理涉及到配置、维护和监控,而 Serverless 将这些任务交给云服务提供商,开发者无需关注。

  • 弹性扩展:Serverless 提供弹性伸缩,按需自动调整资源,无需手动调整服务器规模,从而更好地适应应用的变化。

  • 成本优化:通过按使用量计费,Serverless 让开发者只需支付实际使用的计算资源,而无需预先购买和维护庞大的服务器群。

  • 快速部署:Serverless 允许开发者快速部署应用,而无需关心服务器的配置和环境问题。

# Serverless 的特点和优势

  • 事件驱动:Serverless 应用通常是事件驱动的,函数在特定事件发生时被触发执行,如 HTTP 请求、文件上传等。

  • 无服务器架构:开发者不需要关心服务器的配置、维护和扩展,只需编写函数代码,云服务商负责处理底层基础设施。

  • 按需计费:Serverless 模型按照实际使用的资源进行计费,开发者只需支付实际消耗的计算资源,而不需要预先购买。

  • 自动扩展:Serverless 提供自动伸缩能力,根据请求负载自动调整资源,确保应用在高负载时能够保持响应。

  • 多语言支持:支持多种编程语言,开发者可以根据项目需求选择最适合的语言来编写函数。

  • 无状态函数:Serverless 函数通常是无状态的,每个函数都是独立的,不保留上下文信息,使得水平扩展更容易实现。

  • 快速部署:Serverless 应用可以更快速地部署和更新,无需关心底层基础设施的变化。

# Serverless 的应用场景

  • Web 应用前端:用于构建静态网站、单页应用、SSR、NodeJS 应用等前端应用。

  • API 和后端服务:构建 RESTful API、后端服务、微服务等,使开发者能够快速部署和扩展。

  • 数据处理:适用于数据处理、转换、清洗、分析等场景,例如处理实时日志、图像处理等。

  • 实时通知:Serverless 可以用于构建实时通知系统,例如推送通知、即时聊天等。

  • 定时任务:用于执行定时触发的任务,如定时备份、数据清理等。

  • IoT 应用:处理大量传感器数据,进行实时分析和响应,适用于物联网应用。

  • 事件驱动的处理:使用 Serverless 构建事件驱动的处理系统,例如处理队列消息、数据库变更通知等。函数可以根据事件动态触发,响应不同的事件类型。

  • 自动化工作流:Serverless 可以用于构建自动化工作流,例如自动化部署、自动化测试、自动化数据流程等。函数可以作为工作流的各个步骤。

# 半中心化前端架构部署方案

这套AWS + Cloudflare 混合云架构 (opens new window)要做到对其中的每个模块都很熟悉。

# Cloudflare Waiting Room

Cloudflare Waiting Room (opens new window) 是 Cloudflare 提供的一种流量排队管理服务,用于在网站流量激增时保护源服务器,防止因过载而崩溃。

它的核心原理是,当访问者数量超过你设定的阈值时,多余的用户会被引导到一个虚拟等候室页面,按顺序等待进入网站,而不是直接收到 502/503 错误。

相比自建排队系统,Cloudflare Waiting Room 的优势在于:流量在到达源服务器之前就被拦截在 Cloudflare 边缘节点,源站完全不承受超载压力,且无需修改任何后端代码,配置几分钟即可生效。

使用 Cloudflare Waiting Room 可以实现等冷启动完毕后再把流量切过去。利用 Queue All 模式:

  1. 部署前 → 手动开启 "Queue All"(所有用户强制排队)

  2. 服务冷启动、预热完毕

  3. 手动关闭 "Queue All" → 流量正常放行

这样用户会看到等候页面,冷启动期间零流量打到源站。

# Cloudflare Pages

Cloudflare Pages (opens new window) 是 Cloudflare 提供的静态网站 & 全栈应用托管平台,类似 Vercel / Netlify,但依托 Cloudflare 全球边缘网络。

代码推送 → 自动构建 → 部署到全球 300+ 边缘节点 → 用户就近访问

# 部署 & 构建

  • 连接 GitHub / GitLab,push 代码自动触发构建

  • 支持主流框架:Next.js、Nuxt、SvelteKit、Astro、React、Vue 等

  • 每个 PR 自动生成预览链接(Preview Deployments)

  • 支持回滚到任意历史版本

# 网络 & 性能

  • 静态资源部署在 Cloudflare CDN 边缘,全球低延迟

  • 免费自定义域名 + 自动 HTTPS

  • HTTP/3、Brotli 压缩开箱即用

# 全栈能力(Pages Functions)

  • 在 Pages 项目里写 /functions 目录即可添加服务端逻辑

  • 底层是 Cloudflare Workers,运行在边缘节点

  • 支持中间件、动态路由

# 免费套餐限制

项目 免费额度
每月构建次数 500 次
并发构建 1 个
自定义域名 无限
带宽 无限
请求数 无限
Pages Functions 请求 10 万次/天

# Cloudflare Workers

Cloudflare Workers (opens new window) 是 Cloudflare 的边缘计算平台,让你在全球 300+ 个数据中心的边缘节点上运行代码,而不是在某个固定的中心化服务器上。

# 运行时特点

Workers 不是 Node.js,也不是容器,而是基于 V8 Isolate:

特性 说明
运行时 V8 Isolate(Chrome 同款 JS 引擎)
启动时间 < 5ms,几乎无冷启动
内存限制 128MB
CPU 时间 免费版 10ms,付费版 30s
支持语言 JS / TS / Rust / C / C++(编译为 WASM)
兼容性 部分 Node.js API + Web Standard API

# 能做什么

请求处理 & 代理

  • 修改 Request / Response(改 Header、重写 URL)

  • A/B 测试、灰度发布

  • 鉴权拦截(JWT 验证、IP 白名单)

  • 反向代理、请求路由

动态内容生成

  • 服务端渲染(SSR)

  • 动态 HTML 注入(HTMLRewriter)

  • 生成 OG 图片、PDF、验证码

什么是 OG 图片

OG 图片是 Open Graph 图片,是网页在社交媒体分享时显示的预览缩略图。

API 服务

  • REST / GraphQL API

  • Webhook 处理

  • 定时任务(Cron Triggers)

# 免费套餐

项目 免费额度
请求数 10 万次/天
CPU 时间 10ms / 请求
KV 读取 10 万次/天
D1 查询 500 万行读/天
R2 存储 10 GB

什么是 CPU 时间

要区分两个概念:

CPU 时间:Worker 代码真正占用 CPU 运算的时间;实际时间(Wall time):请求从开始到结束的总耗时。

请求进来
├─ 执行 JS 逻辑 ← 计入 CPU 时间
├─ 等待 fetch() 响应 ← 不计入 CPU 时间
├─ 执行 JS 处理响应 ← 计入 CPU 时间
└─ 返回响应

所以即使你的 Worker 要等一个外部 API 响应 2 秒,这 2 秒的等待不算在 CPU 时间里,真正消耗的 CPU 时间往往只有几毫秒。

  • 免费版 10ms 对绝大多数场景完全够用,比如请求转发、鉴权、路由、简单计算

  • 超出限制会直接返回 CPU time limit exceeded 错误

  • 需要超出 10ms 的场景:大量字符串处理、图片处理、复杂加密运算等,这时需要付费版的 30s 上限

# Cloudflare Workers 和 AWS Lambda@Edge 的区别

  • Workers:轻量、极速、生态完整,适合从零构建边缘应用

  • Lambda@Edge:深度绑定 AWS,适合在现有 CloudFront 架构上做扩展,灵活性受限较多

维度 Cloudflare Workers AWS Lambda@Edge
运行时 V8 Isolate Node.js / Python / 容器
冷启动 < 5ms 100ms ~ 1s+
部署节点数 300+ 全球边缘节点 仅限 CloudFront 节点(约 13 个区域)
环境变量 ✅ 支持 ❌ 不支持
部署 Region 任意 必须 us-east-1
是否能独立使用 可独立部署任意 必须配合 CloudFront
触发方式 HTTP 请求、Cron、Queue、Durable Objects 仅限 CloudFront 的四个事件(Viewer Request/Response、Origin Request/Response)
CPU 时间上限 免费 10ms,付费 30s Viewer 事件 1s,Origin 事件 30s
内存上限 128MB 128MB ~ 10GB(可配置)
包体积上限 1MB(免费)/ 10MB(付费) 1MB(Viewer)/ 50MB(Origin)
支持语言 JS / TS / Rust / C / C++(编译为 WASM) Node.js / Python(Lambda@Edge 限制较多)
原生存储绑定 KV、D1、R2、Durable Objects、Queues、Vectorize 无原生绑定,需额外调用 AWS SDK 访问 S3、DynamoDB 等
免费额度 10 万次请求/天 100 万次请求/月(12 个月试用期后收费)
收费模式 按请求数 + CPU 时间计费,$5/月起 按请求数 + 执行时长计费,价格高于普通 Lambda
部署复杂度 低,wrangler CLI 一条命令部署 高,需配合 CloudFront、IAM 权限、Lambda 版本管理
调试 & 本地开发 Miniflare 本地模拟,体验接近生产环境 本地模拟较复杂,通常依赖 SAM CLI 或真实环境
适合场景 独立边缘应用、API、鉴权、SSR、全栈项目 已有 AWS 技术栈,需在 CloudFront 层做请求/响应改写
不适合场景 重计算任务、依赖完整 Node.js API 的项目 独立部署的边缘应用、对冷启动敏感的场景

# AWS Lambda

AWS Lambda (opens new window) 是亚马逊提供的无服务器计算服务,让你只需上传代码,无需管理任何服务器,AWS 负责所有底层基础设施的运维和扩容。

它是按需运行的函数,事件来了就跑,跑完就停,无需关心服务器,是 AWS 无服务器架构的核心计算单元。

# 运行机制

事件触发  
  └─ Lambda 分配执行环境(容器)  
       └─ 加载运行时 + 你的代码  
            └─ 执行函数  
                 └─ 返回结果 → 容器保留一段时间(应对下次请求)  
                              → 长时间无请求则销毁(冷启动来源)
1
2
3
4
5
6

# 支持的运行时

语言 版本
Node.js 18.x / 20.x
Python 3.11 / 3.12
Java 11 / 17 / 21
Go 1.x
Ruby 3.2
.NET 6 / 8
自定义运行时 任意语言(通过 Runtime API)

# 触发方式(事件源)

Lambda 本身不主动运行,必须由事件触发:

触发源 场景
API Gateway / Function URL HTTP 接口
S3 文件上传后处理
DynamoDB Streams 数据变更监听
SQS / SNS 消息队列消费
EventBridge 定时任务、事件总线
CloudFront(Lambda@Edge) 边缘请求处理
Cognito 用户认证钩子
直接调用(Invoke API) 服务间调用

# 关键配置参数

参数 范围 说明
内存 128MB ~ 10GB 同时决定 CPU 算力(内存越大 CPU 越强)
超时时间 1s ~ 15min 超时强制终止
并发数 默认 1000(可申请提升) 同时运行的实例上限
包大小 50MB(压缩)/ 250MB(解压) 超出需用 Lambda Layer 或容器镜像
临时存储 512MB ~ 10GB(/tmp 目录) 函数执行期间可用
Layer 数量 最多 5 个 所有 Layer 解压后与函数代码合计不超过 250MB

# 冷启动

这是 Lambda 最常被讨论的问题:

冷启动 = 容器初始化 + 运行时加载 + 代码初始化

  • Node.js 冷启动:100ms ~ 500ms

  • Java 冷启动:500ms ~ 3s+(最严重)

  • Python 冷启动:100ms ~ 300ms

优化方案:

  • Provisioned Concurrency (opens new window):预热指定数量的实例,彻底消除冷启动,额外收费

  • SnapStart (opens new window)(Java、Python、.NET):快照预热实例,冷启动降低 90%

  • 减小包体积:用 esbuild / tree-shaking 去掉无用依赖

  • 把重操作放到 handler 外:比如建立数据库连接,利用容器复用来避免每次请求重复执行

# 定价模型

计费项 免费额度(每月) 超出后单价
请求次数 100 万次 $0.20 / 百万次
执行时长 40 万 GB·秒 $0.0000166667 / GB·秒

示例

函数内存 512MB,执行时间 200ms,调用 100 万次

计费时长 = 0.5GB × 0.2s × 100万 = 10万 GB·秒

费用 ≈ $1.67

# 适合 / 不适合的场景

适合:

  • 流量波动大、需要弹性伸缩

  • 事件驱动的异步任务(文件处理、消息消费)

  • API 后端,尤其是低频或中频接口

  • 定时任务(替代 Cron Job)

  • 微服务架构中的单一职责函数

不适合:

  • 长时间运行任务(超过 15 分钟)

  • 对冷启动极度敏感的实时场景

  • 需要持久化本地状态的应用

  • 高频小任务(费用可能高于常驻服务器)

  • WebSocket 长连接服务(需配合 API Gateway,架构复杂)

# AWS Lambda@Edge

Lambda@Edge (opens new window) 是 AWS 在 CloudFront 边缘节点上运行 Lambda 函数的能力,让你在离用户最近的地方处理 HTTP 请求和响应,而不是把请求转发回中心化的服务器。

# 四个触发时机

这是 Lambda@Edge 最核心的概念,函数可以挂载在 CloudFront 请求生命周期的四个位置:

用户
 │
 ▼
[1] Viewer Request      ← 用户请求刚到达 CloudFront,还没查缓存
 │
 ▼
CloudFront 缓存检查
 │
 ▼
[2] Origin Request      ← 缓存未命中,即将转发给源站
 │
 ▼
源站(S3 / ALB / EC2)
 │
 ▼
[3] Origin Response     ← 源站返回响应,即将写入缓存
 │
 ▼
CloudFront 缓存写入
 │
 ▼
[4] Viewer Response     ← 即将返回给用户
 │
 ▼
用户

Viewer 事件  = 用户 ↔ CloudFront 之间的请求/响应
Origin 事件  = CloudFront ↔ 源站 之间的请求/响应
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
触发点 典型用途
Viewer Request 鉴权、URL 重写、AB 测试
Origin Request 修改转发给源站的请求、自定义缓存 key
Origin Response 修改响应头、错误页替换
Viewer Response 添加安全响应头、日志记录

# 限制参数

Lambda@Edge 不支持环境变量,配置只能硬编码或从外部服务(如 SSM Parameter Store)读取。

参数 Viewer 事件 Origin 事件
CPU 时间 1s 30s
内存 128MB 128MB ~ 10GB
包大小(压缩) 1MB 50MB
响应体大小 40KB 1MB
网络访问 ✅ ✅
环境变量 ❌ ❌

# 部署限制

  • 函数必须部署在 us-east-1(北弗吉尼亚),CloudFront 会自动将其复制到全球边缘节点

  • 只支持 Node.js 和 Python 运行时

  • 不支持 Lambda URL、容器镜像部署

  • 不能绑定 VPC

# 典型使用场景

1. 鉴权 & 访问控制

  • JWT / Cookie 验证,拦截非法请求

  • IP 白名单、地理封锁

2. URL 处理

  • 路径重写(/old-path → /new-path)

  • 多语言内容根据 Accept-Language 自动路由

  • A/B 测试流量分配

3. 响应处理

  • 统一注入安全响应头(CSP、HSTS)

  • 动态修改 HTML 内容

  • 替换源站返回的错误页

4. 性能优化

  • 自定义缓存 Key(去掉无关查询参数)

  • 图片格式协商(根据 Accept 返回 WebP 或 JPEG)

# AWS WAF

AWS WAF (opens new window)(Web Application Firewall)是 AWS 提供的 Web 应用防火墙,用于过滤和监控进入你应用的 HTTP/HTTPS 流量,拦截恶意请求,保护应用安全。

# 核心原理

用户请求
  └─ 经过 WAF 检查
       ├─ 匹配到规则 → Allow / Block / Count / CAPTCHA
       └─ 未匹配规则 → 走默认动作(Allow 或 Block)
            └─ 转发到后端(CloudFront / ALB / API Gateway)
1
2
3
4
5

# 可以防御什么

1. OWASP Top10 (opens new window) 中的注入攻击

  • SQL 注入(SQLi)—— 恶意数据注入 SQL 查询

  • 跨站脚本(XSS)—— 恶意脚本注入 HTML 页面

  • 命令注入 —— 恶意数据注入系统命令

  • 路径遍历 —— 恶意路径注入文件系统访问

2. 应用层攻击

  • HTTP Flood(七层 DDoS)

  • 爬虫 / 恶意 Bot

  • 凭证填充(Credential Stuffing)

  • 账号枚举暴力破解

3. 业务层防护

  • 限制特定 IP 的请求频率

  • 封锁特定国家 / 地区的流量

  • 拦截特定 User-Agent

# 核心概念

1. Web ACL

WAF 的顶层资源,包含一组有序规则,每条规则按顺序匹配,第一个命中的规则决定处理动作。

Web ACL
  ├─ 规则 1:封锁已知恶意 IP 列表         → Block
  ├─ 规则 2:允许来自办公室 IP 的请求      → Allow
  ├─ 规则 3:SQL 注入检测                → Block
  ├─ 规则 4:单 IP 每分钟超过 100 次请求   → Block
  └─ 默认动作                           → Allow
1
2
3
4
5
6

2. Rule(规则)

每条规则由两部分组成:

  • 条件(Statement):匹配什么(IP、Header、Body、URI 等)

  • 动作(Action):匹配后做什么

动作 说明
Allow 放行请求
Block 返回 403,拦截请求
Count 只计数,不拦截(用于测试规则)
CAPTCHA 返回验证码挑战
Challenge 静默 JS 挑战(验证是否真实浏览器)

3. Rule Group(规则组)

多条规则打包成一组,可复用到多个 Web ACL,分三种来源:

  • AWS 托管规则:AWS 官方维护,开箱即用

  • 第三方托管规则:来自 Marketplace,如 CrowdStrike、F5

  • 自定义规则:自己编写

# AWS 托管规则(免费附带)

规则组名 防御内容
AWSManagedRulesCommonRuleSet OWASP Top 10 通用规则
AWSManagedRulesSQLiRuleSet SQL 注入专项
AWSManagedRulesKnownBadInputsRuleSet 已知恶意输入模式
AWSManagedRulesBotControlRuleSet Bot 识别与管理(额外收费)
AWSManagedRulesATPRuleSet 账号接管防护(额外收费)
AWSManagedRulesACFPRuleSet 账号欺诈防护(额外收费)

# 可部署在哪里

WAF 作为一层附加在以下服务前面:

CloudFront          ← 全球边缘防护
Application LB      ← 区域级防护
API Gateway         ← API 接口防护
AppSync             ← GraphQL 防护
Cognito User Pool   ← 登录接口防护
App Runner          ← 容器应用防护
1
2
3
4
5
6

# 速率限制(Rate Limiting)

WAF 内置请求频率限制,可以精细控制:

示例规则:
  条件:同一 IP,5 分钟内请求 /api/login 超过 20 次
  动作:Block,持续 5 分钟
1
2
3

可以按以下维度限速:

  • IP 地址

  • IP + URI 路径组合

  • HTTP Header 中的某个值(如 User-Agent)

  • 地理位置

# 日志 & 可观测性

  • 所有请求日志可以投递到 S3 / CloudWatch Logs / Kinesis Firehose

  • 日志包含:匹配规则、请求来源 IP、URI、Header、处理动作等

  • 可配合 AWS Security Hub 做统一安全事件管理

  • WAF Dashboard 提供实时流量图、Top IP、Top 规则命中等

# 定价模型

计费项 单价
Web ACL $5 / 月
每条规则 $1 / 月
每 100 万次请求 $0.60
Bot Control(基础) 额外 $10 / 月 + $0.60 / 百万请求
Bot Control(高级) 额外 $30 / 月 + $1.50 / 百万请求

托管规则组本身不额外收费(Bot Control、ATP、ACFP 除外),但 Web ACL 和规则条数计费。

# AWS WAF 和 AWS Shield 的关系

AWS 有两层 DDoS 防护,经常一起提:

AWS WAF AWS Shield
防护层 七层(应用层) 三四层(网络层)+ 七层
防御对象 SQL 注入、XSS、CC 攻击等 网络层 DDoS 洪水攻击
Shield Standard 不包含 WAF 免费,自动启用
Shield Advanced 需单独购买 WAF $3000/月,包含 WAF 免费额度

实际生产环境通常组合使用:Shield 挡网络层洪水,WAF 挡应用层攻击。

# AWS Shield

AWS Shield (opens new window) 是 AWS 提供的 DDoS 防护服务,专门抵御针对网络层和传输层的分布式拒绝服务攻击,保护运行在 AWS 上的应用不因流量洪泛而瘫痪。

# Shield 的两个版本

1. Shield Standard(免费)

  • 所有 AWS 用户自动启用,无需配置,无需付费

  • 防御最常见的三、四层 DDoS 攻击

  • 保护对象:CloudFront、Route 53、Global Accelerator

  • 提供基础流量异常检测,自动缓解攻击

  • 没有通知、没有报告、没有人工介入

2. Shield Advanced(付费)

  • $3000 / 月,按年订阅(最少 1 年)

  • 在 Standard 基础上全面增强,覆盖更多服务和更复杂的攻击

什么是 DDoS 攻击

DDoS(Distributed Denial of Service,分布式拒绝服务)攻击的目标只有一个:让你的服务无法正常响应合法用户的请求。

DDoS = 用海量流量或请求把你的服务淹死,让正常用户无法访问。攻击来自全球分布的肉鸡,靠封 IP 无法解决,需要专门的流量清洗和防护设备来应对。

"肉鸡" 是指被黑客入侵并控制的普通人的电脑、路由器、摄像头等设备,它们组成僵尸网络(Botnet),统一听从攻击者指挥。

# 可以防御什么

Shield 和 WAF 防护的层级不同:

七层(应用层)   HTTP Flood、CC 攻击、SQL 注入     ← WAF 负责
四层(传输层)   TCP SYN Flood、UDP Flood        ← Shield 负责
三层(网络层)   ICMP Flood、IP 碎片攻击          ← Shield 负责
1
2
3
攻击类型 原理 Shield 应对方式
SYN Flood 海量 TCP SYN 包耗尽服务器连接表 检测异常 SYN/ACK 比例,丢弃恶意包
UDP Flood 大量 UDP 包打满带宽 流量清洗,过滤异常 UDP 流量
ICMP Flood 大量 Ping 请求耗尽资源 速率限制,丢弃超额 ICMP 包
IP 碎片攻击 发送大量畸形 IP 分片包耗尽重组资源 检测异常分片特征,丢弃恶意分片
DNS 放大攻击 伪造源 IP 向 DNS 服务器发请求,让响应流量打向受害者 Route 53 层自动识别并缓解
NTP 放大攻击 利用 NTP 协议的响应放大效果淹没目标 流量清洗,过滤放大流量
Smurf 攻击 伪造 ICMP 广播包,让网络内所有设备回包给受害者 识别广播特征,过滤异常 ICMP
攻击类型 原理 Shield Advanced 应对方式
HTTP Flood(CC 攻击) 海量 HTTP 请求压垮应用服务器 配合 WAF 联动,自动生成拦截规则
SSL 滥用攻击 大量 SSL 握手请求耗尽服务器 CPU 在 CloudFront 层卸载 SSL,分散压力
慢速攻击(Slowloris) 保持大量半开连接不释放,耗尽连接池 检测异常连接保持时间,强制断开
大规模容量耗尽攻击 超大流量直接打满带宽 AWS 骨干网吸收,DRT 团队人工介入

# 适合开启 Shield Advanced 的场景

  • 金融、电商、游戏等高价值目标,DDoS 风险高

  • 有明确的业务连续性要求(SLA 严格)

  • 已经遭受过 DDoS 攻击

  • 希望有 AWS 专家团队兜底

# AWS AppSync

AWS AppSync (opens new window) 是亚马逊云服务提供的一种全托管 GraphQL 服务,让开发者可以轻松构建可扩展的 API,实现应用与各种数据源的安全连接与实时数据同步。

# 核心概念

1. GraphQL API

AppSync 以 GraphQL 作为 API 层,客户端通过 Query(查询)、Mutation(变更)、Subscription(订阅)三种操作与数据交互,只获取所需字段,避免过度请求。

2. 数据源(Data Sources)

AppSync 支持多种后端数据源直连:

数据源说明
Amazon DynamoDB最常用,NoSQL 数据库
AWS Lambda自定义逻辑,任意后端
Amazon RDS (Aurora Serverless)关系型数据库
Amazon OpenSearch搜索与分析
HTTP Endpoint任意第三方 REST API
EventBridge事件驱动架构集成
None本地解析(纯前端逻辑)

3. Resolver(解析器)

Resolver 是连接 GraphQL 字段与数据源的桥梁,分为两种:

  • VTL Resolver:使用 Apache Velocity 模板语言,性能高,无冷启动

  • JavaScript Resolver(推荐):使用 JS 编写,更易维护,AppSync Functions 支持复用

4. 实时订阅

基于 WebSocket,客户端可以订阅数据变更,AppSync 自动推送更新,无需自建 WebSocket 服务器。

5. 认证方式

认证方式适用场景
Amazon Cognito User Pools用户登录认证(最常见)
API Key开发/测试,或公开 API
IAM服务间调用、后端访问
Lambda Authorizer自定义认证逻辑
OpenID Connect第三方身份提供商

# 典型架构

客户端(Web/Mobile)
      │
      │ GraphQL (HTTPS / WebSocket)
      ▼
  AWS AppSync
      │
  ┌───┴────────────────────┐
  │                        │
DynamoDB              AWS Lambda
                           │
                      其他服务/DB
1
2
3
4
5
6
7
8
9
10
11

# 主要优势

  • 无服务器:全托管,自动扩缩容,无需管理基础设施

  • 实时能力:内置 WebSocket 订阅,开箱即用

  • 离线支持:配合 AWS Amplify,支持客户端数据缓存与冲突解决

  • 细粒度授权:字段级别的权限控制

  • 多数据源合并:一个 GraphQL 请求可聚合多个数据源的结果

# 常见使用场景

  • 聊天/协作应用 — 利用实时订阅推送消息

  • 移动应用后端 — 灵活查询,减少流量消耗

  • 数据聚合网关 — 统一多个微服务的数据接口

  • IoT 数据推送 — 设备状态实时同步到前端

# GraphQL

GraphQL (opens new window) 是由 Facebook(现 Meta)于 2012 年内部开发、2015 年开源的一种 API 查询语言,同时也是执行这些查询的运行时。它并非数据库查询语言,而是定义客户端与服务端如何通信的一套规范。

# 核心思想

传统 REST API 由服务端决定返回什么数据;GraphQL 则反过来,由客户端精确声明需要什么字段,服务端按需返回,不多不少。

# 三种操作类型

操作关键字作用类比 REST
查询query读取数据GET
变更mutation写入/修改/删除数据POST / PUT / DELETE
订阅subscription实时监听数据变化WebSocket

# Schema —— GraphQL 的核心契约

Schema 是用 SDL(Schema Definition Language)描述的类型系统,是前后端之间的唯一契约。

# Resolver —— 真正执行数据获取的地方

每个字段背后都有一个 Resolver 函数,负责从数据库/微服务/缓存取数据:

const resolvers = {
  Query: {
    user: (parent, { id }, context) => {
      return context.db.findUser(id);
    },
  },
  User: {
    posts: (user, args, context) => {
      return context.db.getPostsByUser(user.id);
    },
  },
};
1
2
3
4
5
6
7
8
9
10
11
12

# N+1 问题与 DataLoader

GraphQL 的嵌套查询容易触发 N+1 数据库查询(查 1 个列表 + 每条记录再查 1 次关联数据)。标准解法是 DataLoader,将多次请求合并为一次批量查询:

const userLoader = new DataLoader(async (ids) => {
  return db.getUsersByIds(ids); // 一次查所有
});
1
2
3

# GraphQL 和 REST 的区别

维度GraphQLREST
请求方式单端点,按需取字段多端点,固定返回结构
实时推送原生支持 Subscription需额外集成 WebSocket
数据聚合单次请求多数据源通常需多次请求
学习曲线需了解 GraphQL相对熟悉
适用场景复杂数据关系、实时应用简单 CRUD、公开 API

# 生态系统

类别工具
服务端框架Apollo Server、GraphQL Yoga、Pothos、Nexus
客户端Apollo Client、urql、React Query + graphql-request
代码生成GraphQL Code Generator
Schema 管理Apollo Studio、GraphQL Inspector
云服务AWS AppSync、Hasura、Fauna
IDE 工具GraphiQL、Apollo Sandbox、Insomnia

# 适合/不适合 GraphQL 的场景

1. 适合:

  • 前端多样(Web/iOS/Android),数据需求各不相同

  • 数据关系复杂,需要嵌套查询

  • 需要实时推送(聊天、通知、协作)

  • 快速迭代,前端不想等后端改接口

2. 不适合:

  • 简单的 CRUD,REST 足够

  • 文件上传为主的场景

  • 对 HTTP 缓存依赖很强的公开 API

# 学习资源

# Amazon CloudWatch

Amazon CloudWatch (opens new window) 是 AWS 提供的全托管监控与可观测性服务,覆盖指标收集、日志管理、告警通知、仪表盘可视化以及自动化响应,是 AWS 生态中运维与 DevOps 的核心基础设施。

# 核心组成模块

CloudWatch 并非单一功能,而是一套完整的可观测性平台,由以下几个子系统构成:

1. Metrics(指标)

自动收集 AWS 服务产生的性能数据(如 EC2 的 CPU 使用率、Lambda 的调用次数),也支持推送自定义指标。

  • 默认保留期:15 个月

  • 分辨率:标准 1 分钟,高精度可达 1 秒

  • 支持 Metric Math:对多个指标做数学运算,生成派生指标

2. Logs(日志)

集中收集、存储、检索来自各 AWS 服务或自定义应用的日志。核心概念如下:

概念说明
Log Group日志组,按应用/服务划分,设置保留策略
Log Stream日志流,同一来源的连续日志序列
Log Event单条日志记录(时间戳 + 消息体)
Insights用 SQL-like 语法交互式查询日志
Live Tail实时流式查看日志,类似 tail -f

3. Alarms(告警)

基于指标阈值或异常检测自动触发动作。

告警状态含义
OK指标在正常范围内
ALARM指标超出阈值,触发动作
INSUFFICIENT_DATA数据不足,无法判断

告警可触发的动作:发送 SNS 通知、执行 Auto Scaling、调用 Lambda、创建 OpsItem 等。

4. Dashboards(仪表盘)

跨 Region、跨账号的可视化监控面板,支持折线图、数值、告警状态、日志查询结果等多种组件,可共享给团队。

5. CloudWatch Logs Insights

用结构化查询语言分析海量日志:

fields @timestamp, @message
| filter @message like /ERROR/
| sort @timestamp desc
| limit 20
1
2
3
4

6. CloudWatch Container Insights

专为容器化工作负载设计,自动采集 ECS、EKS、Kubernetes 的 CPU、内存、网络、磁盘指标,并提供预置仪表盘。

7. CloudWatch Application Signals

2024 年 GA,基于 OpenTelemetry 自动检测应用,提供服务级别的健康度视图(SLO/SLI),无需手动埋点。

# 数据采集方式

方式适用场景
原生集成EC2、Lambda、RDS 等 AWS 服务自动上报
CloudWatch Agent安装在 EC2 / 本地服务器,采集系统指标和自定义日志
PutMetricData API代码中推送自定义业务指标
Embedded Metric Format (EMF)日志中嵌入结构化指标,自动提取为 Metric
AWS X-Ray 集成分布式链路追踪数据关联到 CloudWatch
Kinesis Data Firehose大规模日志流式传输到 CloudWatch

# 告警与通知架构

CloudWatch Metric
      │
      │ 超出阈值
      ▼
  CloudWatch Alarm
      │
  ┌───┴──────────────────────────┐
  │              │               │
Amazon SNS   Auto Scaling    AWS Lambda
  │
 ┌┴──────────────┐
Email / Slack / PagerDuty / SMS
1
2
3
4
5
6
7
8
9
10
11
12

# 可观测性三支柱

现代可观测性由三个支柱组成,CloudWatch 全部覆盖:

支柱CloudWatch 对应功能说明
Metrics(指标)CloudWatch Metrics数值型时序数据,反映系统状态
Logs(日志)CloudWatch Logs离散事件记录,用于排查问题
Traces(链路追踪)AWS X-Ray + CloudWatch请求在分布式系统中的完整路径

# 与其他 AWS 服务的集成

AWS 服务集成方式
EC2自动上报 CPU/网络/磁盘指标,Agent 采集内存和进程
Lambda自动记录调用次数、错误率、执行时长、并发数
RDS / Aurora数据库性能指标、慢查询日志
ECS / EKSContainer Insights 容器级指标
API Gateway请求量、延迟、4xx/5xx 错误率
CloudTrail审计日志可发送到 CloudWatch Logs
EventBridgeCloudWatch Alarm 状态变化触发事件
Systems ManagerOpsCenter 接收 CloudWatch 告警创建的 OpsItem

# Amazon S3

Amazon S3 (opens new window)(Simple Storage Service)是 AWS 提供的对象存储服务,于 2006 年上线,是 AWS 最早也是最核心的服务之一。它提供近乎无限的存储容量、高达 99.999999999%(11个9)的数据持久性,广泛用于备份、静态网站托管、数据湖、CDN 源站等场景。

# 核心概念

1. Bucket(桶)

存储对象的顶级容器,名称全球唯一,创建时绑定 Region。一个账号最多 100 个 Bucket(可申请提高)。

2. Object(对象)

S3 存储的基本单元,由以下部分组成:

组成部分说明
Key对象的唯一标识符,即"路径"(如 images/logo.png)
Value实际数据内容,最大 5 TB
Metadata键值对形式的描述信息(系统元数据 + 用户自定义)
Version ID开启版本控制后自动生成
ETag对象内容的 MD5 哈希,用于完整性校验

3. 前缀与 "目录"

S3 本质上是扁平的键值存储,没有真正的目录结构。images/2024/logo.png 中的 / 只是 Key 的一部分,控制台会模拟成目录显示。

# 存储类型

存储类型适用场景可用性最短存储期
S3 Standard频繁访问的热数据99.99%无
S3 Intelligent-Tiering访问模式不可预测99.9%无
S3 Standard-IA不频繁访问,但需快速取回99.9%30 天
S3 One Zone-IA不频繁访问,可接受单 AZ 风险99.5%30 天
S3 Glacier Instant Retrieval归档,毫秒级取回99.9%90 天
S3 Glacier Flexible Retrieval归档,分钟到小时级取回99.99%90 天
S3 Glacier Deep Archive长期冷归档,12 小时内取回99.99%180 天

# 数据管理功能

1. 生命周期规则(Lifecycle Rules)

自动按时间将对象转换存储类型或删除,常见配置:

上传 → Standard
  ↓ 30天后
Standard-IA
  ↓ 90天后
Glacier Flexible Retrieval
  ↓ 365天后
永久删除
1
2
3
4
5
6
7

2. 版本控制(Versioning)

开启后每次上传同名对象会生成新版本,删除操作只添加 "删除标记" 而非真正删除,可随时恢复历史版本。

3. 复制(Replication)

  • CRR(Cross-Region Replication):跨区域复制,用于灾备、合规、就近访问

  • SRR(Same-Region Replication):同区域复制,用于日志聚合、测试环境同步

4. Object Lock

基于 WORM(Write Once Read Many)模型,防止对象被删除或覆盖,满足合规要求。

# 访问控制

机制说明推荐程度
Bucket PolicyJSON 格式的资源策略,控制谁能访问⭐⭐⭐⭐⭐ 首选
IAM Policy附加到用户/角色,控制能访问什么⭐⭐⭐⭐⭐ 首选
ACL(访问控制列表)对象/桶级别的传统权限,已不推荐⭐⭐ 遗留用途
Block Public Access桶/账号级别的公开访问开关,默认全部开启必须了解
Presigned URL临时授权 URL,可在有效期内让任何人访问私有对象常用

# 数据加密

默认情况下,所有新对象会自动启用 SSE-S3 加密(2023 年起强制默认开启)。

加密方式说明
SSE-S3AWS 托管密钥,自动加密,零配置
SSE-KMS使用 AWS KMS 密钥,支持审计和自定义密钥策略
SSE-C客户自带密钥,AWS 不存储密钥
客户端加密数据上传前在客户端加密,AWS 只存储密文

# 事件通知与集成

S3 支持在对象创建、删除、复制等事件发生时触发通知:

目标服务典型用途
AWS Lambda图片压缩、文件解析、ETL 触发
Amazon SQS异步任务队列
Amazon SNS告警通知
Amazon EventBridge复杂事件路由,支持更多目标

# 性能特性

  • 请求速率:每个前缀每秒支持 3,500 次 PUT/COPY/POST/DELETE 和 5,500 次 GET/HEAD

  • 多部分上传(Multipart Upload):文件 > 100 MB 推荐使用,支持并行上传、断点续传

  • S3 Transfer Acceleration:通过 CloudFront 边缘节点加速跨地域上传

  • 强一致性:2020 年起所有 GET/PUT/DELETE 操作均为强一致性(最终一致性已成历史)

# 静态网站托管

S3 可以直接托管静态网站,配置极简:

  1. 开启 Bucket 的静态网站托管

  2. 设置索引文档(index.html)和错误文档

  3. 配置公开读取 Bucket Policy

  4. 可选:绑定 CloudFront + Route 53 + ACM 实现自定义域名 + HTTPS

# AWS ElastiCache

AWS ElastiCache (opens new window) 是 AWS 提供的全托管内存缓存服务,让开发者无需自行搭建和维护缓存基础设施,直接使用高性能的内存数据库来加速应用响应速度、降低后端数据库压力。

# 支持的缓存引擎

ElastiCache 目前支持两种主流缓存引擎:

维度RedisMemcached
定位功能丰富的内存数据结构存储简单高效的纯缓存
数据结构String、Hash、List、Set、Sorted Set、Stream 等仅 String
持久化支持 RDB 快照 + AOF 日志不支持
高可用支持主从复制 + 自动故障转移不支持复制
集群模式支持分片集群(最多 500 个节点)支持多节点水平扩展
发布/订阅支持 Pub/Sub不支持
事务支持不支持
Lua 脚本支持不支持
多线程Redis 6+ 支持 I/O 多线程原生多线程
适合场景功能复杂、需持久化或高可用,比如缓存、会话管理、排行榜、消息队列、实时分析简单缓存、极致性能、多线程扩展,纯粹的对象缓存,无需持久化或复杂数据结构

实际项目中 Redis 是绝大多数团队的首选,Memcached 只在极少数追求极简的场景下使用。

# 核心架构概念

1. 节点(Node)

ElastiCache 的基本计算单元,即一个运行缓存引擎的实例,有多种规格(从 cache.t4g.micro 到 cache.r7g.16xlarge)。

2. 集群(Cluster)

一组节点的集合。Redis 集群与 Memcached 集群结构不同:

  • Redis 集群模式(Cluster Mode Enabled):数据按 Key 哈希分布在多个 Shard,每个 Shard 有一个 Primary 和若干 Replica。

  • Redis 非集群模式(单 Shard):适合数据量不大但需要高可用的场景。

3. 副本组(Replication Group)

Redis 特有,包含一个 Primary 节点和最多 5 个 Read Replica,提供读写分离和自动故障转移(Multi-AZ)。

# 高可用与故障转移

功能说明
Multi-AZPrimary 和 Replica 分布在不同可用区,Primary 故障时自动提升 Replica
自动故障转移Primary 不可用时,ElastiCache 自动将 Replica 提升为新 Primary,通常在 1 分钟内完成
读写分离写操作走 Primary,读操作可分发到 Read Replica,提升读吞吐
Global DatastoreRedis 支持跨 Region 的全局复制,实现异地灾备和就近读取

# 数据持久化(Redis)

方式说明适用场景
RDB(快照)定时将内存数据快照写入磁盘可接受少量数据丢失的场景
AOF(追加日志)每次写操作都追加到日志文件数据可靠性要求高的场景
不持久化纯内存,重启后数据丢失纯缓存,数据可从数据库重建

# 安全机制

机制说明
VPC 隔离ElastiCache 部署在 VPC 内,不暴露公网
安全组控制哪些 EC2/Lambda 可以访问缓存节点
传输加密(TLS)客户端与节点之间的数据传输加密
静态加密数据在磁盘上加密存储(持久化数据)
AUTH / RBACRedis 支持密码认证和基于角色的访问控制

# ElastiCache Serverless

2023 年推出的新模式,与传统节点模式的区别:

维度传统节点模式Serverless 模式
容量规划需预选节点规格无需规划,自动扩缩
扩容方式手动或定时扩容秒级自动扩缩
计费方式按节点小时数按 ECU 和数据存储量
适用场景流量稳定、成本可预测流量波动大、不想管容量

# Amazon Aurora

Amazon Aurora (opens new window) 是 AWS 自研的云原生关系型数据库,兼容 MySQL 和 PostgreSQL 协议,在保持与这两种数据库高度兼容的同时,在性能、可用性和扩展性上做了大幅提升。

# 核心特性

1. 性能

  • 相比标准 MySQL 最高提升 5 倍性能

  • 相比标准 PostgreSQL 最高提升 3 倍性能

  • 底层存储与计算分离,I/O 路径经过深度优化

2. 持久性

  • 数据自动跨 3 个可用区(AZ) 存储 6 份副本

  • 可容忍 2 个副本故障仍能正常写入,3 个副本故障仍能正常读取

  • 持久性达 99.999999999%(11 个 9)

3. 高可用

  • 主节点故障后通常在 30 秒内完成自动故障转移

  • 支持最多 15 个 Read Replica(MySQL RDS 只支持 5 个)

# 存储架构(与传统 RDS 的核心区别)

这是 Aurora 最与众不同的设计:

传统 RDS:
  计算层(数据库引擎)
       ↕ 完整数据页
  存储层(EBS 卷)

Aurora:
  计算层(数据库引擎)
       ↕ 只传 Redo Log(日志)
  分布式存储层(Aurora Storage)
  ↙    ↓    ↘    ↙    ↓   ↘
 AZ1  AZ1  AZ2  AZ2  AZ3  AZ3
(6 份副本,跨 3 个 AZ)
1
2
3
4
5
6
7
8
9
10
11
12

Aurora 的计算层只向存储层发送 Redo Log,而不是完整的数据页,大幅减少了网络 I/O,这是其性能提升的核心原因。

# Aurora MySQL 和 Aurora PostgreSQL 的区别

维度Aurora MySQLAurora PostgreSQL
兼容版本MySQL 5.7 / 8.0PostgreSQL 13 / 14 / 15 / 16
迁移难度低,大多数应用无需改代码低,语法高度兼容
适用场景Web 应用、CMS、电商复杂查询、GIS、金融系统
全文搜索支持支持(更强大)
JSON 支持支持支持(更原生)

# Amazon RDS

Amazon RDS (opens new window)(Relational Database Service)是 AWS 提供的全托管关系型数据库服务,让你无需自己在 EC2 上安装、配置、维护数据库,AWS 负责底层的硬件、操作系统、数据库软件的安装与打补丁、备份、故障检测等运维工作。

# 支持的数据库引擎

引擎说明
MySQL最流行的开源关系型数据库
PostgreSQL功能最强大的开源关系型数据库
MariaDBMySQL 的社区分支,兼容性高
Oracle企业级商业数据库,需自带许可或按小时付费
SQL Server微软商业数据库,支持多个版本(Express/Standard/Enterprise)
Amazon AuroraAWS 自研,属于同一家族,单独介绍

# 核心功能

1. Multi-AZ 部署(高可用)

RDS 的高可用方案,Primary 实例和 Standby 实例分布在不同可用区,数据同步复制。Primary 故障时自动切换到 Standby,通常在 1–2 分钟内完成。

        应用层
          │
          │(单一 DNS 端点,故障时自动切换)
          ▼
    Primary 实例 (AZ-A)
          │ 同步复制
          ▼
    Standby 实例 (AZ-B)
    (不对外提供读服务,纯备用)
1
2
3
4
5
6
7
8
9

Standby 实例不能用来分担读请求,仅作故障转移用。这是 RDS Multi-AZ 和 Aurora Read Replica 的重要区别。

2. Read Replica(读副本)

用于分担读压力,异步复制,最多支持 5 个 Read Replica,可跨 Region 部署。

        应用层
       ↙    ↘
   写请求    读请求
     ↓         ↓
   Primary   Read Replica × 5
1
2
3
4
5

3. 自动备份与 PITR

  • 每天自动备份,保留 0–35 天

  • 支持时间点恢复(PITR),可恢复到保留期内任意时间点

  • 事务日志每 5 分钟上传一次到 S3

4. 参数组(Parameter Groups)

数据库引擎的配置文件,控制连接数、缓冲区大小、日志级别等参数,类似于 my.cnf / postgresql.conf。

5. 维护窗口

RDS 会在你指定的时间窗口内进行软件补丁、版本升级等维护操作,避免在业务高峰期影响服务。

# RDS 和 Aurora 的核心区别

维度RDS(MySQL/PostgreSQL 等)Aurora
底层架构标准开源数据库引擎 + EBS 存储AWS 自研存储层,计算与存储分离
存储副本数单 AZ 单份(Multi-AZ 才有跨 AZ 副本)自动跨 3 个 AZ 存 6 份副本
存储上限最高 64 TB自动扩展,最高 128 TB
性能原生引擎性能MySQL 最高 5x,PostgreSQL 最高 3x
Read Replica 数量最多 5 个最多 15 个
故障转移时间Multi-AZ 约 1–2 分钟约 30 秒
Standby 可读❌ Multi-AZ Standby 不可读✅ 所有 Replica 均可读
Serverless❌✅(v2)
跨 Region 复制需手动配置 Read Replica原生 Global Database
回溯功能❌✅(Aurora MySQL)
克隆❌✅(写时复制,近乎即时)
价格较低略高(实例约贵 20%,存储也略贵)
引擎选择MySQL / PostgreSQL / MariaDB / Oracle / SQL Server仅 MySQL 兼容 / PostgreSQL 兼容
适用场景预算有限、Oracle/SQL Server 迁移、简单业务高可用要求高、流量大、需要 Serverless

# 如何选择

需要 Oracle 或 SQL Server?
  └─ 是 → RDS(Aurora 不支持这两种引擎)

只用 MySQL / PostgreSQL?
  ├─ 预算有限 / 流量小 / 简单业务 → RDS
  └─ 高可用要求高 / 流量大 / 需要 Serverless → Aurora
1
2
3
4
5
6

# Amazon SQS

Amazon SQS (opens new window)(Simple Queue Service)是 AWS 提供的全托管消息队列服务,于 2006 年上线,是 AWS 最早的服务之一。它允许不同系统组件之间通过队列异步传递消息,实现解耦、削峰填谷和容错。

# 消息队列解决什么问题

没有队列时,服务之间直接调用:

用户下单 → 订单服务 → 直接调用库存服务
                 → 直接调用物流服务
                 → 直接调用通知服务
1
2
3

任何一个下游服务挂掉,整个链路就断了。

引入 SQS 后:

用户下单 → 订单服务 → SQS 队列 → 库存服务(独立消费)
                            → 物流服务(独立消费)
                            → 通知服务(独立消费)
1
2
3

订单服务只管把消息扔进队列,下游服务各自按节奏消费,互不影响。

# 两种队列类型

这是 SQS 最重要的基础概念:

维度标准队列(Standard)FIFO 队列
消息顺序尽力而为,不保证严格顺序严格先进先出(First-In-First-Out)
消息投递至少一次(可能重复)恰好一次(不会重复)
吞吐量近乎无限最高 3,000 条/秒(开启批处理)
去重需消费者自行处理幂等内置 5 分钟去重窗口
适用场景高吞吐、对顺序和重复不敏感金融交易、订单处理、严格顺序业务
价格较低略高

# 核心参数

理解这些参数是用好 SQS 的关键:

参数说明默认值最大值
消息保留期消息在队列中最长存活时间,超时自动删除4 天14 天
可见性超时消息被取走后对其他消费者隐藏的时长,防止重复处理30 秒12 小时
消息大小单条消息的最大体积—256 KB
延迟投递消息发送后延迟多久才对消费者可见0 秒15 分钟
长轮询等待时间消费者轮询时最长等待时间,减少空请求0 秒(短轮询)20 秒

# 死信队列

消息处理失败超过一定次数后,自动转移到死信队列(Dead Letter Queue,DLQ),避免 "毒消息" 反复阻塞主队列:

主队列
  │
  │ 消费失败,重试
  │ 达到最大接收次数(maxReceiveCount)
  ▼
死信队列(DLQ)← 人工排查 / 告警
1
2
3
4
5
6

DLQ 本身也是一个普通的 SQS 队列,Standard 队列的 DLQ 必须也是 Standard,FIFO 的 DLQ 必须也是 FIFO。

# 短轮询 vs 长轮询

消费者从 SQS 取消息有两种方式:

方式行为问题
短轮询(Short Polling)立即返回,队列为空也返回空响应大量空请求,浪费费用
长轮询(Long Polling)队列为空时等待最多 20 秒再返回减少空请求,降低费用,推荐

实际使用中应始终开启长轮询(WaitTimeSeconds 设为 20)。

# 与其他 AWS 服务的集成

集成服务典型用途
AWS LambdaLambda 直接以 SQS 为触发器,自动拉取并处理消息(Event Source Mapping)
Amazon SNSSNS 广播消息到多个 SQS 队列(Fan-out 模式)
Amazon S3S3 事件通知发送到 SQS,触发后续处理
Amazon EC2 / ECS消费者跑在 EC2/容器上,轮询 SQS 处理任务
AWS EventBridgeEventBridge 规则将事件路由到 SQS
Amazon CloudWatch监控队列深度,深度过高时触发 Auto Scaling

# Fan-out 模式(SNS + SQS 组合)

SQS 单独使用时,一条消息只能被一个消费者处理。如果需要同一条消息被多个服务处理,需要结合 SNS:

        生产者
           │
           ▼
       Amazon SNS
      ↙    ↓    ↘
  SQS-A  SQS-B  SQS-C
    │      │      │
  服务A   服务B   服务C
1
2
3
4
5
6
7
8

每个 SQS 队列独立消费同一条消息,互不影响,这是 AWS 上最经典的消息分发架构。

# SQS 扩展消息(超过 256 KB)

单条消息限制 256 KB,如果消息体更大,有两种方案:

  • S3 + SQS:把消息内容存到 S3,队列里只传 S3 对象的引用

  • SQS Extended Client Library:AWS 官方提供的 Java/Python SDK 扩展,自动处理大消息的 S3 存储与引用

# 安全机制

机制说明
IAM 策略控制谁可以发送/接收/删除消息
队列访问策略(Resource Policy)允许其他账号或 AWS 服务访问队列
传输加密HTTPS 端点,传输层加密
静态加密(SSE)使用 AWS KMS 或 SQS 托管密钥加密消息内容
VPC 端点通过 PrivateLink 在 VPC 内部访问 SQS,不经公网

# 与同类服务对比

维度Amazon SQSAmazon SNSAmazon EventBridgeKafka(MSK)
类型消息队列(点对点)发布订阅(广播)事件总线(路由)流式消息平台
消息持久化✅(最多 14 天)❌(推送失败即丢)❌✅(可长期保留)
消费模式拉取(Pull)推送(Push)推送(Push)拉取(Pull)
消息回放❌❌❌✅
吞吐量极高极高高极高
适用场景异步任务、削峰填谷通知广播、Fan-out服务间事件路由日志流、实时数据管道

# Amazon ECS

Amazon ECS (opens new window)(Elastic Container Service)是 AWS 提供的全托管容器编排服务,让你可以在 AWS 上运行、管理和扩展 Docker 容器,无需自己搭建和维护 Kubernetes 或其他编排系统。

# 核心概念

ECS 有一套自己的概念体系,理清这些是理解 ECS 的基础:

Cluster(集群)
  └── Service(服务)
        └── Task(任务)
              └── Container(容器)× N
1
2
3
4
概念类比说明
Cluster机房ECS 的顶层资源边界,一个或多个服务跑在同一个集群内
Task Definition配方 / Dockerfile描述容器如何运行的模板:镜像、CPU/内存、环境变量、端口映射等
Task一次运行实例Task Definition 的一次具体运行,包含一个或多个容器
Service进程守护确保指定数量的 Task 持续运行,负责滚动更新、故障重启、负载均衡注册
Container容器实际运行的 Docker 容器,一个 Task 可包含多个 Container

# 两种启动类型

这是 ECS 最重要的选择,决定你的容器跑在什么基础设施上:

维度Fargate(推荐)EC2
基础设施AWS 全托管,无需管理服务器你管理 EC2 实例
容量规划无需规划,按 Task 分配 CPU/内存需要规划实例数量和类型
扩缩容按 Task 数量扩缩需同时扩缩 EC2 和 Task
运维成本极低需维护 EC2 系统补丁、ECS Agent 等
计费方式按 Task 实际使用的 vCPU 和内存按 EC2 实例小时数
成本略高可通过 Reserved/Spot 节省更多
适用场景大多数场景,快速上手需要 GPU、特定实例类型、极致成本优化
容器密度AWS 控制可在单机上运行更多容器,提升资源利用率

实际项目中 Fargate 是绝大多数团队的首选,EC2 启动类型主要用于有特殊硬件需求或极致成本优化的场景。

# Task Definition

Task Definition 是 ECS 的核心配置文件,类似 docker-compose.yml,主要定义:

{
  "family": "my-web-app",
  "cpu": "512",
  "memory": "1024",
  "containerDefinitions": [
    {
      "name": "web",
      "image": "nginx:latest",
      "portMappings": [{ "containerPort": 80 }],
      "environment": [
        { "name": "ENV", "value": "production" }
      ],
      "secrets": [
        { "name": "DB_PASSWORD", "valueFrom": "arn:aws:secretsmanager:..." }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": { "awslogs-group": "/ecs/my-app" }
      }
    }
  ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

Task Definition 是版本化的,每次修改都会生成新的版本号(revision),旧版本继续存在,方便回滚。

# Service 的核心能力

1. 滚动更新(Rolling Update)

更新 Task Definition 版本时,ECS Service 自动按比例逐步替换旧 Task,保证服务不中断。

2. 自动扩缩容(Auto Scaling)

基于 CloudWatch 指标(CPU 使用率、内存、请求数等)自动调整 Task 数量。

3. 负载均衡集成

Service 可自动将 Task 注册到 ALB/NLB 目标组,Task 启动时自动注册,停止时自动注销。

# 网络模式

模式说明适用场景
awsvpc(推荐)每个 Task 分配独立 ENI 和私有 IP,与 EC2 实例完全隔离Fargate 必须使用;EC2 推荐
bridgeDocker 默认网桥网络,通过端口映射暴露服务EC2 启动类型,旧应用迁移
host容器直接使用宿主机网络,无端口映射极致网络性能场景
none无网络,容器完全隔离离线批处理任务

# 日志与监控

功能说明
awslogs 日志驱动容器标准输出自动发送到 CloudWatch Logs
Container Insights自动采集 Task/容器级别的 CPU、内存、网络指标,提供预置仪表盘
AWS X-Ray在容器内集成 X-Ray SDK,实现分布式链路追踪
ECS Exec直接进入运行中的容器内部排查问题(类似 kubectl exec)

# 安全机制

机制说明
Task IAM Role每个 Task 分配独立 IAM Role,容器内代码以该角色身份调用 AWS API,无需硬编码密钥
Task Execution RoleECS Agent 用来拉取镜像、写日志、读取 Secrets 的角色
Secrets Manager / SSM 集成敏感配置从 Secrets Manager 或 Parameter Store 注入容器,不写死在环境变量里
VPC 安全组awsvpc 模式下,每个 Task 可绑定独立安全组,精细控制网络访问
ECR 镜像扫描配合 Amazon ECR 对容器镜像做漏洞扫描

# 与 EKS 的对比

ECS 和 EKS(托管 Kubernetes)是 AWS 上最常见的容器编排选择:

维度Amazon ECSAmazon EKS
编排系统AWS 自研Kubernetes(标准)
学习成本低,概念简单高,需要了解 K8s 生态
运维复杂度低中(托管 Control Plane,但 Worker Node 仍需管理)
生态系统AWS 原生开源 K8s 生态,可移植
跨云迁移困难(AWS 专有)容易(K8s 标准)
Fargate 支持✅✅(但配置更复杂)
适用场景AWS 原生应用,团队 K8s 经验少已有 K8s 经验,需要跨云,复杂编排需求
价格仅计算资源费用额外收取 Control Plane 费用(约 $0.10/小时)

没有特别理由优先选 ECS,上手更快,AWS 原生集成更顺畅。如果团队已有 K8s 经验或有跨云需求,选 EKS。

上次更新时间: 2026年09月01日 18:18:43