Edge Functionsで設定とシークレットを使用する

IMPORTANT
AEM Edge Functionsは現在ベータ版です。 機能やドキュメントは変更される可能性があります。 フィードバックについては、aemcs-edgecompute-feedback@adobe.comまでお問い合わせください。
NOTE
サンドボックスプログラムでは、Config、secret、KV ストアは使用できません。 設定とシークレットをテストするには、サンドボックス以外の環境またはRDEを使用します。

機密性のない​ configs ​と機密性の高い​ secrets ​をedgeFunctions.yamlを通じてAEM Edge関数に渡し、コードで読み取る方法について説明します。

設定とシークレット

configssecretsの両方は、AEM Edge関数に公開するキーと値のペアです。

その違いは、その価値がどこに存在するのか、またその価値がどれほど機密性のあるものなのかです。

configs
secrets
の使用
機密性のない値(API URL、キャッシュ TTL、機能フラグなど)
機密性の高い値(API トークン、キー、資格情報など)
価値は次の中に存在します:
edgeFunctions.yaml、Gitにコミットしました
edgeFunctions.yamlから参照されたCloud Manager秘密鍵
ストア名
config_default
secret_default
でコードを読み込む
ConfigStore.get() (同期)
SecretStoreManager.getSecret() (非同期)
Gitで表示
はい
いいえ。参照${{SECRET_NAME}}のみがedgeFunctions.yamlでコミットされます
IMPORTANT
configsには機密値を絶対に入力しないでください。 edgeFunctions.yaml ファイルはGitにコミットされているため、その設定値はリポジトリアクセスを持つユーザーに表示されます。 トークン、キー、資格情報にsecretsを使用します。

設定とシークレットを宣言する場所

edgeFunctions.yamldataの下の両方をfunctionsの兄弟として宣言します。 個々の関数の下にネストされていません。

# config/edgeFunctions.yaml
kind: "EdgeFunctions"
version: "1"
data:
  functions:
    - name: my-edge-function
  configs:
    - key: TRIPS_API_BASE_URL
      value: "https://api.example.com/trips"
    - key: ADVENTURE_CACHE_TTL_SECONDS
      value: "300"
  secrets:
    - key: TRIPS_API_TOKEN
      value: ${{WKND_TRIPS_API_TOKEN}}

キー名では大文字と小文字が区別されます。 ここで宣言するkeyは、実行時にコードが読み取るのと同じ名前です。

サポートされているすべてのプロパティについては、宣言関数を参照してください。

設定の使用

設定には、環境によって異なる機密性のない値が保持されます。 Config値は常に文字列なので、数値またはブール値が必要なときにキャストします。

コード内の設定の読み取り

config_default ストアを開き、宣言したキーでget()を呼び出します。 呼び出しは同期しています。

// src/index.js or handler file
import { ConfigStore } from "fastly:config-store";

const config = new ConfigStore("config_default");

// read a config value (always a string)
const apiBaseUrl = config.get("TRIPS_API_BASE_URL");

// cast to a number, with a fallback if the key is missing
const ttlSeconds = Number(config.get("ADVENTURE_CACHE_TTL_SECONDS") || "300");

シークレットを使用

シークレットには、API トークンなどの機密値が保持されます。 値はCloud Manager シークレットに残ります。 edgeFunctions.yaml${{SECRET_NAME}}構文で参照しているため、値がGitに表示されることはありません。

2つの名前が含まれており、目的が異なります。

名前
どこに住んでいるか
目的
TRIPS_API_TOKENkey
edgeFunctions.yamlとあなたのコード
コードがgetSecret()に渡す名前
WKND_TRIPS_API_TOKEN${{ }}内)
Cloud Manager secret
実際の値を保持するCloud Manager シークレット

この例では、AEM as a Cloud Serviceのパターンである1つのキーと1つの秘密鍵を使用します。 Edge Delivery Servicesでは、1つの設定パイプラインが3つのサイトすべてを提供するため、サイトごとに1回パターンを繰り返します。

AEM as a Cloud Serviceでシークレットを追加する

Cloud Manager シークレットを定義し、AEM Edge関数で使用する前に設定パイプラインを実行します。 各環境(RDE、Dev、Stage、Prod)には独自の「設定」タブがあるため、開発に追加したシークレットは、追加するまでStageまたはProdには存在しません。

  1. Cloud Managerで、プログラム > 環境 > 構成 タブに移動します。
    Cloud Manager設定タブ ​
  2. +設定を追加​を選択します。環境設定 モーダルで、名前と値を入力し、適用するサービスを選択して、タイプを​_シークレット_に設定します。
    Cloud Manager環境設定モーダル ​
  3. +追加」、「保存」の順に選択します。

Edge Delivery Servicesでシークレットを追加する

Edge Delivery Servicesには、プログラムごとに1つの設定パイプラインがあり、サイトごとに1つではありません。 サイトごとに個別のファイルではなく、各サイトで共有されるプログラム全体に対して1つのedgeFunctions.yamlをデプロイします。

開発、ステージ、および実稼動サイトはすべて1つのパイプラインを共有しているため、同じ変数名を3つの異なる値で3回追加することはできません。また、ブランチ固有のedgeFunctions.yamlを使用して適切なパイプラインを選択することはできません。

各変数名の前にサイトを付けて、3つのサイトが競合しないようにします(例:DEV_TRIPS_API_TOKENSTAGE_TRIPS_API_TOKEN、およびMAIN_TRIPS_API_TOKEN)。 同じedgeFunctions.yaml内の3つすべてを宣言し、実行時にコードが適切なものを選択できるようにします。

  1. Cloud Managerで、プログラム > Edge Delivery > パイプライン セクションに移動します。パイプラインの横にある省略記号(...)を選択し、変数を表示/編集​します。
    Cloud Manager設定パイプライン変数
  2. サイトのプレフィックスを使用して、サイトごとに1つの変数を追加し、タイプを​_Secret_に設定します。
    Cloud Manager シークレット プレフィックス ​
  3. パイプラインが各サイトに対して1回デプロイするため、プレフィックス付きの3つのシークレットをすべて1つのedgeFunctions.yamlで宣言します。
# config/edgeFunctions.yaml
secrets:
  - key: TRIPS_API_TOKEN_DEV
    value: ${{DEV_TRIPS_API_TOKEN}}
  - key: TRIPS_API_TOKEN_STAGE
    value: ${{STAGE_TRIPS_API_TOKEN}}
  - key: TRIPS_API_TOKEN_MAIN
    value: ${{MAIN_TRIPS_API_TOKEN}}

AEM Edge関数は、現在提供しているサイトに基づいて、実行時に読み取るキーを決定する必要があります。 次の節では、ルックアップを示します。

コード内のシークレットの読み取り

src/lib/config.jsでボイラープレートが提供するSecretStoreManager ヘルパーを通じて、実行時にシークレットを読み取ります。 secret_default ストアから読み取ります。 呼び出しは両方のプラットフォームで非同期ですが、検索するキーは異なります。

AEM as a Cloud Service​では、キーは固定されます。これは、各環境が同じキー名の後ろに独自のシークレットを持っているためです。

// src/index.js or handler file
import { SecretStoreManager } from "./lib/config";

const token = await SecretStoreManager.getSecret("TRIPS_API_TOKEN");
if (!token) {
  throw new Error("TRIPS_API_TOKEN is not configured");
}

Edge Delivery Services​では、最初に現在のサイトからキーを作成します。1つの共有edgeFunctions.yamlでは、サイトごとに個別のキーが宣言されます。

// src/index.js or handler file
import { SecretStoreManager } from "./lib/config";

const site = getCurrentSite(); // for example, "DEV", "STAGE", or "MAIN" based on the origin header
const token = await SecretStoreManager.getSecret(`TRIPS_API_TOKEN_${site}`);
if (!token) {
  throw new Error(`TRIPS_API_TOKEN_${site} is not configured`);
}

トークンを取得したら、両方のプラットフォームで同じ方法でアウトバウンドリクエストで使用します。

// use the token in an outbound request, never in a response to the client
const request = new Request("https://api.example.com/trips", {
  headers: { Authorization: `Bearer ${token}` },
});

AEM Edge機能内で秘密を保持します。 クライアントに返したり、ログに記録したりしないでください。

ガイドライン

  • コミットする安全な項目にはconfigsを使用し、プライベートにする必要がある項目にはsecretsを使用します。
  • キー名を正確に一致させます。 すべてのキー名では、大文字と小文字が区別されます。
  • すべての設定値は文字列であるため、使用する前に設定値をキャストします。
  • パイプラインが実行される前にCloud Manager シークレットを追加するか、${{SECRET_NAME}}参照を解決できません。
  • Edge Delivery Servicesでは、各シークレット名と変数名の前にサイト (DEV_STAGE_MAIN_)を付けます。 1つの設定パイプラインは3つのサイトすべてを提供するので、接頭辞のない名前は衝突し、実行時に適切な接頭辞を選択する必要があります。

その他のリソース

recommendation-more-help
experience-manager-learn-help-cloud-service