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

1. مقدمة

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

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

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

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

ما الذي ستنشئه

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

1f19151bdd96acb0.png

المعلومات التي ستطّلع عليها

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

المتطلبات

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

2. قبل البدء

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

قبل البدء، ستحتاج إلى التأكّد من إضافة مشروعك إلى القائمة المسموح بها للمعاينة الخاصة لكل من Media CDN و"إضافات الخدمات" لـ 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 والمستودع.

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 باستخدام واجهة المستخدم الرسومية على النحو التالي:

  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.

تتألف كل تهيئة لشبكة توصيل محتوى الوسائط من موردين رئيسيين:

  • EdgeCacheService، مسؤولة عن الإعدادات الموجَّهة للعميل (بروتوكول أمان طبقة النقل (TLS)، وعنوان IP)، والتوجيه، وضبط شبكة توصيل المحتوى (CDN) (أوضاع ذاكرة التخزين المؤقت، وTTL، والتوقيع)، وسياسات الأمان.
  • EdgeCacheOrigin، وهو مسؤول عن ضبط أي مصدر مستند إلى HTTP، بالإضافة إلى شروط إعادة المحاولة عندما لا يكون المحتوى متاحًا أو يمكن الوصول إليه.

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

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

  1. في وحدة تحكُّم Google Cloud، انتقِل إلى صفحة 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 الذي تم إنشاؤه حديثًا في قائمة المصادر في مشروعك على صفحة Origins.

إعداد خدمة ذاكرة التخزين المؤقت على Edge

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

d2f9ac837bc5d45a.png

  1. في قسم "التوجيه"، انقر على إضافة قاعدة مضيف.
  2. إدخال حرف البدل - "*" في حقل "المضيفات".

25d3e25000934e59.png

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

d1975f366233521a.png

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

b7e77d059db84ab6.png

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

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

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

  1. في وحدة تحكُّم Google Cloud، انتقِل إلى صفحة 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 هو مدير الحزم العام في Google Cloud لإدارة عناصر الإصدار. يتم نشر مكونات إضافة الخدمة (Proxy-Wasm) في Artifact Registry. بعد نشرها في Artifact Registry، يمكن نشر مكونات Proxy-Wasm الإضافية في نشر Media CDN.

سنستخدم الأمر gcloud items 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" الوضع: "عادي" ونوع الموقع الجغرافي - "المنطقة" واختيار "us-central1 (آيوا)"
  5. انقر على الزر إنشاء.

b525b3bc0867dc42.png

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

بعد إنشاء مورد المستودع، شغِّل الأمر التالي في Cloud Shell لضبط برنامج Cloud Shell Docker لإرسال الحزم وسحبها باستخدام هذا المستودع.

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

إخراج:

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

8. تهيئة إضافات الخدمة على شبكة توصيل محتوى الوسائط

سنشرح الآن كيفية كتابة وإنشاء مكوّن إضافي لإضافة الخدمة (Proxy-Wasm) يمكن نشره على Media CDN، وذلك باستخدام لغة برمجة Rust.

في هذا المثال، سننشئ مكوّن Proxy-Wasm الإضافي الذي يتحقّق من احتواء كل طلب HTTP على عنوان تفويض بالقيمة "secret". وإذا لم يتضمن الطلب هذا العنوان، سينشئ المكون الإضافي استجابة HTTP 403 Forbidden.

تذكير سريع بشأن إضافات الخدمات: هناك ثلاثة موارد رئيسية: WasmAction وWasmconnectin وWasmLoadinVersion.

  • مورد WasmAction هو ما يتم إرفاقه بخدمة Media CDN EdgecacheService. يشير WasmAction إلى مورد Wasmplin.
  • يحتوي مورد WasmLoadin على إصدار رئيسي يتوافق مع الإصدار الحالي النشط من WasmAccessinVersion.
  • يشير WasmLoadinVersions إلى صورة حاوية من Artifact Registry. أثناء إجراء تغييرات على مكونات WasmLoadinVersions الإضافية، ستنشئ إصدارات مختلفة من WasmLoadinVersion.

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

22b3548b3a61c379.png

كتابة مكوّن إضافي لإضافة الخدمة وإنشاؤها

  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. بعد ذلك، يمكنك ضبط حزمة 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

والآن، نمضي قدمًا ونضغط على الزر "إنتاج" صورة الحاوية إلى المستودع.

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 الإضافي بنشر شبكة توصيل محتوى الوسائط

نحن الآن جاهزون لربط المكوّن الإضافي Proxy-Wasm بنشر شبكة توصيل محتوى الوسائط.

ترتبط مكونات Proxy-Wasm بمسارات Media CDN في مورد EdgecacheService.

  1. أولاً، ننشئ مورد Wasm-مكوّن إضافي للمكوّن الإضافي Proxy-Wasm.
gcloud alpha service-extensions wasm-plugins create my-wasm-plugin-resource
  1. بعد ذلك، ننشئ WasmplinVersion.
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 قد تم ربطه بنجاح مع Container Image (صورة الحاوية) في 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 للمسار المحدد، والذي يشير إلى مورد WasmComponentin الذي تم إنشاؤه سابقًا.
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. التحقق من صحة المكوّن الإضافي Proxy-Wasm لإضافات الخدمة على شبكة توصيل محتوى الوسائط

لاختبار ضبط خدمتك بشكل صحيح لتخزين المحتوى مؤقتًا، استخدِم أداة سطر الأوامر curl لإصدار الطلبات والتحقّق من الاستجابات.

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

يُفترض أن ينتج عن الأمر مخرجات مشابهة لما يلي:

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

والآن، يمكنك إصدار الطلب مرة أخرى باستخدام عنوان التفويض وقيمته السرية

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، علينا إنشاء إصدار WasmLoadinVersion جديد ثم تحديث الإصدار الرئيسي من Wasmplin للإشارة إلى الإصدار الجديد.

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-صف إضافي جديد، ستستخدم عملية العودة إلى الإصدارات السابقة إصدار الرمز الذي تم تشغيله قبل آخر عملية طرح.

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 وWasmplin وWasmplinVersions المرتبطة، يُرجى اتّباع الخطوات التالية.

أولاً، أزِل الإشارة إلى WasmAction في إعدادات Media CDN EdgecacheService.

السطر المرجعي المطلوب إزالته:

wasmAction: "my-wasm-action-resource"

بعد ذلك، نقوم بتحديث تهيئة EdgecacheService المعدَّلة.

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

بعد ذلك، حدِّث الإصدار الرئيسي من Wasmplin إلى سلسلة فارغة "".

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. تنظيف بيئة المختبر

بعد الانتهاء من CodeLab، لا تنسَ تنظيف موارد التمرين المعملي، وإلا ستستمر في التشغيل وتراكم التكاليف.

ستؤدي الأوامر التالية إلى حذف خدمة Media CDN Edgecache وEdgecache Config والمكوّن الإضافي ServiceExtensions. نفِّذ خطوات الحذف أدناه بالترتيب.

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 مع ضبط حزمة Cloud Storage على أنّها المصدر
  • كيفية إنشاء مكوِّن إضافي لإضافة الخدمة بمصادقة HTTP مخصَّصة وربطه بـ Media CDN
  • كيفية التحقّق من عمل مكوّن "إضافة الخدمة" الإضافي على النحو المتوقّع
  • (اختياري) طريقة إدارة مكوّن إضافي تابع لإحدى الخدمات، مثل تحديثه والإشارة إلى الإصدار السابق والرجوع إليه وحذفه

الخطوات التالية

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

قراءة إضافية

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