CloudFront Function

过去,我们的 Web 应用程序代码的存放位置受到限制:

  1. Server-Side:此选项使我们的应用程序更加安全,因为它不易被篡改。但是,用户距离越远,就越容易受到网络性能延迟的影响。此外,我们还需要考虑源服务器上的负载并相应地管理资源。
  2. Client-Side:此选项使我们的 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 vs Lambda@Edge

对比 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

image-20191218195912286