AEM Edge函数 aem-edge-functions

IMPORTANT
AEM Edge Functions是一项​ 公共测试版 ​功能,因此您可以自助试用,而无需联系Adobe以启用。 Adobe鼓励您通过电子邮件发送aemcs-edgecompute-feedback@adobe.com来说明您的用例,以便Adobe能够确保支持此用例并提供任何指导。 在为生产流量部署功能之前,请务必联系Adobe。
使用AEM Edge Functions Beta,即表示您确认它仍在开发中,不应依赖技术的正确运行或数据的可用性。 此功能按原样提供,如有更改,恕不另行通知,不在生产环境中。

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

优势
描述
性能
通过边缘SSR快速TTFB返回完全渲染的HTML。 通过并行获取和优化的网络跃点进行的低延迟API调用。
SEO/地域
AI爬虫可以为拼接在一起的服务器端内容编制索引。
安全性
在服务器端保留API凭据,对客户端JavaScript隐藏。 使用身份提供程序进行身份验证并限制内容访问。
个性化
根据地域和设备信号,在页面加载之前个性化内容。 在边缘运行受众查找,以进行目标交付。

先决条件 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实施的)。 有关配置管道的信息,请参阅使用配置管道

NOTE
如果您使用快速开发环境(RDE),则可以直接使用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个边缘函数。 可选的顶级键包括:

描述
functions
边缘函数列表,每个函数均由name标识。 为了向后兼容,services也已被接受,但functions是首选键。 不允许在同一文件中使用这两者。
configs
作为环境变量向环境的边缘函数公开的键/值对。
secrets
将Cloud Manager密钥引用到环境的边缘函数的键/值对
kvs
布尔值切换,为环境中所有Edge函数共享的运行时读/写键值数据预配KV存储。

请参阅下面的高级配置部分中的高级配置,例如configssecretskvs

​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/weather
  • example.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" });
NOTE
配置、密钥和kv在沙盒程序中不可用。 Edge函数本身在沙盒环境中正常运行 — 仅这些实体未配置。

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';
NOTE
  • 配置存储始终名为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');
NOTE
  • 密钥存储始终名为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));
NOTE
  • 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
}));
NOTE
对于Java栈栈环境,可以从Cloud Manager下载CDN日志(包括AEM Edge函数日志条目),但无法从Edge Delivery站点下载。
recommendation-more-help
experience-manager-cloud-service-help-main-toc