编写函数代码(CloudFront Functions 编程模型)
借助 Amazon CloudFront 中的 CloudFront Functions,您可以在 JavaScript 中编写轻量级函数,以实现大规模、延迟敏感的 CDN 自定义。您的函数代码可以操作通过 CloudFront 的请求和响应、执行基本身份验证和授权、在边缘生成 HTTP 响应等。
以下主题可以帮助您为 CloudFront Functions 编写函数代码。
选择函数的目的
在编写函数代码之前,请确定函数的目的。CloudFront Functions 中的大多数函数都有以下目的之一。有关更多信息,请参阅与函数目的相对应的主题。
无论函数的目的如何,handler
都是任何函数的入口点。它采用一个名为 event
的参数,该参数通过 CloudFront 传递到函数中。event
是一个 JSON 对象,它包含 HTTP 请求的表示形式(以及响应,如果您的函数修改了 HTTP 响应)。有关 event
对象结构的更多信息,请参阅 CloudFront Functions 事件结构。
修改 HTTP 请求
您的函数可以修改 CloudFront 从查看器(客户端)收到的 HTTP 请求,然后将修改后的请求返回给 CloudFront 以继续处理。例如,您的函数代码可能会归一化缓存键或修改请求标头。
当您创建修改 HTTP 请求的函数时,请确保选择查看器请求事件类型。这意味着,在检查请求的对象是否在 CloudFront 缓存中之前,每当 CloudFront 收到来自查看器的请求时,该函数都会运行。
以下伪代码显示了修改 HTTP 请求的函数的结构。
function handler(event) { var request = event.request; // Modify the request object here. return request; }
该函数将修改后的 request
对象返回给 CloudFront。CloudFront 继续处理返回的请求,方法是检查 CloudFront 缓存是否存在缓存命中,并在必要时将请求发送到源。
有关 event
和 request
对象的结构的更多信息,请参阅 事件结构。
在边缘生成 HTTP 响应
您的函数可以在边缘生成 HTTP 响应并直接将其返回给查看器(客户端),而无需检查缓存的响应或由 CloudFront 进一步处理。例如,您的函数代码可能会将请求重定向到新的 URL,或者检查授权并将 401
或 403
响应返回至未经授权的请求。
创建生成 HTTP 响应的函数时,请确保选择查看器请求事件类型。这意味着,每当 CloudFront 收到来自查看器的请求时,在 CloudFront 对请求进行任何进一步处理之前,该函数都会运行。
以下伪代码显示了生成 HTTP 响应的函数的结构。
function handler(event) { var request = event.request; var response = ...; // Create the response object here, // using the request properties if needed. return response; }
该函数将 response
对象返回给 CloudFront,CloudFront 立即将其返回给查看器,而无需检查 CloudFront 缓存或向源发送请求。
有关 event
、request
和 response
对象的结构的更多信息,请参阅 事件结构。
当您使用 CloudFront Functions 生成 HTTP 响应时,不能包含响应正文。如果您需要在生成的 HTTP 响应中包含响应正文,请使用 Lambda@Edge。
修改 HTTP 响应
您的函数可以在 CloudFront 将 HTTP 响应发送到查看器(客户端)之前修改 HTTP 响应,无论响应来自 CloudFront 缓存还是源。例如,您的函数代码可能会添加或修改响应标头。
当您创建修改 HTTP 响应的函数时,请确保选择查看器响应事件类型。这意味着,该函数在 CloudFront 向查看器返回响应之前运行,无论响应来自 CloudFront 缓存还是源。
以下伪代码显示了修改 HTTP 响应的函数的结构。
function handler(event) { var request = event.request; var response = event.response; // Modify the response object here, // using the request properties if needed. return response; }
该函数将修改后的 response
对象返回给 CloudFront,CloudFront 会立即将其返回给查看器。
有关 event
和 response
对象的结构的更多信息,请参阅 事件结构。
使用 CloudFront Functions 修改 HTTP 响应时,无法更改或修改响应正文。如果您需要更改响应正文,请使用 Lambda@Edge。使用 Lambda@Edge,您可以将整个响应主体替换为新响应主体,或删除响应正文。但是,您不能修改响应正文中的单个属性。
有关为 CloudFront Functions 编写函数代码的更多信息,请参阅 事件结构、JavaScript 运行时功能 和 示例代码。