סקירה כללית של ההגדרה

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

‫Media CDN מספק כמה משאבי API בארכיטקטורת REST:

  • EdgeCacheService, שאחראי על הגדרות שפונות ללקוח (TLS, כתובות IP), ניתוב, הגדרות CDN (מצבי מטמון, ערכי TTL, חתימה) ומדיניות אבטחה.
  • EdgeCacheOrigin, שאחראי על הגדרה לכל מקור שמבוסס על HTTP, וגם על תנאים לניסיון חוזר אם התוכן לא זמין או לא ניתן להגיע אליו. לדוגמה, כחלק מהגדרה של כלי מיותר לאריזת סרטונים.
  • ‫(Optional) EdgeCacheKeyset, which contains a set of public keys used for validating that client requests were signed by your infrastructure / CMS. EdgeCacheKeysets משויכים לEdgeCacheService, ואפשר להשתמש בהם בכמה שירותים.

בדוגמה הבאה מוצגים המשאבים האלה, שבה אפשר לראות את התנועה שמסתיימת ב-EdgeCacheService ואת הניתוב ל-EdgeCacheOrigins שונים.

דוגמה להגדרה עם EdgeCacheService שמפסיק את התנועה, בודק אם יש בקשות חתומות עם EdgeCacheKeyset אופציונלי ומנתב בקשות לשלושה EdgeCacheOrigins שונים.
דוגמה להגדרה עם EdgeCacheService שמסיים את התנועה, בודק בקשות חתומות עם EdgeCacheKeyset אופציונלי, ומנתב בקשות לשלושה EdgeCacheOrigins שונים.

הרשאות

צריכות להיות לכם הרשאות לניהול זהויות והרשאות גישה (IAM) שנדרשות ליצירת משאבי Media CDN. ל-Media CDN יש את התפקידים המוגדרים מראש הבאים ב-IAM:

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

הפעלת השירותים הנדרשים

כדי להגדיר ולפרוס שירותים של Media CDN, צריך להפעיל בפרויקט את Network Services API ואת Certificate Manager API.

המסוף

  1. מפעילים את Network Services API.

    הפעלה של ה-API

  2. מפעילים את Certificate Manager API.

    הפעלה של ה-API

gcloud

  1. מפעילים את Network Services API:

    gcloud services enable networkservices.googleapis.com
    
  2. מפעילים את Certificate Manager API:

    gcloud services enable certificatemanager.googleapis.com
    

מידע נוסף על הפעלה והשבתה של שירותים זמין במאמר שימוש בשירות.

הגדרה לדוגמה

ברשימת המשאבים הבאה מתוארת הגדרה מייצגת של Media CDN:

  • An EdgeCacheOrigin:

    • מקור שמבוסס על Cloud Storage ומנסה שוב אחזור מטמון ממקור חלופי (AWS S3) אם האובייקט לא נמצא ב-Cloud Storage (לדוגמה, HTTP 404) או אם נתקלים בשגיאה מסוג 5xx.
  • One EdgeCacheKeyset, שכולל:

    • שני מפתחות ציבוריים מסוג Ed25519, שמשמשים לאימות בקשות חתומות.
    • במסגרת הגדרת הדוגמה, אפשר להחליף מפתחות מדי חודש ולשמור שני מפתחות בייצור.
  • אחד EdgeCacheService עם שני מסלולים, כולל:

    • נתיב למניפסטים שמשויך למקור Cloud Storage, עם ערכי TTL קצרים של מטמון.
    • מסלול לקטעי וידאו, שמוגן על ידי בקשות חתומות ומשויך למקור Cloud Storage, מוגדר לשמירת כל התגובות במטמון.
  • IPv4,‏ IPv6, רישום ביומן מופעל (ברירת מחדל) ואישור SSL מנוהל מוגדר

בדוגמה הבאה אפשר לראות את הפלט של gcloud עבור ההגדרה הזו:

gcloud edge-cache origins describe prod-media-origin
id: "2295067926314745283"
creationTimestamp: "2019-11-13T09:53:48.757-08:00"
name: "prod-media-origin"
description: ""
originAddress: "gs://bucket_name/"
failoverOrigin: "s3-origin"
retryConditions: [HTTP_5XX, NOT_FOUND]
originProtocol: HTTP2
timeouts:
  connectTimeout: 5s
  maxAttemptsTimeout: 10
  responseTimeout: 6s
id: "2295067926314745283"
creationTimestamp: "2019-11-13T09:53:48.757-08:00"
name: "s3-origin"
description: ""
originAddress: "media.example.com.s3.amazonaws.com"
retryConditions: [HTTP_5XX, NOT_FOUND]
originProtocol: HTTP2
gcloud edge-cache keysets describe prod-keyset
id: "2295067926314745283"
creationTimestamp: "2019-11-13T09:53:48.757-08:00"
name: "prod-keyset"
publicKeys:
  - name: "sept-2020-key"
    value: "DThVLjhAKm3VYOvLBAwFZ5XbjVyF98Ias8NZU0WEM9w="
  - name: "aug-2020-key"
    value: "3nQa82ScYgDDAxJrKCqumSEg60VNODGR5dGAveJWsw4="
gcloud edge-cache services describe prod-media-service
name: "prod-media-service"
edgeSslCertificates:
  - "media-example-com-cert"
  - "video-serving-example-com-cert"
requireTls: true
routing:
  hostRules:
  - description: "prod hostnames"
    hosts:
      - "media.example.com"
      - "video-serving.example.net"
    pathMatcher: "routes"
  pathMatchers:
  - name: "routes"
    routeRules:
    - priority: 1
      description: "prod video segments"
      origin: "prod-media-origin"
      matchRules:
      - pathTemplateMatch: "/**.ts" # HLS segments
      - pathTemplateMatch: "/**.m4s" # DASH / CMAF segments
      routeAction:
        cdnPolicy:
          cacheMode: "FORCE_CACHE_ALL"
          clientTtl: 3600s
          defaultTtl: 86400s
          signedRequestMode: REQUIRE_SIGNATURES
          signedRequestKeySet: "prod-keyset"
      headerAction:
        responseHeadersToAdd:
        - headerName: cache-status
          headerValue: "{cdn_cache_status}"
        - headerName: proxy-status
          headerValue: "{proxy_status}"
    - priority: 2
      description: "prod manifest endpoints"
      origin: "prod-media-origin"
      matchRules:
      - pathTemplateMatch: "/**.m3u8" # HLS playlists
      - pathTemplateMatch: "/**.mpd" # DASH manifests
      routeAction:
        urlRewrite:
          pathPrefixRewrite: "/output/manifests"
        cdnPolicy:
          cacheMode: "CACHE_ALL_STATIC"
          clientTtl: 10s
          defaultTtl: 30s
          maxTtl: 120s
      headerAction:
        responseHeadersToAdd:
        - headerName: cache-status
          headerValue: "{cdn_cache_status}"
        - headerName: proxy-status
          headerValue: "{proxy_status}"
    - priority: 3 # catch all routes should be the lowest priority route
      description: "catch all route"
      origin: "prod-media-origin"
      matchRules:
      - prefixMatch: /
      headerAction:
        responseHeadersToAdd:
        - headerName: cache-status
          headerValue: "{cdn_cache_status}"
        - headerName: proxy-status
          headerValue: "{proxy_status}"

אפשרויות הגדרה של Media CDN

כדי להגדיר את Media CDN, אפשר להשתמש בכלים הבאים:

  • מסוףGoogle Cloud
  • קובצי YAML או JSON מיובאים
  • ממשקי ה-API ישירות

שימוש במסוף Google Cloud

מעבר אל Media CDN

הוראות להגדרת Media CDN בGoogle Cloud Console מפורטות במדריך למתחילים.

ייבוא וייצוא של הגדרות

באמצעות ה-CLI של gcloud אפשר לייצא ולייבא הגדרות מקובצי YAML או JSON, וכך לשלב עם מערכות של פיתוח רציף (continuous delivery) או באמצעות כלים של תשתית כקוד. אתם יכולים לשכפל הגדרות, לבדוק שירות מבודד בסביבת פיתוח לפני שאתם מעדכנים את סביבת הייצור, ולצלם תמונת מצב של ההגדרות כדי לשמור אותן בניהול גרסאות.

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

  • כתובות ה-IP לא מיובאות, כי הן מוקצות לכל שירות. שירותים לא יכולים לחלוק כתובות IP.
  • selfLink של המשאב, שמבוסס על שם המשאב.
  • ה-id של המשאב, שנוצר באופן אוטומטי.

כדי לייצא שירות, EdgeCacheOrigin או EdgeCacheKeyset, משתמשים בפקודת המשנה export לכל משאב. לדוגמה, כדי לייצא הגדרת שירות:

gcloud edge-cache services export SERVICE_NAME \
    --destination=my-service.yaml
Exported [projects/my-project/locations/global/edgeCacheServices/SERVICE_NAME] to 'my-service.yaml'.

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

gcloud edge-cache services import new-staging-service \
    --source=my-service.yaml

שימוש בפעולות אסינכרוניות של API

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

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

בודקים פעולה ספציפית (לפי המזהה שלה) כדי להבין את השגיאה בפירוט. לדוגמה, אם מגדירים logConfig.sampleRate בלי להגדיר גם את logConfig.enable = true, צפו לשגיאה הבאה:

gcloud edge-cache operations describe operation-1611525680496-5b9ac8fbb7f58-90a7a822-f0c1e8c6
done: true
error:
  message: "Logs sample rate must not be specified without enabling logging."
name: projects/my-project/locations/global/operations/operation-1611525680496-5b9ac8fbb7f58-90a7a822-f0c1e8c6

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

gcloud edge-cache operations list
END_TIME  ID                                                       TARGET  DONE
          operation-1611095421009-5b9486244bf21-cc6b5924-628b8e2a          True
          operation-1611096056610-5b94888273fe6-2da85286-8c810f8e          True
          operation-1611095551517-5b9486a0c251e-c2e1bbbb-de4aa8a5          True