Edge 함수와 함께 구성 및 암호 사용
edgeFunctions.yaml을 통해 AEM Edge 함수에 민감하지 않은 configs 및 민감한 secrets을(를) 전달하고 코드에서 읽는 방법을 알아봅니다.
구성과 암호 비교
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은(는) 런타임에 코드가 읽는 이름과 같습니다.
지원되는 모든 속성에 대해서는 Declare 함수를 참조하십시오.
구성 사용
구성에는 환경에 따라 달라지는 민감하지 않은 값이 있습니다. 구성 값은 항상 문자열이므로 숫자나 부울이 필요할 때 캐스팅합니다.
코드에서 구성 읽기
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에서 암호 추가
AEM Edge 함수에서 사용하기 전에 Cloud Manager 암호를 정의하고 구성 파이프라인을 실행합니다. 각 환경(RDE, Dev, Stage, Prod)에는 자체 구성 탭이 있으므로 Dev에 추가하는 비밀은 Stage 또는 Prod에 추가할 때까지 존재하지 않습니다.
- Cloud Manager에서 프로그램 > 환경 > 구성 탭으로 이동합니다.
- +구성 추가를 선택합니다. 환경 구성 모달에서 이름과 값을 입력하고 적용할 서비스를 선택한 다음 유형을 암호(으)로 설정합니다.
- +추가를 선택한 다음 저장을 선택합니다.
Edge Delivery Services에서 암호 추가
Edge Delivery Services에는 사이트당 하나의 구성 파이프라인이 아닌 프로그램당 하나의 구성 파이프라인이 있습니다. 사이트당 별도의 파일이 아니라 모든 사이트에서 공유하는 전체 프로그램에 대해 단일 edgeFunctions.yaml을(를) 배포합니다.
개발, 스테이지 및 프로덕션 사이트는 모두 하나의 파이프라인을 공유하므로 세 가지 다른 값을 사용하여 동일한 변수 이름을 세 번 추가할 수 없으며 분기별 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`);
}
토큰이 있으면 두 플랫폼에서 동일한 방식으로 아웃바운드 요청에 사용합니다.
// 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_)를 접두사로 추가합니다. 하나의 구성 파이프라인은 세 사이트 모두를 제공하므로 접두사가 없는 이름이 충돌하며 코드가 런타임 시 올바른 접두사를 선택해야 합니다.