Edge Functionsで設定とシークレットを使用する
機密性のない configs と機密性の高い secrets をedgeFunctions.yamlを通じてAEM Edge関数に渡し、コードで読み取る方法について説明します。
設定とシークレット
configsとsecretsの両方は、AEM Edge関数に公開するキーと値のペアです。
その違いは、その価値がどこに存在するのか、またその価値がどれほど機密性のあるものなのかです。
configssecretsedgeFunctions.yaml、GitにコミットしましたedgeFunctions.yamlから参照されたCloud Manager秘密鍵config_defaultsecret_defaultConfigStore.get() (同期)SecretStoreManager.getSecret() (非同期)${{SECRET_NAME}}のみがedgeFunctions.yamlでコミットされますconfigsには機密値を絶対に入力しないでください。 edgeFunctions.yaml ファイルはGitにコミットされているため、その設定値はリポジトリアクセスを持つユーザーに表示されます。 トークン、キー、資格情報にsecretsを使用します。設定とシークレットを宣言する場所
edgeFunctions.yamlのdataの下の両方を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_TOKEN (key)edgeFunctions.yamlとあなたのコードgetSecret()に渡す名前WKND_TRIPS_API_TOKEN (${{ }}内)この例では、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には存在しません。
- Cloud Managerで、プログラム > 環境 > 構成 タブに移動します。
- +設定を追加を選択します。環境設定 モーダルで、名前と値を入力し、適用するサービスを選択して、タイプを_シークレット_に設定します。
- 「+追加」、「保存」の順に選択します。
Edge Delivery Servicesでシークレットを追加する
Edge Delivery Servicesには、プログラムごとに1つの設定パイプラインがあり、サイトごとに1つではありません。 サイトごとに個別のファイルではなく、各サイトで共有されるプログラム全体に対して1つのedgeFunctions.yamlをデプロイします。
開発、ステージ、および実稼動サイトはすべて1つのパイプラインを共有しているため、同じ変数名を3つの異なる値で3回追加することはできません。また、ブランチ固有のedgeFunctions.yamlを使用して適切なパイプラインを選択することはできません。
各変数名の前にサイトを付けて、3つのサイトが競合しないようにします(例:DEV_TRIPS_API_TOKEN、STAGE_TRIPS_API_TOKEN、およびMAIN_TRIPS_API_TOKEN)。 同じedgeFunctions.yaml内の3つすべてを宣言し、実行時にコードが適切なものを選択できるようにします。
- Cloud Managerで、プログラム > Edge Delivery > パイプライン セクションに移動します。パイプラインの横にある省略記号(
...)を選択し、変数を表示/編集します。
- サイトのプレフィックスを使用して、サイトごとに1つの変数を追加し、タイプを_Secret_に設定します。
- パイプラインが各サイトに対して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つのサイトすべてを提供するので、接頭辞のない名前は衝突し、実行時に適切な接頭辞を選択する必要があります。