搭配Edge函式使用設定和秘密
瞭解如何透過edgeFunctions.yaml將非敏感的 設定 和敏感的 秘密 傳遞至AEM Edge函式,並在您的程式碼中讀取。
設定與秘密
configs和secrets都是您公開給AEM Edge函式的索引鍵/值組。
差異在於值的存留位置及其敏感度。
configssecretsedgeFunctions.yaml,已提交至GitedgeFunctions.yamlconfig_defaultsecret_defaultConfigStore.get() (同步)SecretStoreManager.getSecret() (非同步)edgeFunctions.yaml中只認可參考${{SECRET_NAME}}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_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中。
其中涉及兩個名稱,且兩者的用途不同。
TRIPS_API_TOKEN (key)edgeFunctions.yaml和您的程式碼getSecret()的名稱WKND_TRIPS_API_TOKEN (在${{ }}內)此範例使用一個金鑰和一個秘密,即AEM as a Cloud Service的模式。 在Edge Delivery Services上,由於一個設定管道可為所有三個網站提供服務,因此每個網站會重複該模式一次。
在AEM as a Cloud Service上新增密碼
定義Cloud Manager密碼並執行設定管道,然後再用於AEM Edge函式。 每個環境(RDE、Dev、Stage、Prod)都有各自的「組態」標籤,因此您新增至Dev的秘密不會存在於Stage或Prod中,直到您也新增至該處為止。
- 在Cloud Manager中,導覽至您的程式 > 環境 > 設定索引標籤。
- 選取+新增組態。在 環境組態 強制回應視窗中,輸入名稱和值、選擇要套用它的服務,並將型別設定為密碼。
- 選取+新增,然後選取儲存。
在Edge Delivery Services上新增密碼
Edge Delivery Services的每個程式有一個設定管道,而非每個網站一個。 它會為整個程式部署單一edgeFunctions.yaml,由每個網站共用,而不是為每個網站部署個別檔案。
Dev、Stage和Prod網站都共用一個管道,因此您無法使用三個不同的值三次新增相同的變數名稱,也無法依賴分支特定的edgeFunctions.yaml來選擇正確的值。
在每個變數名稱前面加上其網站,讓這三個網站絕不會發生衝突,例如DEV_TRIPS_API_TOKEN、STAGE_TRIPS_API_TOKEN和MAIN_TRIPS_API_TOKEN。 在相同的edgeFunctions.yaml中宣告全部三個,然後讓您的程式碼在執行階段挑選正確的程式碼。
- 在Cloud Manager中,導覽至您的方案 > Edge Delivery > 管道區段。選取管道旁的省略符號(
...),然後選取檢視/編輯變數。
- 使用網站首碼為每個網站新增一個變數,並將型別設定為密碼。
- 在單一
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上,先從目前的網站建立金鑰,因為共用的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`);
}
取得Token後,請以相同方式在兩種平台上用於您的傳出請求:
// 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_)前置詞。 一個設定管道可為所有三個網站提供服務,因此未加上前置詞的名稱會發生衝突,而且您的程式碼必須在執行階段挑選正確的前置詞。