AEM Edge函数 aem-edge-functions
AEM Edge Functions允许您在CDN层执行JavaScript,使数据处理更接近于最终用户。 这样可以减少延迟,并提供响应迅速的动态体验,而无需往返于您的来源地。
常见的用例包括:
- 根据地理位置、设备类型或用户属性等信息个性化内容
- 充当 CDN 与您的源站之间的中间件
- 在第三方API响应到达浏览器之前重新设置格式或聚合响应
- 使用从多个后端拼接的内容在边缘合成和提供服务器渲染的HTML
AEM Edge函数与Edge Delivery Services和AEM 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参数必须与name中的edgeFunctions.yaml值匹配:
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>
配置引用 configuration-reference
来源 origins
默认情况下,边缘函数可从任何源获取。 若要将函数限制为定义的源集合,请在origins中的edgeFunctions.yaml下声明它们:
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
在configs中使用edgeFunctions.yaml键向函数公开环境变量。 值存储在名为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日志转发功能集成。 在您的logForwarding.yaml旁创建一个edgeFunctions.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
}));