搭配Edge函式使用設定和秘密

IMPORTANT
AEM Edge功能目前仍在測試階段。 功能和檔案可能會變更。 如需意見回饋,請連絡aemcs-edgecompute-feedback@adobe.com
NOTE
沙箱程式中無法使用設定、密碼和KV存放區。 使用非沙箱環境或RDE測試設定和秘密。

瞭解如何透過edgeFunctions.yaml將非敏感的​ 設定 ​和敏感的​ 秘密 ​傳遞至AEM Edge函式,並在您的程式碼中讀取。

設定與秘密

configssecrets都是您公開給AEM Edge函式的索引鍵/值組。

差異在於值的存留位置及其敏感度。

configs
secrets
用於
不敏感的值(API URL、快取TTL、功能標幟等)
敏感值(API權杖、金鑰、憑證等)
值存留於
edgeFunctions.yaml,已提交至Git
Cloud Manager機密,參考自edgeFunctions.yaml
存放區名稱
config_default
secret_default
使用讀取程式碼
ConfigStore.get() (同步)
SecretStoreManager.getSecret() (非同步)
在Git中可見
否,在edgeFunctions.yaml中只認可參考${{SECRET_NAME}}
IMPORTANT
絕對不要在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 (在${{ }}內)
Cloud Manager機密
儲存實際值的Cloud Manager機密

此範例使用一個金鑰和一個秘密,即AEM as a Cloud Service的模式。 在Edge Delivery Services上,由於一個設定管道可為所有三個網站提供服務,因此每個網站會重複該模式一次。

在AEM as a Cloud Service上新增密碼

定義Cloud Manager密碼並執行設定管道,然後再用於AEM Edge函式。 每個環境(RDE、Dev、Stage、Prod)都有各自的「組態」標籤,因此您新增至Dev的秘密不會存在於Stage或Prod中,直到您也新增至該處為止。

  1. 在Cloud Manager中,導覽至您的​程式 > 環境 > 設定​索引標籤。
    Cloud Manager設定索引標籤
  2. 選取​+新增組態。在​ 環境組態 ​強制回應視窗中,輸入名稱和值、選擇要套用它的服務,並將型別設定為​密碼
    Cloud Manager環境設定模組
  3. 選取​+新增,然後選取​儲存

在Edge Delivery Services上新增密碼

Edge Delivery Services的每個程式有一個設定管道,而非每個網站一個。 它會為整個程式部署單一edgeFunctions.yaml,由每個網站共用,而不是為每個網站部署個別檔案。

Dev、Stage和Prod網站都共用一個管道,因此您無法使用三個不同的值三次新增相同的變數名稱,也無法依賴分支特定的edgeFunctions.yaml來選擇正確的值。

在每個變數名稱前面加上其網站,讓這三個網站絕不會發生衝突,例如DEV_TRIPS_API_TOKENSTAGE_TRIPS_API_TOKENMAIN_TRIPS_API_TOKEN。 在相同的edgeFunctions.yaml中宣告全部三個,然後讓您的程式碼在執行階段挑選正確的程式碼。

  1. 在Cloud Manager中,導覽至您的​方案 > Edge Delivery > 管道​區段。選取管道旁的省略符號(...),然後選取​檢視/編輯變數
    Cloud Manager設定管道變數
  2. 使用網站首碼為每個網站新增一個變數,並將型別設定為​密碼
    Cloud Manager密碼首碼
  3. 在單一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_)前置詞。 一個設定管道可為所有三個網站提供服務,因此未加上前置詞的名稱會發生衝突,而且您的程式碼必須在執行階段挑選正確的前置詞。

其他資源

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