AEM Edge功能 aem-edge-functions

IMPORTANT
AEM Edge Functions是​ 公開測試版 ​功能,因此您無需連絡Adobe即可自助試用。 Adobe鼓勵您傳送電子郵件給aemcs-edgecompute-feedback@adobe.com,說明您的使用案例,讓Adobe確定您有此支援,並提供任何指引。 在為生產流量部署功能之前,請務必聯絡Adobe。
使用AEM Edge功能Beta,即表示您確認該工具仍在開發中,且不應依賴技術的正確運作或資料的可用性。 此功能依原樣提供,可能會有所變更,恕不另行通知,且不在生產環境中。

AEM Edge功能可讓您在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 Sites至Cloud Manager
  • Cloud Manager設定管道(稱為EDS Sites的Edge Delivery Services管道)。
  • 您的AEM環境製作執行個體上的Cloud Service管理員產品設定檔, 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函式外掛程式:

aio plugins install @adobe/aio-cli-plugin-aem-edge-functions

驗證並設定您環境的外掛程式:

aio login
aio aem edge-functions setup

setup指令會提示您登入,然後選取您要使用AEM Edge函式的AEM環境。

原地複製樣板 boilerplate

aem-edge-functions-boilerplate複製到您自己的存放庫,然後安裝相依性:

npm install

註冊AEM Edge功能 register-your-function

AEM Edge函式在YAML設定檔案中宣告,並透過Cloud Manager設定管道部署。

​1. 設定設定管道 configuration-pipeline

建立Edge函式之前,請確定在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
布林值切換可布建KV存放區,以在執行階段讀取/寫入索引鍵值資料,並在環境中與所有Edge函式共用。

請參閱下列進階組態區段中的進階組態,例如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的值,請參閱部署命令的輸出。

連線至內容傳遞流程 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的值,請參閱部署命令的輸出。

本機開發 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函式可在邊緣快取資料,大幅減少來源負載及改善回應時間。 但是,快取需要刻意設計,尤其是在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函式呼叫都會在沙箱中執行,而沙箱中的資源限制則由基礎運算平台強制執行。

  • 建置的網頁元件(wasm)成品的大小上限為100MB

  • 最大記憶體耗用量是1MB位元組棧疊,128MB棧積

  • 邊緣函式執行的重要資訊:

    • 執行在120s壁時間後終止
    • 執行將在計算的第1秒時終止(而不是牆壁時間)
    • 邊緣函式的平均執行時間必須少於100毫秒。
  • 檢視與Edge函式設定變數Edge函式密碼變數Edge函式KV存放區相關的限制。

每次叫用的最大傳出擷取呼叫數 max-fetch-calls

AEM Edge函式會強制每個執行​(亦即您的函式處理的每個傳入要求)有 32個後端要求的硬性限制。 一旦達到此限制,任何其他fetch()個呼叫都會失敗,並出現下列錯誤:

Requested backend named '…' does not exist

當您看到此錯誤且來源設定正確時,最可能的原因是每次呼叫後端請求配額已用盡。 如需完整的平台限制清單,請參閱Fastly計算資源限制

進階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
沙箱程式中沒有可用的設定、秘密和kvs。 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
  • 金鑰名稱區分大小寫。
  • 此設定存放區會在相同環境中的所有邊緣函式中共用。
  • 設定存放區會透過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
  • 金鑰名稱區分大小寫。
  • 秘密一旦建立就不可改變。
  • 機密存放區會在相同環境中的所有邊緣功能之間共用。
  • 秘密存放區會透過Adobe-Managed CDN的全域網路進行復寫
  • 所有秘密的大小上限為64 kb

Edge函式KV存放區 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存放區會在相同環境中的所有邊緣功能之間共用。
  • KV存放區會透過Adobe Managed CDN的全球網路進行復寫
  • KV存放區提供最終一致性,這表示在寫入索引鍵後立即讀取索引鍵可能不會傳回更新的值。
  • KV金鑰名稱最多為1024位元組UTF-8檔案
  • KV專案大小上限為25米
  • KV存放區專案的速率限製為每專案每秒寫入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
CDN記錄(包括AEM Edge函式記錄專案)可從Java棧疊環境的Cloud Manager下載,但無法用於Edge Delivery網站。
recommendation-more-help
experience-manager-cloud-service-help-main-toc