데모 배포
데모 배포 는 사전 정의된 원시 샘플 데이터 세트를 사용하여 간소화된 환경을 제공합니다. 오케스트레이션을 위해 Cortex Framework Dataform 파이프라인을 배포하고 샘플 데이터로 해당 BigQuery 데이터 세트를 초기화하는 엔드 투 엔드 워크플로를 제공합니다.
시작하기 전에
데모 배포를 계속하기 전에 기본 요건 페이지에 설명된 기본 요건을 완료했는지 확인합니다.
필요한 IAM 역할 및 권한 가져오기
target Google Cloud project 내에서 Cortex Framework 콘텐츠를 배포하는 데 필요한 Identity and Access Management (IAM) 권한을 가져옵니다.
타겟 프로젝트의 역할
Cortex Framework를 배포하는 데 필요한 권한을 얻으려면 관리자에게 타겟 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.
- BigQuery 작업 사용자 (
roles/bigquery.jobUser) - BigQuery 데이터 편집자 (
roles/bigquery.dataEditor) - Dataform 관리자 (
roles/dataform.admin) - 서비스 사용량 소비자 (
roles/serviceusage.serviceUsageConsumer)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
명령어를 사용하여 트리거할 수 있습니다.사용자에게 요청된 역할을 부여하려면 다음 스크립트를 사용하면 됩니다.
# Grant BigQuery JobUser to the user
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_EMAIL" \
--role="roles/bigquery.jobUser"
# Grant BigQuery DataEditor to the user
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_EMAIL" \
--role="roles/bigquery.dataEditor"
# Grant BigQuery Dataform admin to the user
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_EMAIL" \
--role="roles/dataform.admin"
# Grant Service Usage Consumer to the user
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_EMAIL" \
--role="roles/serviceusage.serviceUsageConsumer"
선택사항: 서비스 계정을 사용하여 데모 배포에 필요한 IAM 역할 가져오기
다음 역할은 선택사항인 --service_account 매개변수가 사용 설정된 데모 배포에만 필요합니다. 서비스 계정을 제공하면 데이터 파이프라인의 일정을 설정하여 배포 후 작업을 간소화할 수 있습니다. Dataform의 출시 및 일정 탭에서 점 3개 메뉴를 사용하여 이 워크플로 구성을 수동으로 트리거할 수 있습니다.
Cortex Framework 데모를 배포하는 데 필요한 권한을 얻으려면 관리자에게 소스 및 타겟 프로젝트에 대한서비스 계정 토큰 생성자 (roles/iam.serviceAccountTokenCreator) IAM 역할을 부여해 달라고 요청하세요.
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
서비스 계정을 만들고 필요한 역할을 부여하려면 다음 스크립트를 사용하면 됩니다.
# Create the service account
gcloud iam service-accounts create cortex-dataform \
--description="Service account for Cortex Dataform execution" \
--display-name="Cortex Dataform Service Account" \
--project=PROJECT_ID
# Wait for the service account to propagate (IAM eventual consistency)
sleep 10
# Grant BigQuery DataEditor to the service account
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:cortex-dataform@PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/bigquery.dataEditor"
# Grant BigQuery jobUser to the service account
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:cortex-dataform@PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/bigquery.jobUser"
# Grant Dataform Editor to the service account
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:cortex-dataform@PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/dataform.editor"
# Grant the user Service Account Token Creator role on the Cortex service account
gcloud iam service-accounts add-iam-policy-binding \
cortex-dataform@PROJECT_ID.iam.gserviceaccount.com \
--member="user:USER_EMAIL" \
--role="roles/iam.serviceAccountTokenCreator" \
--project=PROJECT_ID
PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)")
## Note: In case the commands below should fail with message:
# "serviceAccount:service-$PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com" not found
# the default dataform service accounts hasn't been yet provisioned for given project.
# In such case, please execute the commands after initial run of `uv run cortex-*`
# Grant the Dataform Service Account the Token Creator role on the Cortex service account
gcloud iam service-accounts add-iam-policy-binding \
cortex-dataform@PROJECT_ID.iam.gserviceaccount.com \
--member="serviceAccount:service-$PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountTokenCreator" \
--project=PROJECT_ID
# Grant the Dataform Service Account the Service Account User role on the Cortex service account
gcloud iam service-accounts add-iam-policy-binding \
cortex-dataform@PROJECT_ID.iam.gserviceaccount.com \
--member="serviceAccount:service-$PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser" \
--project=PROJECT_ID
배포
다음 단계에 따라 가상 Python 환경을 만들고 종속 항목을 동기화하고 데이터 파이프라인을 트리거합니다. Cortex Framework uv 스크립트를 사용하여 데이터
애셋을 your Google Cloud project에 빌드하고 푸시하여 로컬 구성을
확장 가능한 실시간 데이터 아키텍처로 변환해야 합니다. 자세한 내용은 기본 요건 섹션의
uv 설치
를 참조하세요.
데모 배포 실행
다음 명령어를 실행하여 배포를 트리거합니다. 이 프로세스는 다음 작업을 실행합니다.
- 모든 기본 요건이 완료되었는지 확인합니다.
- 데모 목적으로 원시 레이어 역할을 하는 BigQuery 데이터 세트에 샘플 데이터를 로드합니다.
- Cortex Framework 데이터 레이어를 통해 샘플 데이터를 처리하기 위한 Dataform 파이프라인을 빌드합니다.
- Dataform 저장소 및 작업공간을 만든 다음 컴파일된 아티팩트를 저장소와 동기화합니다.
*선택사항: 서비스 계정이
--service_account와 함께 제공된 경우 워크플로 일정을 만들고 초기 Dataform 워크플로 실행을 트리거합니다.
기본값이 있는 데모 배포의 경우 다음 명령어를 실행합니다.
uv run cortex-demo --project_id=PROJECT_ID --sap_version s4
서비스 계정이 있는 데모 배포의 경우 다음 명령어를 실행합니다.
uv run cortex-demo --project_id=PROJECT_ID \
--service_account="cortex-dataform@PROJECT_ID.iam.gserviceaccount.com" \
--create_workflow_configs
인증
배포가 완료되면 다음을 실행합니다.
Dataform을 열어 저장소에서 생성된 새 코드를 검사합니다.
- Dataform 저장소 생성됨:
cortex-framework-demo - Dataform 저장소 내 개발 작업공간:
demo - 컴파일되고 동기화된 코드 (
Compiled graph를 클릭하여 그래프를 볼 수 있음)
- Dataform 저장소 생성됨:
Dataform 작업 수동 실행:
- Dataform 콘솔의 저장소 cortex-framework-demo에서 Dataform 작업공간 "demo"를 엽니다. Google Cloud
- 실행 시작 을 클릭합니다.
- 작업 실행 을 클릭합니다.
- 모든 작업 을 클릭합니다.
실행 시작 을 클릭합니다.
워크플로 실행 로그 탭을 사용하여 Dataform 저장소에서 모든 작업이 성공적으로 실행되었는지 모니터링합니다.
예약된 Dataform 작업 실행
배포 중에 --service_account 및 --create_workflow_configs 매개변수를 사용한 경우에만 적용됩니다.
- Dataform 콘솔에서 Dataform 저장소 cortex-framework-demo를 엽니다. Google Cloud
- 출시 및 일정 을 클릭합니다.
워크플로 구성 섹션에서 실행하려는 작업의 점 3개 메뉴를 클릭하고 지금 시작 을 클릭합니다.
워크플로 실행 로그 탭을 사용하여 Dataform 저장소에서 모든 작업이 성공적으로 실행되었는지 모니터링합니다.
BigQuery 콘솔로 이동하여
Datasets을 클릭하여 새로 생성된 데이터 세트를 보고 스키마와 데이터를 확인합니다. 생성된 데이터 세트:cortex_demo_sap_s4_raw: 이 데이터 세트에는 소스 시스템 (이 예에서는 SAP S/4HANA)의 원시 데이터가 포함되어 있습니다.cortex_demo_sap_s4_data_foundation: 이 데이터 세트는 원시 레이어의 원시 데이터가 CDC 처리되는 데이터 기반 레이어를 나타냅니다.cortex_demo_data_product: 이 데이터 세트에는 최종 사용자 소비를 위해 설계된 데모 데이터 제품(정제된 고성능 뷰 또는 테이블)이 포함되어 있습니다.cortex_demo_samples: 이 데이터 세트에는 샘플 소비 데이터 제품의 데모 데이터가 포함되어 있습니다.
데모 배포 리소스 정리
데모 배포가 완료되면 사용된 Google Cloud 리소스를 삭제하여 지속적인 요금이 청구되지 않도록 할 수 있습니다. 다음 스크립트는 생성된 BigQuery 데이터 세트, Dataform 작업공간, Dataform 저장소를 삭제합니다.
#!/bin/bash
# Define variables using names from uv-run-cortex-demo.md
PROJECT_ID="PROJECT_ID"
SAP_VERSION="s4"
DATAFORM_REGION="us-central1"
SOURCE_SAP_RAW_DATASET_ID="cortex_demo_sap_s4_raw"
TARGET_SAP_FOUNDATION_DATASET_ID="cortex_demo_sap_s4_data_foundation"
if [[ "$SAP_VERSION" == "ecc" ]]; then
SOURCE_SAP_RAW_DATASET_ID="cortex_demo_sap_ecc_raw"
TARGET_SAP_FOUNDATION_DATASET_ID="cortex_demo_sap_ecc_data_foundation"
fi
TARGET_DP_DATASET_ID="cortex_demo_data_product"
TARGET_SAMPLES_DATASET_ID="cortex_demo_samples"
REPOSITORY_NAME="cortex-framework-demo"
WORKSPACE_NAME="demo"
SERVICE_ACCOUNT_NAME="cortex-dataform"
# Color codes for formatting status output
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# Helper function to delete a resource and report status
delete_resource() {
local label=$1
local url=$2
local resource_type=$3
echo -n "${label}... "
local temp_file=$(mktemp)
local code=$(curl -s -o "${temp_file}" -w "%{http_code}" -X DELETE \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
"${url}")
if [ "$code" -eq 200 ] || [ "$code" -eq 204 ]; then
echo -e "${GREEN}ok${NC}"
elif [ "$code" -eq 404 ]; then
echo -e "${YELLOW}skipped, ${resource_type} not found${NC}"
else
echo -e "${RED}failed (HTTP ${code})${NC}"
if [ -s "${temp_file}" ]; then
echo " Error details:"
sed 's/^/ /' "${temp_file}"
fi
fi
rm -f "${temp_file}"
}
echo "Deleting BigQuery datasets..."
for DATASET_ID in "${SOURCE_SAP_RAW_DATASET_ID}" \
"${TARGET_SAP_FOUNDATION_DATASET_ID}" \
"${TARGET_DP_DATASET_ID}" \
"${TARGET_SAMPLES_DATASET_ID}"; do
echo "deleting ${PROJECT_ID}:${DATASET_ID}"
bq rm -r -f "${PROJECT_ID}:${DATASET_ID}"
done
ACCESS_TOKEN=$(gcloud auth print-access-token)
delete_resource "Deleting Dataform workspace ${WORKSPACE_NAME}" \
"https://dataform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${DATAFORM_REGION}/repositories/${REPOSITORY_NAME}/workspaces/${WORKSPACE_NAME}" \
"workspace"
echo "Deleting Dataform workflow configurations..."
WORKFLOW_CONFIGS_JSON=$(curl -s -H "Authorization: Bearer ${ACCESS_TOKEN}" \
"https://dataform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${DATAFORM_REGION}/repositories/${REPOSITORY_NAME}/workflowConfigs")
WORKFLOW_CONFIGS=$(echo "${WORKFLOW_CONFIGS_JSON}" | grep '"name":' | sed -E 's/.*"name": "([^"]+)".*/\1/')
if [ -z "${WORKFLOW_CONFIGS}" ]; then
echo -e " No workflow configurations found. ${YELLOW}skipped${NC}"
else
for config in ${WORKFLOW_CONFIGS}; do
delete_resource " Deleting workflow config: ${config##*/}" \
"https://dataform.googleapis.com/v1beta1/${config}" \
"workflow config"
done
fi
echo "Deleting Dataform release configurations..."
RELEASE_CONFIGS_JSON=$(curl -s -H "Authorization: Bearer ${ACCESS_TOKEN}" \
"https://dataform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${DATAFORM_REGION}/repositories/${REPOSITORY_NAME}/releaseConfigs")
RELEASE_CONFIGS=$(echo "${RELEASE_CONFIGS_JSON}" | grep '"name":' | sed -E 's/.*"name": "([^"]+)".*/\1/')
if [ -z "${RELEASE_CONFIGS}" ]; then
echo -e " No release configurations found. ${YELLOW}skipped${NC}"
else
for config in ${RELEASE_CONFIGS}; do
delete_resource " Deleting release config: ${config##*/}" \
"https://dataform.googleapis.com/v1beta1/${config}" \
"release config"
done
fi
delete_resource "Deleting Dataform repository ${REPOSITORY_NAME}" \
"https://dataform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${DATAFORM_REGION}/repositories/${REPOSITORY_NAME}?force=true" \
"repository"
if gcloud iam service-accounts describe "${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" --project="${PROJECT_ID}" >/dev/null 2>&1; then
read -p "Do you want to delete the service account ${SERVICE_ACCOUNT_NAME}? (y/N): " -r
if [[ "$REPLY" =~ ^[Yy]$ ]]; then
echo -n "Deleting service account ${SERVICE_ACCOUNT_NAME}... "
ERROR_MSG=$(gcloud iam service-accounts delete "${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" --project="${PROJECT_ID}" --quiet 2>&1)
EXIT_CODE=$?
if [ ${EXIT_CODE} -eq 0 ]; then
echo -e "${GREEN}ok${NC}"
else
echo -e "${RED}failed${NC}"
echo " Error details:"
echo "${ERROR_MSG}" | sed 's/^/ /'
fi
else
echo -e "Deleting service account ${SERVICE_ACCOUNT_NAME}... ${YELLOW}skipped (user cancelled)${NC}"
fi
else
echo -e "Deleting service account ${SERVICE_ACCOUNT_NAME}... ${YELLOW}skipped, service account not found${NC}"
fi
echo "Cortex Framework demo deployment cleanup complete."
다음 단계
프로덕션 배포를 따라 프로덕션 환경에서 Google Cloud Cortex Framework를 배포하는 방법을 알아보세요.
소스 시스템 통합에 관해 읽어보고 프로덕션 시스템을 연결하는 방법을 알아보세요.