AEM Edge函数 aem-edge-functions
AEM Edge Functions允许您在CDN层执行JavaScript,使数据处理更接近于最终用户。 这样可以减少延迟,并提供响应迅速的动态体验,而无需往返于您的来源地。
常见的用例包括:
- 根据地理位置、设备类型或用户属性等信息个性化内容
- 充当 CDN 与您的源站之间的中间件
- 在第三方API响应到达浏览器之前重新设置格式或聚合响应
- 使用从多个后端拼接的内容在边缘合成和提供服务器渲染的HTML
AEM Edge函数与Edge Delivery Services和AEM as a Cloud Service Java栈栈兼容,适用于AEM Sites客户。
按照本教程了解Edge Delivery Services和AEM as a Cloud Service Java栈栈变体的具体演练。
主要优点 key-benefits
先决条件 prerequisites
- Cloud Manager程序,其中包含AEM Java栈栈环境或Edge Delivery Services站点。 了解如何将板载EDS站点发送到Cloud Manager。
- Cloud Manager配置管道(称为EDS Sites的Edge Delivery Services管道)。
- 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
注册AEM Edge功能 register-your-function
AEM Edge函数在YAML配置文件中声明,并通过Cloud Manager配置管道进行部署。
1. 设置配置管道 configuration-pipeline
在创建边缘函数之前,请确保在Cloud Manager中存在(如果使用AEM Java栈栈)配置管道,或者存在Edge Delivery Services管道(如果项目是使用Edge Delivery Services实施的)。 有关配置管道的信息,请参阅使用配置管道。
aio aem rde:install -t env-config ./config部署配置,而不是通过配置管道进行部署。2. 声明Edge函数 declare-functions
在配置目录中创建名为edgeFunctions.yaml的文件:
kind: "EdgeFunctions"
version: "1"
data:
functions:
- name: my-edge-function
# add advanced configuration under here
Java栈栈环境具有1个边缘函数,Edge Delivery Services实施具有3个边缘函数。 可选的顶级键包括:
functionsname标识。 为了向后兼容,services也已被接受,但functions是首选键。 不允许在同一文件中使用这两者。configssecretskvs请参阅下面的高级配置部分中的高级配置,例如configs、secrets和kvs。
3. 通过Cloud Manager部署Edge功能 deploy-functions-via-cm
使用Cloud Manager部署管道,以便在CDN上注册Edge函数。
创作、构建和部署AEM Edge函数代码 build-deploy
创作 author
使用样板的src文件夹作为起点,编写边缘函数代码业务逻辑。
生成 build
将边缘函数代码打包以进行部署:
aio aem edge-functions build
部署 deploy
将打包的边缘函数代码部署到命名边缘函数。 function-name参数必须与edgeFunctions.yaml中的name值匹配:
aio aem edge-functions deploy <function-name>
测试 test
确保Edge函数按预期工作。 您可以在以下位置对其进行测试:
edgefunction-pXXXXX-eYYYYY-<function name>.adobeaemcloud.com/<path>
例如,对于AEM Java栈栈:edgefunction-pXXXXX-eYYYYY-my-edge-function.adobeaemcloud.com/weather
或Edge Delivery Services:edgefunction-pXXXXX-dYYYYY-my-edge-function.adobeaemcloud.com/weather
以 edgefunction 为前缀的此域仅用于调试,但不能为实时流量引用,因为不能保证它是稳定的名称。 要确定dYYYY的值,请参见deploy命令的输出。
连接到内容投放流程 wiring
Edge函数流量应发送到网站的域,该域通常是AEM Java栈栈的自定义域,并且 必须 是Edge Delivery Services Sites的自定义域。
1. 定义原点选择器 origin-selectors
通过原始选择器规则将CDN流量路由到它们来调用Edge函数。 将以下内容添加到您的cdn.yaml配置文件中(如果该文件不存在,请创建一个):
kind: 'CDN'
version: '1'
data:
originSelectors:
rules:
- name: route-weather-to-edge-function
when: { reqProperty: path, equals: "/weather" }
action:
type: selectAemOrigin
originName: edgefunction-my-edge-function
- name: route-hello-world-to-edge-function
when: { reqProperty: path, equals: "/hello-world" }
action:
type: selectAemOrigin
originName: edgefunction-my-edge-function
通过原点选择器规则,可根据CDN规则引擎中可用的任何条件(如特定路径、域或请求标头),将流量路由到边缘函数。 多条规则可以将不同的路径路由到同一个边缘函数。 有关完整的规则语法,请参阅源选择器。
2. 部署配置 deploy-to-cdn
将cdn.yaml提交到Cloud Manager Git存储库并触发配置管道。 管道成功完成后,您的边缘函数端点在以下位置可用:
example.com/weatherexample.com/hello-world
对于调试,您可以在域publish-pXXXXX-eYYYYY.adobeaemcloud.com(对于AEM Java栈栈)或publish-pXXXXX-dYYYYY.adobeaemcloud.com(对于Edge Delivery Services站点)引用Edge函数。 请勿将此域用于生产环境,因为不保证它是稳定的名称。 要确定dYYYY的值,请参见deploy命令的输出。
本地开发 local-development
本地运行 local-run
在http://127.0.0.1:7676处启动本地开发服务器:
aio aem edge-functions serve
有关本地运行时支持的详细信息,请参阅此计算JavaScript文档。
测试 test-localdev
使用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函数调用都在一个沙盒中运行,其资源限制由基础计算平台强制执行。
-
构建的Web组件(wasm)工件的最大大小为100MB
-
最大内存消耗为1MB字节栈栈,128MB栈
-
有关边缘函数执行的重要信息:
- 执行在120秒的墙壁时间后终止
- 执行将在计算的第1秒(而非墙壁时间)终止
- 边缘函数的平均执行时间必须少于100毫秒。
-
查看与Edge函数配置变量、Edge函数密码变量和Edge函数KV存储相关的限制。
每次调用的最大出站提取调用数 max-fetch-calls
AEM Edge函数对每次执行(即函数处理的传入请求)强制执行 32个后端请求的硬性限制。 一旦达到此限制,任何其他fetch()调用都将失败,并出现以下错误:
Requested backend named '…' does not exist
如果看到此错误且源配置正确,最可能的原因是每次调用后端请求配额已耗尽。 有关平台限制的完整列表,请参阅快速计算资源限制。
高级Edge功能配置 advanced-function-configuration
来源 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" });
Edge函数配置变量 function-configuration
在edgeFunctions.yaml中使用configs键向函数公开环境变量。 值存储在名为config_default的配置存储中:
kind: "EdgeFunctions"
version: "1"
data:
functions:
- name: my-edge-function
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函数之间共享。
- 配置存储区将通过Adobe-Managed CDN的全局网络进行复制
- 最多500个条目
- 最大名称/值大小:255和8000个字符
Edge函数机密变量 function-secrets
密钥在edgeFunctions.yaml中被引用,未存储。 value字段必须使用${{SECRET_REFERENCE}}语法指向Cloud Manager密钥。 首先在Cloud Manager中定义基础密码 — 请参阅Cloud Manager密码变量。
kind: "EdgeFunctions"
version: "1"
data:
functions:
- name: my-edge-function
secrets:
- key: API_TOKEN
value: ${{API_TOKEN_SECRET}}
使用样板中的SecretStoreManager帮助程序检索函数代码中的密钥:
import { SecretStoreManager } from "./lib/config";
const apiToken = await SecretStoreManager.getSecret('API_TOKEN');
- 密钥存储始终名为
secret_default。 - 键名称区分大小写。
- 密钥一旦创建便不可更改。
- 在同一环境中的所有Edge函数之间共享密钥存储。
- 密钥存储区会通过Adobe-Managed CDN的全局网络进行复制
- 所有密钥的最大大小为64 kb
Edge函数KV Store function-kv-store
Edge函数可在运行时通过KV存储读取和写入任意键值数据。 要启用该功能,请在edgeFunctions.yaml中设置kvs: true:
kind: "EdgeFunctions"
version: "1"
data:
functions:
- name: my-edge-function
kvs: true
这会设置一个名为kv_default的空KV存储。 在运行时使用Fastly KV Store API从边缘函数代码填充它:
import { KVStore } from "fastly:kv-store";
const kv = new KVStore('kv_default');
// Read a value
const entry = await kv.get('visit-count');
const count = entry ? Number(await entry.text()) : 0;
// Write a value
await kv.put('visit-count', String(count + 1));
- KV存储始终名为
kv_default。 - 在设置时KV存储为空;在运行时通过Fastly KV存储API填充它。 不支持
edgeFunctions.yaml中的声明性键/值项。 - KV存储在同一环境中的所有Edge函数之间共享。
- KV存储区会通过Adobe-Managed CDN的全球网络进行复制
- KV存储提供最终一致性,这意味着在写入密钥后立即读取密钥可能不会返回更新的值。
- KV密钥名称最多为1024字节UTF-8文件
- KV入门级尺寸最大为25米
- KV Store项目的速率限制为每项目每秒写入1次。
- KV存储项目批处理请求具有每个请求100,000个项目的限制。
日志记录 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
}));