פריסת הדגמה

הפריסה של ההדגמה מציעה חוויה יעילה באמצעות מערך נתונים לדוגמה שהוגדר מראש. הוא מספק תהליך עבודה מקצה לקצה לפריסת צינורות עיבוד נתונים של Cortex Framework Dataform לניהול, ולאתחול מערכי הנתונים התואמים של BigQuery עם נתונים לדוגמה.

לפני שמתחילים

לפני שממשיכים בהדגמה של הפריסה, צריך לוודא שביצעתם את כל הפעולות הנדרשות שמפורטות בדף דרישות מוקדמות.

קבלת התפקידים וההרשאות הנדרשים ב-IAM

מקבלים את ההרשאות הנדרשות לניהול זהויות והרשאות גישה (IAM) כדי לפרוס תוכן של Cortex Framework בפרויקט היעד Google Cloud .

תפקידים בפרויקט היעד

כדי לקבל את ההרשאות שדרושות לפריסת Cortex Framework, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט היעד:

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

כדי להעניק למשתמש את התפקידים המבוקשים, אפשר להשתמש בסקריפט:

# 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 באופן ידני בכרטיסייה Release and Scheduling (פרסום ותזמון) באמצעות סמל האפשרויות הנוספות (3 נקודות).

כדי לקבל את ההרשאות שנדרשות לפריסת ההדגמה של Cortex Framework, צריך לבקש מהאדמין להקצות לכם את תפקיד ה-IAM‏ Service Account Token Creator (roles/iam.serviceAccountTokenCreator) בפרויקט המקור ובפרויקט היעד. כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

כדי ליצור את חשבון השירות ולהעניק את התפקידים הנדרשים, אפשר להשתמש בסקריפט הבא:

# 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 כדי ליצור ולדחוף את נכסי הנתונים לפרויקט Google Cloud , וכך להפוך את ההגדרות המקומיות לארכיטקטורת נתונים פעילה וניתנת להרחבה. מידע נוסף זמין בקטע uvהתקנה במאמר דרישות מוקדמות.

ביצוע פריסת ההדגמה

מריצים את הפקודה הבאה כדי להפעיל את הפריסה. במהלך התהליך הזה יבוצעו הפעולות הבאות:

  • מוודאים שכל התנאים המוקדמים מתקיימים.
  • טוענים נתונים לדוגמה למערך נתונים ב-BigQuery כדי שישמשו כשכבת הנתונים הגולמיים לצורכי הדגמה.
  • יצירת צינורות Dataform לעיבוד הנתונים לדוגמה דרך שכבות הנתונים של Cortex Framework.
  • יוצרים את מאגר 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 

אימות

אחרי שהפריסה מסתיימת:

  1. פותחים את Dataform כדי לבדוק את הקוד החדש שנוצר במאגר:

    1. נוצר מאגר Dataform: cortex-framework-demo
    2. במאגר Dataform, סביבת הפיתוח: demo
    3. קוד שעבר קומפילציה וסנכרון (אפשר לראות את התרשים בלחיצה על Compiled graph).
  2. הרצה ידנית של פעולות Dataform:

    1. פותחים את סביבת העבודה של Dataform:‏ demo ממאגר cortex-framework-demo במסוף Google Cloud Dataform.
    2. לוחצים על התחלת ההרצה.
    3. לוחצים על Execute actions (ביצוע פעולות).
    4. לוחצים על כל הפעולות.
    5. לוחצים על התחלת ההרצה.

    6. אפשר לעקוב אחרי ההפעלה המוצלחת של כל הפעולות במאגר Dataform באמצעות הכרטיסייה Workflow Execution Logs (יומני הפעלת תהליכי עבודה).

  3. הפעלה של פעולות מתוזמנות ב-Dataform

הפרמטר הזה רלוונטי רק אם השתמשתם בפרמטרים --service_account ו---create_workflow_configs במהלך ההטמעה:

  1. פותחים את מאגר Dataform cortex-framework-demo במסוף Google Cloud Dataform.
  2. לוחצים על פרסום ותזמון.
  3. בקטע Workflow configurations (הגדרות של תהליכי עבודה), לוחצים על סמל האפשרויות הנוספות (3 נקודות) של הפעולה שרוצים להריץ ואז על Start now (התחלה עכשיו).

  4. אפשר לעקוב אחרי ההפעלה המוצלחת של כל הפעולות במאגר Dataform באמצעות הכרטיסייה Workflow Execution Logs (יומני הפעלת תהליכי עבודה).

  5. עוברים אל מסוף 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."

השלבים הבאים