Lab: תוספי שירות ב-Media CDN

1. מבוא

עדכון אחרון: 1 במאי 2024

רשתות להעברת תוכן (CDN) משפרות את ביצועי המשתמשים על ידי שמירת תוכן שמתבצעת אליו גישה לעיתים קרובות במטמון קרוב יותר למשתמשי הקצה, סגירת חיבורים קרוב יותר ללקוחות, שימוש חוזר בחיבורים למקור ואימוץ של פרוטוקולי רשת מודרניים והתאמות אישיות.

‫Media CDN, רשת קצה גלובלית של GCP לסטרימינג של מדיה, מספקת הרבה יכולות מובנות או 'בסיסיות'. היכולות הבסיסיות נועדו לתת מענה לתרחישי השימוש הנפוצים ביותר, אבל יכול להיות שיהיו לכם גם דרישות שלא מקבלות מענה על ידי קבוצת התכונות הבסיסית הזו.

Service Extensions לשירות Media CDN, שנקראים גם Edge Programmability, מאפשרים להריץ קוד משלכם ב-Edge כדי להתאים אישית את ההתנהגות של Media CDN. האפשרות הזו פותחת תרחישי שימוש נוספים, החל מנרמול של מפתח מטמון, אימות של אסימון מותאם אישית וביטול אסימון, שדות יומן מותאמים אישית נוספים, בדיקות A/B ודף שגיאה מותאם אישית.

מה תפַתחו

בשיעור ה-Lab הזה נסביר איך לפרוס סביבת מסירת תוכן של CDN עם תמיכה ב-Edge Compute באמצעות Media CDN (CDN) + Service Extensions (Edge Programmability) + Cloud Storage (מקור ה-CDN).

1f19151bdd96acb0.png

מה תלמדו

  • איך מגדירים Media CDN באמצעות קטגוריה של Cloud Storage שהוגדרה כמקור
  • איך יוצרים תוסף Service Extension עם אימות HTTP מותאם אישית ומשייכים אותו ל-Media CDN
  • איך לוודא שהפלאגין Service Extension פועל כמו שצריך
  • (אופציונלי) איך לנהל פלאגין של Service Extension, למשל לעדכן, להפנות, לבטל עדכון ולמחוק גרסה ספציפית של פלאגין

מה תצטרכו

  • ידע בסיסי ברשתות ו-HTTP
  • ידע בסיסי בשורת הפקודה של Unix/Linux

‫2. לפני שמתחילים

בקשה להוספה לרשימת ההיתרים של Media CDN ולרשימת ההיתרים של Service Extensions

לפני שמתחילים, צריך לוודא שהפרויקט שלכם נוסף לרשימת ההיתרים של התצוגה המקדימה הפרטית גם ל-Media CDN וגם ל-Service Extensions for Media CDN.

  • כדי לבקש גישה גם ל-Media CDN וגם ל-Service Extensions for Media CDN, צריך לפנות לצוות חשבון Google כדי ליצור בשמך בקשת גישה ל-Media CDN ול-Service Extensions

3. הגדרה ודרישות

מפעילים את Cloud Shell

אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-codelab הזה תשתמשו ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.

ב-GCP Console, לוחצים על סמל Cloud Shell בסרגל הכלים שבפינה הימנית העליונה:

1dec6f9683153af0.png

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

de496bb88f9a0b10.png

המכונה הווירטואלית הזו כוללת את כל הכלים שדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. אפשר לבצע את כל העבודה ב-Lab הזה רק באמצעות דפדפן.

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

תפקידים וגישה ב-IAM

כדי ליצור משאבים ב-Media CDN וב-Artifact Registry, צריך את ההרשאות הבאות בניהול הזהויות והרשאות הגישה (IAM):

  • roles/networkservices.edgeCacheAdmin
  • roles/networkservices.edgeCacheUser
  • roles/networkservices.edgeCacheViewer
  • roles/artifactregistry.repoAdmin

ב-Cloud Shell, מוודאים שמשתני הסביבה project_id,‏ project_num,‏ location ו-repository מוגדרים.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
PROJECT_ID=[YOUR-PROJECT-NAME]
PROJECT_NUM=[YOUR-PROJECT-NUMBER]
LOCATION=us-central1
REPOSITORY=service-extension-$PROJECT_ID

הפעלת ממשקי API

מפעילים את Media CDN ואת Service Extensions APIs באמצעות הפקודות שמוצגות למטה.

gcloud services enable networkservices.googleapis.com
gcloud services enable networkactions.googleapis.com
gcloud services enable edgecache.googleapis.com
gcloud services enable artifactregistry.googleapis.com

4. יצירת קטגוריה של Cloud Storage

התוכן ב-Media CDN יכול להגיע ממיקומים כמו קטגוריה של Cloud Storage, מיקום אחסון של צד שלישי או כל נקודת קצה של HTTP(HTTPS) שנגישה לציבור.

ב-Codelab זה נאחסן תוכן בקטגוריה של Cloud Storage.

נשתמש בפקודה gsutil mb כדי ליצור את הקטגוריה.

gsutil mb gs://mediacdn-bucket-$PROJECT_ID

אפשר גם ליצור קטגוריה של Cloud Storage באמצעות ממשק המשתמש הגרפי, באופן הבא:

  1. במסוף Google Cloud, עוברים לדף Cloud Storage.
  2. לוחצים על הלחצן יצירה.
  3. מזינים שם לקטגוריה. ‫- כלומר, mediacdn-bucket-$PROJECT_ID.
  4. משאירים את שאר ההגדרות כברירת מחדל.
  5. לוחצים על הלחצן יצירה.

50475e01c5a3adbe.png

5. העלאת אובייקט בדיקה לקטגוריה של Cloud Storage

עכשיו נעלה אובייקט לקטגוריה של Cloud Storage.

  1. יוצרים קובץ ב-Cloud Shell ואז מעלים אותו לקטגוריה באמצעות gsutil
echo media-cdn-service-extensions-test > file.txt

gsutil cp file.txt gs://mediacdn-bucket-$PROJECT_ID
  1. הענקת גישה ל-Media CDN לקטגוריה
gsutil iam ch \
serviceAccount:service-$PROJECT_NUM@gcp-sa-mediaedgefill.iam.gserviceaccount.com:objectViewer gs://mediacdn-bucket-$PROJECT_ID

6. הגדרת Media CDN

בשלב הבא ניצור הגדרה של Media CDN.

כל הגדרה של Media CDN מורכבת משני משאבים עיקריים:

  • EdgeCacheService, שאחראי על הגדרות שפונות ללקוח (TLS, כתובות IP), ניתוב, הגדרות CDN (מצבי מטמון, ערכי TTL, חתימה) ומדיניות אבטחה.
  • EdgeCacheOrigin, שאחראי על הגדרת כל מקור מבוסס HTTP, וגם על תנאים לניסיון חוזר כשהתוכן לא זמין או לא נגיש.

הגדרת המקור למטמון הקצה

עכשיו ניצור מקור שמפנה לקטגוריה של Cloud Storage שיצרתם.

  1. במסוף Google Cloud, עוברים לדף Media CDN.
  2. לוחצים על הכרטיסייה מקורות.
  3. לוחצים על CREATE ORIGIN (יצירת מקור).
  4. מזינים 'cloud-storage-origin' כשם של המקור למטמון הקצה.
  5. בקטע 'כתובת המקור':
  6. בוחרים באפשרות 'בחירת קטגוריה של Cloud Storage'.
  7. לוחצים על 'עיון' כדי לעבור לקטגוריה של Cloud Storage בשם mediacdn-bucket-$PROJECT_ID.
  8. לוחצים על 'בחירה'.
  9. משאירים את שאר ההגדרות כברירת מחדל.
  10. לוחצים על CREATE ORIGIN (יצירת מקור).

e6eb0faa94838c4.png

משאב EdgeCacheOrigin שנוצר לאחרונה מופיע ברשימת המקורות בפרויקט בדף Origins (מקורות).

הגדרת שירות Edge Cache

  1. במסוף Google Cloud, עוברים לדף Media CDN.
  2. לוחצים על הכרטיסייה שירותים.
  3. לוחצים על CREATE SERVICE.
  4. מזינים שם ייחודי לשירות – למשל, media-cdn – ולוחצים על Next (הבא).

d2f9ac837bc5d45a.png

  1. בקטע 'ניתוב', לוחצים על הוספת כלל של מארח.
  2. מזינים את התו הכללי '*' בשדה 'מארחים'.

25d3e25000934e59.png

  1. לוחצים על הוספת כלל ניתוב.
  2. בעמודה 'עדיפות', מציינים '1'.
  3. לוחצים על הוספת תנאי התאמה. בהתאמה לנתיב, בוחרים באפשרות 'התאמה לקידומת' כסוג ההתאמה, מציינים '/' בשדה 'התאמה לנתיב' ולוחצים על 'סיום'.
  4. בקטע 'פעולה ראשית', בוחרים באפשרות Fetch from an Origin (אחזור מ-Origin) ואז בוחרים את ה-Origin שהגדרתם ברשימה הנפתחת.

d1975f366233521a.png

  1. לוחצים על הגדרות מתקדמות כדי להרחיב את אפשרויות ההגדרה.
  2. בפעולת הניתוב, לוחצים על הוספת פריט. לאחר מכן, מבצעים את הפעולות הבאות:
  3. בקטע Type (סוג), בוחרים באפשרות CDN policy (מדיניות CDN).
  4. במצב מטמון, בוחרים באפשרות 'אילוץ מטמון של הכול'.
  5. משאירים את שאר ההגדרות כברירת מחדל
  6. לוחצים על 'סיום'.
  7. לוחצים על שמירה.

b7e77d059db84ab6.png

  1. לוחצים על CREATE SERVICE.

המשאב EdgeCacheService שנוצר מופיע בדף Services ברשימת השירותים בפרויקט.

אחזור כתובת ה-IP של MediaCDN ובדיקה

  1. במסוף Google Cloud, עוברים לדף Media CDN.
  2. מעבר אל Media CDN
  3. לוחצים על הכרטיסייה Services (שירותים).
  4. בעמודה כתובות מופיעה הכתובת של השירות.

4031b6d1eac89041.png

כדי לבדוק שהשירות מוגדר בצורה נכונה לשמירת תוכן במטמון, משתמשים בכלי curl של שורת הפקודה כדי לשלוח בקשות ולבדוק את התשובות.

curl -svo /dev/null "http://MEDIA_CDN_IP_ADDRESS/file.txt"

הפלט של הפקודה אמור להיראות כך:

< HTTP/2 200 OK
...
media-cdn-service-extensions-test
...

יצרתם בהצלחה פריסה של MediaCDN עם Cloud Storage כמקור.

7. הגדרת Artifact Registry לתוספי שירות

לפני שיוצרים Service Extensions, צריך להגדיר את Artifact Registry. ‫Artifact Registry הוא מנהל חבילות אוניברסלי של Google Cloud לניהול פריטי מידע שנוצרו בתהליך פיתוח (artifacts) בגרסת build. תוספים של Service Extension‏ (Proxy-Wasm) מתפרסמים ב-Artifact Registry. אחרי שמפרסמים תוספים של Proxy-Wasm ב-Artifact Registry, אפשר לפרוס אותם בפריסת Media CDN.

נשתמש בפקודה gcloud artifacts repositories create כדי ליצור את המאגר.

gcloud artifacts repositories create service-extension-$PROJECT_ID \
    --repository-format=docker \
    --location=$LOCATION \
    --description="Repo for Service Extension" \
    --async

אפשר גם ליצור מאגר באמצעות ממשק המשתמש הגרפי באופן הבא:

  1. נכנסים לדף Artifact Registry במסוף Google Cloud.
  2. לוחצים על הלחצן + CREATE REPOSITORY (יצירת מאגר).
  3. מזינים שם למאגר, למשל service-extension-$PROJECT_ID.
  4. ‫Format (פורמט) – Docker,‏ Mode (מצב) – Standard,‏ Location Type (סוג מיקום) – Region, ובוחרים באפשרות us-central1 (Iowa).
  5. לוחצים על הלחצן יצירה.

b525b3bc0867dc42.png

מאגר המשאבים החדש של Artifact Registry Repository אמור להופיע בדף Repositories (מאגרים).

אחרי שיוצרים את מאגר המשאבים, מריצים את הפקודה הבאה ב-Cloud Shell כדי להגדיר את לקוח Docker של Cloud Shell כך שידחוף וימשוך חבילות באמצעות המאגר הזה.

gcloud auth configure-docker $LOCATION-docker.pkg.dev

פלט:

...
Adding credentials for: us-central1-docker.pkg.dev
Docker configuration file updated.

8. הגדרת Service Extensions ב-Media CDN

עכשיו נראה איך לכתוב וליצור פלאגין של Service Extension ‏ (Proxy-Wasm) שאפשר לפרוס ב-Media CDN, באמצעות שפת התכנות Rust.

בדוגמה הזו, ניצור תוסף Proxy-Wasm שבודק אם כל בקשת HTTP מכילה כותרת Authorization עם הערך secret. אם הבקשה לא מכילה את הכותרת הזו, הפלאגין ייצור תגובה מסוג HTTP 403 Forbidden.

תזכורת קצרה לגבי תוספים לשירותים – יש שלושה משאבים עיקריים: WasmAction,‏ WasmPlugin ו-WasmPluginVersion.

  • משאב WasmAction הוא מה שמצורף ל-Media CDN EdgeCacheService. ‫WasmAction מפנה למשאב WasmPlugin.
  • למשאב WasmPlugin יש גרסה ראשית שתואמת ל-WasmPluginVersion הפעיל הנוכחי.
  • ‫WasmPluginVersions מפנה לקובץ אימג' של קונטיינר מ-Artifact Registry. כשמבצעים שינויים בתוספים של proxy-wasm, נוצרות גרסאות שונות של WasmPlugin.

כדי להבין טוב יותר את הקשר בין המשאבים האלה, כדאי לעיין בתרשים שלמטה.

22b3548b3a61c379.png

כתיבה ופיתוח של תוסף Service Extension

  1. מתקינים את ערכת הכלים של Rust לפי ההוראות שבכתובת https://www.rust-lang.org/tools/install.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  1. לאחר מכן, מוסיפים תמיכה ב-Wasm לשרשרת הכלים של Rust על ידי הרצת הפקודה הבאה:
rustup target add wasm32-wasi
  1. יוצרים חבילת Rust בשם my-wasm-plugin:
cargo new --lib my-wasm-plugin

פלט:

Created library `my-wasm-plugin` package
  1. נכנסים לספרייה my-wasm-plugin. אמורים לראות קובץ Cargo.toml וספרייה src.
cd my-wasm-plugin
ls

פלט:

Cargo.toml  src
  1. לאחר מכן, עורכים את הקובץ Cargo.toml כדי להגדיר את חבילת Rust. אחרי השורה [dependencies] בקובץ Cargo.toml, מוסיפים את הטקסט הבא:
proxy-wasm = "0.2"
log = "0.4"

[lib]
crate-type = ["cdylib"]

[profile.release]
lto = true
opt-level = 3
codegen-units = 1
panic = "abort"
strip = "debuginfo"
  1. אחרי העריכות, קובץ Cargo.toml צריך להיראות בערך כך:
[package]
name = "my-wasm-plugin"
version = "0.1.0"
edition = "2021"

[dependencies]
proxy-wasm = "0.2"
log = "0.4"

[lib]
crate-type = ["cdylib"]

[profile.release]
lto = true
opt-level = 3
codegen-units = 1
panic = "abort"
strip = "debuginfo"
  1. . מעתיקים את כל התוכן של הקובץ sample_code לקובץ lib.rs בספרייה src ב-Cloud Shell.
  1. אחרי העריכות, קובץ lib.rs צריך להיראות בערך כך:
use log::info;
use proxy_wasm::traits::*;
use proxy_wasm::types::*;

...

struct DemoPlugin;

impl HttpContext for DemoPlugin {
    fn on_http_request_headers(&mut self, _: usize, _: bool) -> Action {
        if self.get_http_request_header("Authorization") == Some(String::from("secret")) {
            info!("Access granted.");
            Action::Continue
        } else {
            self.send_http_response(403, vec![], Some(b"Access forbidden.\n"));
            Action::Pause
        }
    }
}

impl Context for DemoPlugin {}
  1. אחרי שהגדרנו את קובץ המניפסט Cargo.toml וכתבנו את קוד ה-Proxy-Wasm בקובץ lib.rs , אפשר ליצור את הפלאגין Proxy-Wasm.
cargo build --release --target wasm32-wasi

אחרי שה-build יסתיים בהצלחה, תופיע הודעה כמו זו שמוצגת למטה:

Finished release [optimized] target(s) in 1.01s

כדאי גם לאמת את הספרייה target ולבדוק שהקבצים נוצרו:

ls ./target

הפלט ייראה כך:

CACHEDIR.TAG release wasm32-wasi

פרסום פלאגין של Proxy-Wasm ב-Artifact Registry

עכשיו נפרסם את התוסף Proxy-Wasm במאגר Artifact Registry שיצרתם קודם, כדי שאפשר יהיה לפרוס אותו ב-Media CDN.

קודם אנחנו אורזים את התוספים של Proxy-Wasm בקובץ אימג' של קונטיינר.

  1. יוצרים קובץ בשם Dockerfile באותה ספרייה my-wasm-plugin, עם התוכן הבא:
FROM scratch 
COPY target/wasm32-wasi/release/my_wasm_plugin.wasm plugin.wasm
  1. לאחר מכן, יוצרים את קובץ האימג' של הקונטיינר:
docker build --no-cache --platform wasm -t my-wasm-plugin .

(מעבדים שאינם x86 בלבד) לאחר מכן, יוצרים את קובץ האימג' של הקונטיינר:

docker build --no-cache --platform wasm --provenance=false -t my-wasm-plugin . 

פלט

[+] Building 0.2s (5/5) FINISHED                                     docker:default
...
  1. לאחר מכן, מפרסמים או "דוחפים" את התוסף Proxy-Wasm ל-Artifact Registry. אנחנו נתייג את קובץ האימג' של קונטיינר בתג prod.
docker tag my-wasm-plugin $LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/my-wasm-plugin:prod

עכשיו נדחוף את קובץ האימג' של הקונטיינר עם התג prod למאגר.

docker push $LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/my-wasm-plugin:prod

פלט:

The push refers to repository 
...
8564ddd9910a: Pushed 
prod: digest: sha256:f3ae4e392eb45393bfd9c200cf8c0c261762f7f39dde5c7cd4b9a8951c6f2812 size: 525

עכשיו נבדוק שקובץ האימג' של קונטיינר התוסף Proxy-Wasm נדחף בהצלחה אל Artifact Registry. הפלט אמור להיראות כך:

gcloud artifacts docker images list $LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/my-wasm-plugin --include-tags

פלט:

Listing items under project 
...
IMAGE                                         DIGEST           TAGS  CREATE_TIME          UPDATE_TIME
<LOCATION>-docker.pkg.dev/.../my-wasm-plugin  sha256:08c12...  prod  2021-11-10T23:31:27  2021-11-10T23:31:27

שיוך של תוסף Proxy-Wasm לפריסת Media CDN

עכשיו אפשר לשייך את התוסף Proxy-Wasm לפריסת Media CDN.

תוספים של Proxy-Wasm משויכים למסלולים של Media CDN במשאב EdgeCacheService.

  1. קודם יוצרים משאב Wasm-plugin בשביל הפלאגין Proxy-Wasm.
gcloud alpha service-extensions wasm-plugins create my-wasm-plugin-resource
  1. בשלב הבא, יוצרים WasmPluginVersion.
gcloud alpha service-extensions wasm-plugin-versions create my-version-1 \
    --wasm-plugin=my-wasm-plugin-resource \
    --image="$LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/my-wasm-plugin:prod"
  1. בשלב הבא, מציינים את הגרסה הראשית של התוסף Proxy-Wasm.
gcloud alpha service-extensions wasm-plugins update my-wasm-plugin-resource \
    --main-version=my-version-1

עכשיו נבדוק שהתוסף Proxy-Wasm שויך בהצלחה לקובץ האימג' בקונטיינר שמאוחסן במאגר Artifact Registry. הפלט אמור להיראות כך:

gcloud alpha service-extensions wasm-plugin-versions list --wasm-plugin=my-wasm-plugin-resource

פלט:

NAME   WASM_IMAGE WASM_IMAGE_DIGEST CONFIG_SIZE  CONFIG_IMAGE CONFIG_IMAGE_DIGEST UPDATE_TIME                                            
c7cfa2 <LOCATION>-docker.pkg.dev/.../my-wasm-plugin@sha256:6d663... ... ... 
...
  1. אחר כך, יוצרים משאב WasmAction שמפנה למשאב הפלאגין Wasm.
gcloud alpha service-extensions wasm-actions create my-wasm-action-resource \
    --wasm-plugin=my-wasm-plugin-resource

כדאי גם לוודא שמשאב ה-WasmAction שויך בהצלחה לתוסף Proxy-Wasm. הפלט אמור להיראות כך:

gcloud alpha service-extensions wasm-actions list

פלט:

NAME                                     WASMPLUGIN                                            
my-wasm-action-resource                  projects/805782461588/locations/global/wasmPlugins/myenvoyfilter-resource
...
  1. עכשיו צריך לייצא את ההגדרה של Media CDN EdgeCacheService:
gcloud edge-cache services export media-cdn --destination=my-service.yaml
  1. לאחר מכן, פותחים את הקובץ my-service.yaml ומוסיפים wasmAction ל-routeAction עבור הנתיב הנתון, שמפנה למשאב WasmPlugin שנוצר קודם.
wasmAction: "my-wasm-action-resource"
  1. אחרי העריכה, הקובץ my-service.yaml צריך להיראות בערך כך:
...

pathMatchers:
  - name: routes
    routeRules:
    - headerAction: {}
      matchRules:
      - prefixMatch: /
      origin: projects/<PROJECT_NUM>/locations/global/edgeCacheOrigins/cloud-storage-origin
      priority: '1'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 3600s
          signedRequestMode: DISABLED
        wasmAction: "my-wasm-action-resource"
...
  1. לאחר מכן, שומרים את התצורה המעודכנת עם הגדרת Proxy-Wasm בקובץ my-service-with-wasm.yaml.
  1. לבסוף, מייבאים את התצורה המעודכנת לסביבת הייצור של Media CDN:
$ gcloud alpha edge-cache services import media-cdn --source=my-service-with-wasm.yaml

9. אימות של תוסף Service Extensions Proxy-Wasm ב-Media CDN

כדי לבדוק שהשירות מוגדר בצורה נכונה לשמירת תוכן במטמון, משתמשים בכלי curl של שורת הפקודה כדי לשלוח בקשות ולבדוק את התשובות.

curl -svo /dev/null "http://IP_ADDRESS/file.txt"

הפלט של הפקודה אמור להיראות כך:

< HTTP/2 403 Forbidden
...
Access forbidden.
...

עכשיו, שולחים שוב את הבקשה עם כותרת Authorization והערך שלה secret

curl -svo /dev/null "http://IP_ADDRESS/file.txt" -H "Authorization: secret"

הפלט של הפקודה אמור להיראות כך:

< HTTP/2 200 OK
...
media-cdn-service-extensions-test
...

10. אופציונלי: ניהול תוספים של Proxy-Wasm

עדכון של פלאגין Proxy-Wasm

כשמשפרים את הפלאגינים של Proxy-Wasm או מוסיפים להם פונקציונליות חדשה, צריך לפרוס את הפלאגינים המעודכנים ב-Media CDN. בהמשך מוסבר איך פורסים גרסה מעודכנת של תוסף.

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

קודם כל, מעדכנים את קובץ המקור src/lib.rs עם הקוד שמוצג בהמשך:

use log::{info, warn};
use proxy_wasm::traits::*;
use proxy_wasm::types::*;

...

struct DemoPlugin;

impl HttpContext for DemoPlugin {
    fn on_http_request_headers(&mut self, _: usize, _: bool) -> Action {
        if self.get_http_request_header("Authorization") == Some(String::from("another_secret")) {
            info!("Access granted.");
            Action::Continue
        } else {
            warn!("Access forbidden.");
            self.send_http_response(403, vec![], Some(b"Access forbidden.\n"));
            Action::Pause
        }
    }
}

impl Context for DemoPlugin {}

בשלב הבא, בונים, אורזים ומפרסמים את הפלאגין המעודכן:

cargo build --release --target wasm32-wasi
docker build --no-cache --platform wasm -t my-wasm-plugin .
docker tag my-wasm-plugin $LOCATION-docker.pkg.dev/$PROJECT_NUM/$REPOSITORY/my-wasm-plugin:prod
docker push $LOCATION-docker.pkg.dev/$PROJECT_NUM/$REPOSITORY>/my-wasm-plugin:prod

אחרי שקובץ אימג' של קונטיינר מתעדכן ב-Artifact Registry, צריך ליצור WasmPluginVersion חדש ואז לעדכן את ‎–main-version של WasmPlugin כדי להפנות לגרסה החדשה.

gcloud alpha service-extensions wasm-plugin-versions create my-version-2 \
    --wasm-plugin=my-wasm-plugin-resource \
   --image="$LOCATION-docker.pkg.dev/$PROJECT_NUM/$REPOSITORY>/my-wasm-plugin:prod"
gcloud alpha service-extensions wasm-plugins update my-wasm-plugin-resource \
    --main-version=my-version-2

עכשיו עדכנתם בהצלחה את הגרסה של קובץ אימג' של קונטיינר לייבוא מ-Artifact Registry, והעברתם אותה לשימוש פעיל ב-Deployment (פריסה) של Media CDN.

חזרה לגרסה קודמת

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

קודם כל, מציגים את הגרסאות הזמינות:

gcloud alpha service-extensions wasm-plugin-versions list --wasm-plugin=my-wasm-plugin-resource

הפלט אמור להיראות כך:

NAME   WASM_IMAGE WASM_IMAGE_DIGEST CONFIG_SIZE  CONFIG_IMAGE CONFIG_IMAGE_DIGEST UPDATE_TIME                                            
c7cfa2 <LOCATION>-docker.pkg.dev/.../my-wasm-plugin@sha256:6d663... ... ... 
a2a8ce <LOCATION>-docker.pkg.dev/.../my-wasm-plugin@sha256:08c12... ... ... 

לאחר מכן, מעדכנים את משאב הפלאגין Wasm כך שיפנה לגרסה הקודמת, a2a8ce:

$ gcloud alpha service-extensions wasm-plugins update my-wasm-plugin-resource \
    --main-version="a2a8ce"

אם הפעולה הושלמה בהצלחה, הפלט אמור להיראות כך:

✓ WASM Plugin [my-wasm-plugin-resource] is now serving version "a2a8ce"

מכיוון ש-Media CDN שומר את תקציר התמונה של קובץ אימג' של Docker בכל פעם שנוצר משאב חדש של Wasm-plugin, הפעולה להחזרה לגרסה הקודמת תשתמש בגרסת הקוד שהופעלה לפני ההשקה האחרונה.

gcloud alpha service-extensions wasm-plugins describe my-wasm-plugin-resource \
  --expand-config

לגרסה a2a8ce, זו הגרסה עם הגיבוב sha256:08c12...‎:

name: "my-wasm-plugin-resource"
mainVersion: "a2a8ce"
mainVersionDetails:
  image: "<LOCATION>-docker.pkg.dev/<PROJECT>/<REPOSITORY>/my-wasm-plugin"
  imageDigest: "<LOCATION>-docker.pkg.dev/<PROJECT>/<REPOSITORY>/my-wasm-plugin@sha256:08c121dd7fd1e4d3a116a28300e9fc1fa41b2e9775620ebf3d96cb7119bd9976"

מחיקת WasmAction ו-WasmPlugin

כדי למחוק WasmAction,‏ WasmPlugin ואת WasmPluginVersions המשויכים, פועלים לפי השלבים הבאים.

קודם צריך להסיר את ההפניה אל WasmAction בהגדרות של Media CDN EdgeCacheService.

שורה להפניה שצריך להסיר:

wasmAction: "my-wasm-action-resource"

לאחר מכן, אנחנו מעדכנים את ההגדרה של EdgeCacheService.

gcloud alpha edge-cache services import prod-media-service --source=my-service.yaml

בשלב הבא, מעדכנים את הגרסה הראשית של WasmPlugin למחרוזת ריקה "".

gcloud alpha service-extensions wasm-plugins update my-wasm-plugin-resource --main-version=
""

לבסוף, מבצעים את שלבי המחיקה הבאים לפי הסדר.

gcloud alpha service-extensions wasm-actions delete my-wasm-action-resource

gcloud alpha service-extensions wasm-plugin-versions delete my-version \ --wasm-plugin=my-wasm-plugin-resource

gcloud alpha service-extensions wasm-plugins delete my-wasm-plugin-resource

11. לפנות את סביבת ה-Lab

אחרי שמסיימים את ה-CodeLab, חשוב לזכור למחוק את המשאבים של ה-Lab, אחרת הם ימשיכו לפעול ולצבור עלויות.

הפקודות הבאות ימחקו את שירות Media CDN EdgeCache, את EdgeCache Config ואת התוסף Service Extensions. מבצעים את השלבים הבאים למחיקה לפי הסדר.

gcloud edge-cache services delete media-cdn

gcloud edge-cache origins delete cloud-storage-origin

gcloud alpha service-extensions wasm-actions delete my-wasm-action-resource

gcloud alpha service-extensions wasm-plugins update my-wasm-plugin-resource --main-version=""

gcloud alpha service-extensions wasm-plugin-versions delete my-version-1 --wasm-plugin=my-wasm-plugin-resource

gcloud alpha service-extensions wasm-plugins delete my-wasm-plugin-resource

gcloud artifacts repositories delete service-extension-$PROJECT_ID --location=$LOCATION

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

12. מעולה!

כל הכבוד, סיימתם את ה-Codelab בנושא Service Extensions ב-Media CDN!

מה נכלל

  • איך מגדירים Media CDN באמצעות קטגוריה של Cloud Storage שהוגדרה כמקור
  • איך יוצרים תוסף Service Extension עם אימות HTTP מותאם אישית ומשייכים אותו ל-Media CDN
  • איך לוודא שהפלאגין Service Extension פועל כמו שצריך
  • (אופציונלי) איך לנהל פלאגין של Service Extension, למשל לעדכן, להפנות, לבטל עדכון ולמחוק גרסה ספציפית של פלאגין

מה השלב הבא?

כדאי לעיין ב-Codelabs הבאים…

קריאה נוספת

מאמרי עזרה