تطبيق: إضافات الخدمة على Media CDN

1. مقدمة

تاريخ آخر تعديل: 2024-05-01

تساهم شبكات توصيل المحتوى (CDN) في تحسين أداء المستخدمين من خلال تخزين المحتوى الذي يتم الوصول إليه بشكل متكرر بالقرب من المستخدمين النهائيين، وإنهاء الاتصالات بالقرب من العملاء، وإعادة استخدام الاتصالات بالمصدر، ومن خلال استخدام بروتوكولات الشبكات الحديثة وعمليات التخصيص.

توفّر شبكة Media CDN، وهي شبكة الحافة العالمية من Google Cloud Platform لبث الوسائط، العديد من الإمكانات المضمّنة أو "الأساسية". وتهدف الإمكانات الأساسية إلى تلبية حالات الاستخدام الأكثر شيوعًا، ولكن قد تكون لديك أيضًا متطلبات لا تلبيها مجموعة الخصائص الأساسية هذه.

تتيح لك "إضافات الخدمة" في Media CDN، والتي يُشار إليها أحيانًا باسم "قابلية البرمجة على الحافة"، تشغيل الرمز الخاص بك على الحافة لتخصيص سلوك Media CDN. يؤدي ذلك إلى إتاحة حالات استخدام إضافية تتراوح بين تسوية مفتاح ذاكرة التخزين المؤقت والمصادقة على الرمز المميّز المخصّص وإبطال الرمز المميّز، وحقول السجلّ المخصّصة الإضافية، واختبار A/B، وصفحة الخطأ المخصّصة.

ما ستنشئه

في هذا الدرس التطبيقي حول الترميز، سنشرح الخطوات اللازمة لنشر بيئة توصيل شبكة CDN مفعَّلة باستخدام Edge Compute، وذلك من خلال Media CDN (شبكة CDN) وإضافات الخدمة (إمكانية البرمجة على الحافة) وCloud Storage (مصدر شبكة CDN).

1f19151bdd96acb0.png

ما ستتعلمه

  • كيفية إعداد Media CDN مع ضبط حزمة Cloud Storage كمصدر
  • كيفية إنشاء إضافة Service Extension باستخدام مصادقة HTTP مخصّصة وربطها بشبكة Media CDN
  • كيفية التأكّد من أنّ المكوّن الإضافي "إضافة الخدمة" يعمل على النحو المتوقّع
  • (اختياري) كيفية إدارة مكوّن إضافي لـ Service Extension، مثل التحديث والإشارة إلى إصدار مكوّن إضافي معيّن وإرجاعه وحذفه

المتطلبات

  • أساسيات الشبكات ومعرفة بروتوكول HTTP
  • معرفة أساسية بسطر الأوامر في نظامَي Unix وLinux

2. قبل البدء

طلب إضافة Media CDN و"إضافات الخدمة" إلى القائمة المسموح بها

قبل البدء، عليك التأكّد من إضافة مشروعك إلى قائمة السماح بالمعاينة الخاصة لكلّ من Media CDN وService Extensions for Media CDN.

  • لطلب الوصول إلى كلّ من Media CDN و"إضافات الخدمة على Media CDN"، يُرجى التواصل مع فريق حسابك على Google لإنشاء طلب وصول نيابةً عنك إلى Media CDN و"إضافات الخدمة".

3- الإعداد والمتطلبات

بدء Cloud Shell

على الرغم من إمكانية تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس التطبيقي حول الترميز Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

من وحدة تحكّم Google Cloud Platform، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:

1dec6f9683153af0.png

لن يستغرق توفير البيئة والاتصال بها سوى بضع لحظات. عند الانتهاء، من المفترض أن يظهر لك ما يلي:

de496bb88f9a0b10.png

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. توفّر هذه الخدمة دليلًا منزليًا ثابتًا بسعة 5 غيغابايت، وتعمل على Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إكمال جميع المهام في هذا التمرين المعملي باستخدام متصفّح فقط.

قبل البدء

أدوار إدارة الهوية وإمكانية الوصول

في ما يلي أذونات "إدارة الهوية وإمكانية الوصول" (IAM) المطلوبة لإنشاء موارد Media CDN وArtifact Registry:

  • 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

تفعيل واجهات برمجة التطبيقات

تفعيل واجهات برمجة التطبيقات الخاصة بشبكة توصيل محتوى الوسائط (Media CDN) وإضافات الخدمة من خلال الأوامر أدناه

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) يمكن الوصول إليها بشكل علني.

في هذا الدرس العملي، سنخزّن المحتوى في حزمة Cloud Storage.

سنستخدم الأمر gsutil mb لإنشاء الحزمة.

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

يمكنك اختياريًا إنشاء حزمة Cloud Storage باستخدام واجهة المستخدم التصويرية (GUI) على النحو التالي:

  1. في Google Cloud Console، انتقِل إلى صفحة 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: مسؤولة عن الإعدادات المخصّصة للعملاء (بروتوكول أمان طبقة النقل، وعناوين IP)، والتوجيه، وإعداد شبكة توصيل المحتوى (أوضاع التخزين المؤقت، وTTL، والتوقيع)، وسياسات الأمان
  • EdgeCacheOrigin: مسؤولة عن إعدادات كل مصدر لأي مصدر مستند إلى HTTP، بالإضافة إلى شروط إعادة المحاولة عندما لا يكون المحتوى متاحًا أو يمكن الوصول إليه.

ضبط مصدر Edge Cache

لننشئ الآن مصدرًا يشير إلى حزمة Cloud Storage التي أنشأتها للتو.

  1. في Google Cloud Console، انتقِل إلى صفحة Media CDN.
  2. انقر على علامة التبويب المصادر.
  3. انقر على إنشاء مصدر.
  4. أدخِل cloud-storage-origin كاسم لمصدر ذاكرة التخزين المؤقت على الحافة.
  5. ضمن "عنوان المصدر":
  6. اختَر "اختيار حزمة Google Cloud Storage".
  7. انتقِل إلى حزمة Cloud Storage المسماة mediacdn-bucket-$PROJECT_ID.
  8. انقر على "اختيار".
  9. اترك بقية الإعدادات على الإعداد التلقائي.
  10. انقر على إنشاء مصدر.

e6eb0faa94838c4.png

يظهر مورد EdgeCacheOrigin الذي تم إنشاؤه حديثًا في قائمة المصادر في مشروعك على صفحة "المصادر".

ضبط خدمة ذاكرة التخزين المؤقت على الحافة

  1. في Google Cloud Console، انتقِل إلى صفحة Media CDN.
  2. انقر على علامة التبويب الخدمات.
  3. انقر على إنشاء خدمة.
  4. أدخِل اسمًا فريدًا لخدمتك، مثل media-cdn، ثم انقر على "التالي".

d2f9ac837bc5d45a.png

  1. في قسم "التوجيه" (Routing)، انقر على إضافة قاعدة مضيف (ADD HOST RULE).
  2. أدخِل حرف البدل "*" في حقل "المضيفون".

25d3e25000934e59.png

  1. انقر على إضافة قاعدة توجيه.
  2. بالنسبة إلى "الأولوية"، حدِّد "1".
  3. انقر على إضافة شرط مطابقة، ثمّ اختَر "مطابقة البادئة" كنوع المطابقة في "مطابقة المسار"، وحدِّد "/" في حقل "مطابقة المسار"، ثمّ انقر على "تم".
  4. اختَر استرداد البيانات من مصدر ضمن "الإجراء الأساسي"، ثم اختَر المصدر الذي أعددته في القائمة المنسدلة.

d1975f366233521a.png

  1. انقر على الإعدادات المتقدّمة لتوسيع خيارات الإعدادات.
  2. في "إجراء التوجيه"، انقر على إضافة سؤال. بعد ذلك، يُرجى اتّباع الخطوات التالية:
  3. بالنسبة إلى "النوع"، اختَر "سياسة شبكة توصيل المحتوى".
  4. بالنسبة إلى "وضع التخزين المؤقت"، اختَر "فرض التخزين المؤقت للكل".
  5. اترك باقي الخيارات على الإعدادات التلقائية
  6. انقر على "تم".
  7. انقر على حفظ.

b7e77d059db84ab6.png

  1. انقر على إنشاء خدمة.

يظهر مورد EdgeCacheService الذي تم إنشاؤه حديثًا في صفحة "الخدمات" ضمن قائمة الخدمات في مشروعك.

استرداد عنوان IP الخاص بـ MediaCDN واختباره

  1. في Google Cloud Console، انتقِل إلى صفحة Media CDN.
  2. الانتقال إلى Media CDN
  3. انقر على علامة التبويب الخدمات.
  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 لـ "إضافات الخدمة"

قبل إنشاء "إضافات الخدمة"، يجب إعداد Artifact Registry. ‫Artifact Registry هي أداة شاملة لإدارة الحِزم في Google Cloud، وتُستخدَم لإدارة عناصر الإنشاء. يتم نشر مكوّنات Service Extension الإضافية (Proxy-Wasm) في Artifact Registry. بعد نشرها في Artifact Registry، يمكن نشر إضافات Proxy-Wasm في عملية نشر 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. في Google Cloud Console، انتقِل إلى صفحة Artifact Registry.
  2. انقر على الزر + إنشاء مستودع.
  3. أدخِل اسمًا للمستودع، مثل service-extension-$PROJECT_ID.
  4. التنسيق: Docker، والوضع: Standard، ونوع الموقع الجغرافي: Region، واختَر us-central1 (Iowa)
  5. انقر على الزر إنشاء.

b525b3bc0867dc42.png

من المفترض أن يظهر مصدر مستودع Artifact Registry الذي تم إنشاؤه حديثًا في صفحة "المستودعات".

بعد إنشاء مورد المستودع، شغِّل الأمر التالي في 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. ضبط إضافات الخدمة على شبكة توصيل محتوى الوسائط (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 الإضافية، يمكنك إنشاء إصدارات مختلفة من WasmPluginVersion.

يُرجى الرجوع إلى الرسم البياني أدناه لفهم العلاقة بين هذه المراجع بشكل أفضل.

22b3548b3a61c379.png

كتابة وإنشاء مكوّن إضافي لـ "إضافة الخدمة"

  1. ثبِّت مجموعة أدوات Rust باتّباع التعليمات الواردة في https://www.rust-lang.org/tools/install.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  1. بعد ذلك، أضِف إمكانية استخدام WebAssembly إلى مجموعة أدوات 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. بعد ذلك، اضبط حزمة Rust من خلال تعديل ملف Cargo.toml. بعد السطر [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

بعد اكتمال عملية الإنشاء بنجاح، ستظهر لك رسالة كما هو موضّح أدناه:

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. أولاً، ننشئ موردًا للمكوّن الإضافي 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 ونشرها مباشرةً في عملية نشر 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، لا تنسَ إزالة موارد الدرس التطبيقي، وإلا ستستمر في العمل وتتراكم التكاليف.

ستؤدي الأوامر التالية إلى حذف خدمة Media CDN EdgeCache وEdgeCache Config وService Extensions Plugin. يُرجى تنفيذ خطوات الحذف أدناه بالترتيب.

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. تهانينا!

تهانينا، لقد أكملت الدرس التطبيقي حول إضافات الخدمة على شبكة توصيل محتوى الوسائط (Media CDN).

المواضيع التي تناولناها

  • كيفية إعداد Media CDN مع ضبط حزمة Cloud Storage كمصدر
  • كيفية إنشاء إضافة Service Extension باستخدام مصادقة HTTP مخصّصة وربطها بشبكة Media CDN
  • كيفية التأكّد من أنّ المكوّن الإضافي "إضافة الخدمة" يعمل على النحو المتوقّع
  • (اختياري) كيفية إدارة مكوّن إضافي لـ Service Extension، مثل التحديث والإشارة إلى إصدار مكوّن إضافي معيّن وإرجاعه وحذفه

ما هي الخطوات التالية؟

اطّلِع على بعض دروس الترميز التطبيقية هذه...

Further reading

المستندات المرجعية