AEM Edge Functions aem-edge-functions
AEM Edge Functionsでは、JavaScriptをCDN レイヤーで実行し、データ処理をエンドユーザーに近づけることができます。 これにより、遅延を低減し、コンテンツの配信元を何度も訪問することなく、レスポンシブでダイナミックなエクスペリエンスを提供できます。
一般的なユースケースを次に示します。
- 位置情報、デバイスの種類、ユーザー属性などの情報にもとづくコンテンツのパーソナライズ
- CDN と接触チャネルの間のミドルウェアとして機能させる
- サードパーティ APIからの応答をブラウザーに届く前に再フォーマットまたは集約する
- 複数のバックエンドから合成したコンテンツを使用して、サーバーレンダリングされたHTMLをエッジで合成して配信する
AEM Edge Functionsは、Edge Delivery ServicesとAEM Cloud Service Java スタックの両方に対応しています。
主なメリット key-benefits
前提条件 prerequisites
- AEM as a Cloud Service環境
- Cloud Service環境のオーサーインスタンス上のAEM Administrator製品プロファイル、Admin Console for Edge Delivery Services サイトのCloud Manager Deployment 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の複製 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 }}
この設定では、最大3つのサービスをサポートします。 最上位のキーは次のとおりです。
servicesnameによって識別されます。configssecrets3. CDN オリジン セレクタ ルールの追加 cdn-routing
Edge関数は、オリジンセレクタールールを介してCDN トラフィックをルーティングすることで呼び出されます。 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
デプロイメント用にEdge関数コードをパッケージ化します。
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
ローカル ランタイムがサポートする内容について詳しくは、Compute 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です。 - キー名では大文字と小文字が区別されます。
- 設定ストアは、同じ環境のすべてのエッジ関数サービスで共有されます。
サービス秘密鍵 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です。 - キー名では大文字と小文字が区別されます。
- 秘密鍵は一度作成されると不変です。
- シークレットストアは、同じ環境のすべてのエッジ機能サービスで共有されます。
ログ logging
AEM Edge Functionsは、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
}));