AEM Edge函数 aem-edge-functions
AEM Edge Functions允许您在CDN层执行JavaScript,使数据处理更接近于最终用户。 这样可以减少延迟,并提供响应迅速的动态体验,而无需往返于您的来源地。
常见的用例包括:
- 根据地理位置、设备类型或用户属性等信息个性化内容
- 充当 CDN 与您的源站之间的中间件
- 在第三方API响应到达浏览器之前重新设置格式或聚合响应
- 使用从多个后端拼接的内容在边缘合成和提供服务器渲染的HTML
AEM Edge函数与Edge Delivery Services和AEM as a Cloud Service Java栈栈兼容。
主要优点 key-benefits
先决条件 prerequisites
- AEM as a Cloud Service环境
- Cloud Service环境的创作实例上的AEM管理员产品配置文件,或 Edge Delivery Services站点的Admin Console中的Cloud Manager部署管理员角色
- Node.js和npm
设置 setup
安装Adobe CLI install-adobe-cli
安装Adobe Developer CLI (aio):
npm install -g @adobe/aio-cli
安装AEM Edge Functions插件:
aio plugins install @adobe/aio-cli-plugin-aem-edge-functions
针对您的环境验证并配置插件:
aio login
aio aem edge-functions setup
setup命令会提示您登录,然后选择要在其上使用AEM Edge Functions的AEM环境。
克隆样板 boilerplate
将aem-edge-functions-boilerplate复制到您自己的存储库,然后安装依赖项:
npm install
创建您的第一个函数 create-your-function
AEM Edge功能服务在YAML配置文件中声明,并通过Cloud Manager配置管道进行部署。
1. 设置配置管道 configuration-pipeline
在创建边缘函数之前,请确保Cloud Manager中存在适用于您的环境的配置管道。 如果没有,则先创建配置管道。
aio aem rde:install -t env-config ./config部署配置,而不是通过配置管道进行部署。2. 声明Edge函数服务 declare-services
在配置目录中创建名为edgeFunctions.yaml的文件:
kind: "EdgeFunctions"
version: "1"
data:
services:
- name: first-function
- name: second-function
# Uncomment to enable secrets
# secrets:
# - key: API_TOKEN
# value: ${{ API_TOKEN_SECRET }}
该配置最多支持三项服务。 顶级键包括:
servicesname标识。configssecrets3. 添加CDN原点选择器规则 cdn-routing
通过原始选择器规则将CDN流量路由到它们来调用Edge函数。 将以下内容添加到您的cdn.yaml配置文件中(如果该文件不存在,请创建一个):
kind: 'CDN'
version: '1'
data:
originSelectors:
rules:
- name: route-to-first-function
when: { reqProperty: path, equals: "/weather" }
action:
type: selectAemOrigin
originName: edgefunction-first-function
- name: route-to-second-function
when: { reqProperty: path, equals: "/hello-world" }
action:
type: selectAemOrigin
originName: edgefunction-second-function
通过原点选择器规则,可根据CDN规则引擎中可用的任何条件(如特定路径、域或请求标头),将流量路由到边缘函数。 有关完整的规则语法,请参阅源选择器。
4. 部署配置 deploy-configuration
将edgeFunctions.yaml和cdn.yaml提交到Cloud Manager Git存储库并触发配置管道。 管道成功完成后,您的边缘函数端点在以下位置可用:
publish-pXXXXX-eYYYYY.adobeaemcloud.com/weatherpublish-pXXXXX-eYYYYY.adobeaemcloud.com/hello-world
其中pXXXXX-eYYYYY是您的环境坐标。 如果配置了自定义域,则也可以在这些域路径中访问函数(例如,example.com/weather)。
生成和部署AEM Edge函数代码 build-deploy
生成 build
将边缘函数代码打包以进行部署:
aio aem edge-functions build
部署 deploy
将构建包部署到命名的边缘函数服务。 function-name参数必须与edgeFunctions.yaml中的name值匹配:
aio aem edge-functions deploy <function-name>
本地开发 local-development
本地运行 local-run
在http://127.0.0.1:7676处启动本地开发服务器:
aio aem edge-functions serve
有关本地运行时支持的详细信息,请参阅此计算JavaScript文档。
测试 test
使用Mocha运行测试包:
npm run test
远程调试 remote-debugging
Adobe Managed CDN不会公开远程调试器,但会公开日志流。 跟踪已部署函数的日志,以直接在终端中接收console.log输出:
aio aem edge-functions tail-logs <function-name>
高速缓存和高速缓存清除 caching
Edge Functions可通过在边缘缓存数据来显着减少原始负载并缩短响应时间。 但是,缓存需要刻意设计,尤其是在Edge函数中,其中涉及两个独立的缓存层:
Browser → AEM CDN (CDN Cache) → AEM Edge Functions (Fetch Cache) → Backend (AEM, APIs, etc.)
在配置缓存之前,请考虑内容的行为方式:
- 每个请求的内容真正是唯一的(会话令牌、特定用户的实时定价)应绕过缓存以避免提供错误的结果。
- 基于同类群组的个性化(根据地区、设备类型或受众区段定制的内容)通常可以使用较短的TTL或
Vary标头进行缓存,因为许多用户共享同一变体。 - 稳定的共享内容(产品目录、CMS页面、按已知计划更改的API响应)可通过代理密钥使用显式失效的积极缓存受益。
- 无论在哪个方向出错,都会造成后果。 过度缓存会导致陈旧的内容错误,这些错误在两个缓存层之间难以诊断。 缓存不足根本达不到使用Edge函数的性能和原点卸载目的。
由于CDN和Edge函数的内部获取缓存可独立运行,因此对基础数据的更改需要刻意使 和 层失效。 了解此体系结构对于可靠的缓存管理至关重要。
有关配置缓存行为、控制缓存生命周期、使用替代键以及清除缓存内容的详细技术指导,请参阅在AEM Edge函数中缓存。
限制 limitations
每个Edge函数调用都在一个沙盒中运行,其资源限制由基础计算平台强制执行。
每次调用的最大出站提取调用数 max-fetch-calls
AEM Edge函数对每次执行(即函数处理的传入请求)强制执行 32个后端请求的硬性限制。 一旦达到此限制,任何其他fetch()调用都将失败,并出现以下错误:
Requested backend named '…' does not exist
如果看到此错误且源配置正确,最可能的原因是每次调用后端请求配额已耗尽。 有关平台限制的完整列表,请参阅快速计算资源限制。
配置引用 configuration-reference
来源 origins
默认情况下,边缘函数可从任何源获取。 若要将函数限制为定义的源集合,请在edgeFunctions.yaml中的origins下声明它们:
origins:
- name: my-origin-name
domain: example.com
使用backend获取选项引用函数代码中的命名原点:
const request = new Request("https://example.com/test");
const response = await fetch(request, { backend: "my-origin-name" });
服务配置 service-configuration
在edgeFunctions.yaml中使用configs键向函数公开环境变量。 值存储在名为config_default的配置存储中:
configs:
- key: LOG_LEVEL
value: DEBUG
读取函数代码中的配置值:
import { ConfigStore } from "fastly:config-store";
const config = new ConfigStore('config_default');
const logLevel = config.get('LOG_LEVEL') || 'info';
- 配置存储始终名为
config_default。 - 键名称区分大小写。
- 配置存储在同一环境中的所有Edge函数服务之间共享。
服务密钥 service-secrets
密钥在edgeFunctions.yaml中被引用,未存储。 value字段必须使用${{SECRET_REFERENCE}}语法指向Cloud Manager密钥。 首先在Cloud Manager中定义基础密码 — 请参阅Cloud Manager密码变量。
secrets:
- key: API_TOKEN
value: ${{ API_TOKEN_SECRET }}
使用样板中的SecretStoreManager帮助程序检索函数代码中的密钥:
import { SecretStoreManager } from "./lib/config";
const apiToken = await SecretStoreManager.getSecret('API_TOKEN');
- 密钥存储始终名为
secret_default。 - 键名称区分大小写。
- 密钥一旦创建便不可更改。
- 在同一环境中的所有Edge函数服务之间共享密钥存储。
日志记录 logging
AEM Edge函数与AEM日志转发功能集成。 在您的edgeFunctions.yaml旁创建一个logForwarding.yaml文件:
kind: "LogForwarding"
version: "1"
metadata:
envTypes: ["rde", "dev", "stage", "prod"]
data:
splunk:
default:
enabled: true
host: "splunk-host.example.com"
token: "${{SPLUNK_TOKEN}}"
index: "AEMaaCS"
使用函数代码中的记录器编写结构化日志条目:
import { Logger } from "fastly:logger";
const logger = new Logger("customerSplunk");
logger.log(JSON.stringify({
method: event.request.method,
url: event.request.url
}));