过去,我们的 Web 应用程序代码的存放位置受到限制:
Amazon CloudFront 为我们提供了第三个代码存放选项:通过 CloudFront Functions 和 Lambda@Edge 在边缘运行
| Client | Server | Edge Compute |
|---|---|---|
| 靠近用户 | 远离用户 | 靠近用户 |
| 安全性较低 | 安全性较高 | 安全性较高 |
| 源服务器卸载 | 源服务器负载 | 源服务器卸载 |
CloudFront Functions 是在 CloudFront 边缘节点运行的轻量级 JavaScript 函数,用于请求/响应的简单处理。
| 特点 | 说明 |
|---|---|
| 运行位置 | 边缘节点 (最靠近用户) |
| 语言 | JavaScript (ECMAScript 5.1) |
| 执行时间 | < 1 毫秒 |
| 内存 | 2 MB |
| 代码大小 | 最大 10 KB |
| 价格 | $0.10 / 百万次调用 |
| 场景 | 示例 |
|---|---|
| URL 重写 | /blog/123 → /blog.html?id=123 |
| 请求头操作 | 添加/删除/修改 Header |
| 重定向 | HTTP → HTTPS, www → 非 www |
| 缓存键规范化 | 统一 URL 大小写、排序参数 |
| 简单鉴权 | 检查 JWT token、API key |
| A/B 测试 | 根据 cookie 路由到不同版本 |
URL 重写:
function handler(event) {
var request = event.request;
var uri = request.uri;
// 添加 index.html
if (uri.endsWith('/')) {
request.uri += 'index.html';
} else if (!uri.includes('.')) {
request.uri += '/index.html';
}
return request;
}
添加安全头:
function handler(event) {
var response = event.response;
var headers = response.headers;
headers['strict-transport-security'] = { value: 'max-age=63072000' };
headers['x-content-type-options'] = { value: 'nosniff' };
headers['x-frame-options'] = { value: 'DENY' };
return response;
}
简单重定向:
function handler(event) {
var request = event.request;
var host = request.headers.host.value;
if (host.startsWith('www.')) {
return {
statusCode: 301,
statusDescription: 'Moved Permanently',
headers: {
location: { value: 'https://' + host.slice(4) + request.uri }
}
};
}
return request;
}
| 对比 | CloudFront Functions | Lambda@Edge |
|---|---|---|
| 语言 | JS (ES5.1) | Node.js, Python |
| 执行时间 | < 1ms | 最长 30s |
| 内存 | 2 MB | 128-10240 MB |
| 网络访问 | 无 | 有 |
| 价格 | $0.10/百万 | $0.60/百万 + 时长 |
| 适合场景 | 简单处理 | 复杂逻辑 |
| 事件 | 说明 |
|---|---|
| Viewer Request | 用户请求到达时 |
| Viewer Response | 返回给用户前 |
和Lambda@Edge不一样的是,CloudFront Functions 不支持 Origin Request/Response。
