آزمایشگاه: برنامه های افزودنی سرویس در CDN رسانه

۱. مقدمه

آخرین به‌روزرسانی: 2024-05-01

شبکه‌های تحویل محتوا (CDN) با ذخیره‌سازی محتوای پرکاربرد در نزدیکی کاربران نهایی، قطع اتصالات در نزدیکی کلاینت‌ها، استفاده مجدد از اتصالات به مبدا و از طریق اتخاذ پروتکل‌ها و سفارشی‌سازی‌های شبکه مدرن، عملکرد کاربر را بهبود می‌بخشند.

Media CDN، شبکه جهانی لبه GCP برای پخش رسانه، قابلیت‌های داخلی یا «هسته» زیادی را ارائه می‌دهد. قابلیت‌های اصلی برای رسیدگی به رایج‌ترین موارد استفاده در نظر گرفته شده‌اند، اما ممکن است شما الزاماتی داشته باشید که توسط این مجموعه ویژگی‌های اصلی برطرف نشوند.

افزونه‌های سرویس برای Media CDN که گاهی اوقات با عنوان Edge Programmability نیز شناخته می‌شوند، به شما امکان می‌دهند کد خود را در لبه اجرا کنید تا رفتار Media CDN را سفارشی کنید. این امر موارد استفاده اضافی از جمله نرمال‌سازی کلید حافظه پنهان، احراز هویت توکن سفارشی و ابطال توکن، فیلدهای لاگ سفارشی اضافی، تست A/B و صفحه خطای سفارشی را در اختیار شما قرار می‌دهد.

آنچه خواهید ساخت

در این آزمایشگاه کد، مراحل استقرار یک محیط تحویل CDN با قابلیت Edge Compute را با Media CDN (CDN) + Service Extensions (قابلیت برنامه‌ریزی Edge) + Cloud Storage (منبع CDN) بررسی خواهیم کرد.

1f19151bdd96acb0.png

آنچه یاد خواهید گرفت

  • نحوه تنظیم Media CDN با تنظیم Cloud Storage Bucket به عنوان Origin
  • نحوه ایجاد یک افزونه افزونه سرویس با احراز هویت HTTP سفارشی و مرتبط کردن آن با Media CDN
  • چگونه تأیید کنیم که افزونه افزونه سرویس طبق انتظار کار می‌کند؟
  • (اختیاری) نحوه مدیریت افزونه افزونه خدمات مانند به‌روزرسانی، ارجاع، بازگشت به نسخه قبلی و حذف یک نسخه خاص افزونه

آنچه نیاز دارید

  • آشنایی اولیه با شبکه و HTTP
  • دانش پایه خط فرمان یونیکس/لینوکس

۲. قبل از شروع

درخواست لیست مجاز رسانه CDN و افزونه‌های سرویس

قبل از شروع، باید مطمئن شوید که پروژه شما به لیست مجاز پیش‌نمایش خصوصی برای هر دو Media CDN و Service Extensions for Media CDN اضافه شده است.

  • برای درخواست دسترسی به هر دو Media CDN و Service Extensions برای Media CDN، لطفاً با تیم حساب Google خود تماس بگیرید تا از طرف شما درخواست دسترسی برای Media CDN و Service Extensions ایجاد کنند.

۳. تنظیمات و الزامات

شروع پوسته ابری

اگرچه می‌توان از راه دور و از طریق لپ‌تاپ، گوگل کلود را مدیریت کرد، اما در این آزمایشگاه کد، از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهید کرد.

از کنسول GCP روی آیکون Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:

۱dec6f9683153af0.png

آماده‌سازی و اتصال به محیط فقط چند لحظه طول می‌کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:

de496bb88f9a0b10.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز شماست. این ماشین یک دایرکتوری خانگی دائمی ۵ گیگابایتی ارائه می‌دهد و روی فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود می‌بخشد. تمام کارهای شما در این آزمایشگاه را می‌توان به سادگی با یک مرورگر انجام داد.

قبل از اینکه شروع کنی

نقش‌ها و دسترسی‌های IAM

مجوزهای مدیریت هویت و دسترسی (IAM) مورد نیاز برای ایجاد منابع Media CDN و Artifact Registry به شرح زیر است:

  • نقش‌ها/خدمات شبکه.edgeCacheAdmin
  • role/networkservices.edgeCacheUser
  • role/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 و APIهای افزونه‌های سرویس از طریق دستورات زیر

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

۴. یک فضای ذخیره‌سازی ابری ایجاد کنید

محتوای رسانه‌ای CDN می‌تواند از مکان‌هایی مانند یک مخزن ذخیره‌سازی ابری، یک مکان ذخیره‌سازی شخص ثالث یا هر نقطه پایانی HTTP (HTTPS) قابل دسترسی عمومی سرچشمه بگیرد.

در این آزمایشگاه کد، محتوا را در یک فضای ذخیره‌سازی ابری ذخیره خواهیم کرد.

ما از دستور gsutil mb برای ایجاد سطل استفاده خواهیم کرد.

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

به صورت اختیاری، می‌توانید با استفاده از رابط کاربری گرافیکی (GUI) به صورت زیر یک سطل ذخیره‌سازی ابری ایجاد کنید:

  1. در کنسول گوگل کلود، به صفحه فضای ذخیره‌سازی ابری بروید.
  2. روی دکمه‌ی CREATE کلیک کنید.
  3. یک نام برای سطل وارد کنید. - یعنی "mediacdn-bucket-$PROJECT_ID".
  4. بقیه تنظیمات را به صورت پیش‌فرض بگذارید.
  5. روی دکمه‌ی CREATE کلیک کنید.

50475e01c5a3adbe.png

۵. یک شیء آزمایشی را در فضای ذخیره‌سازی ابری آپلود کنید

حالا یک شیء را در فضای ذخیره‌سازی ابری آپلود می‌کنیم.

  1. یک فایل در cloud shell ایجاد کنید و سپس آن را با استفاده از gsutil در باکت آپلود کنید.
echo media-cdn-service-extensions-test > file.txt

gsutil cp file.txt gs://mediacdn-bucket-$PROJECT_ID
  1. به رسانه CDN اجازه دسترسی به سطل را بدهید
gsutil iam ch \
serviceAccount:service-$PROJECT_NUM@gcp-sa-mediaedgefill.iam.gserviceaccount.com:objectViewer gs://mediacdn-bucket-$PROJECT_ID

۶. پیکربندی CDN رسانه‌ای

در مرحله بعد، پیکربندی Media CDN را ایجاد خواهیم کرد.

هر پیکربندی Media CDN از دو منبع اصلی تشکیل شده است:

  • EdgeCacheService ، مسئول پیکربندی سمت کلاینت (TLS، آدرس‌دهی IP)، مسیریابی، پیکربندی CDN (حالت‌های کش، TTLها، امضا) و سیاست‌های امنیتی.
  • EdgeCacheOrigin ، مسئول پیکربندی هر مبدأ برای هر مبدأ مبتنی بر HTTP، و همچنین شرایط تلاش مجدد در صورت عدم وجود یا عدم دسترسی به محتوا.

پیکربندی Edge Cache Origin

حالا بیایید یک مبدا ایجاد کنیم که به باکت ذخیره‌سازی ابری که تازه ایجاد کرده‌اید اشاره کند.

  1. در کنسول گوگل کلود، به صفحه Media CDN بروید.
  2. روی برگه ORIGINS کلیک کنید.
  3. روی ایجاد مبدا کلیک کنید.
  4. به عنوان نام مبدا حافظه پنهان لبه، عبارت «cloud-storage-origin» را وارد کنید.
  5. در قسمت آدرس مبدا:
  6. «یک مخزن ذخیره‌سازی ابری گوگل» را انتخاب کنید.
  7. به سراغ مخزن ذخیره‌سازی ابری با نام 'mediacdn-bucket-$PROJECT_ID' بروید.
  8. روی انتخاب کلیک کنید.
  9. بقیه تنظیمات را به صورت پیش‌فرض بگذارید.
  10. روی ایجاد مبدا کلیک کنید.

e6eb0faa94838c4.png

منبع EdgeCacheOrigin که به تازگی ایجاد شده است، در فهرست منابع پروژه شما در صفحه Origins ظاهر می‌شود.

پیکربندی سرویس حافظه پنهان لبه

  1. در کنسول گوگل کلود، به صفحه Media CDN بروید.
  2. روی برگه خدمات کلیک کنید.
  3. روی ایجاد سرویس کلیک کنید.
  4. یک نام منحصر به فرد برای سرویس خود وارد کنید - مثلاً 'media-cdn' - و سپس روی Next کلیک کنید.

d2f9ac837bc5d45a.png

  1. در بخش مسیریابی، روی افزودن قانون میزبان کلیک کنید.
  2. در فیلد Hosts علامت اختصاری "*" را وارد کنید.

25d3e25000934e59.png

  1. روی افزودن قانون مسیر کلیک کنید.
  2. برای اولویت، "1" را مشخص کنید.
  3. روی «افزودن شرط تطبیق» کلیک کنید، برای تطبیق مسیر، «مطابقت پیشوند» را به عنوان نوع تطبیق انتخاب کنید، «/» را در فیلد تطبیق مسیر مشخص کنید و سپس روی «انجام شد» کلیک کنید.
  4. در قسمت Primary action گزینه Fetch from an Origin را انتخاب کنید و سپس مبدایی را که پیکربندی کرده‌اید از لیست کشویی انتخاب کنید.

d1975f366233521a.png

  1. برای دسترسی به گزینه‌های بیشتر در تنظیمات، روی گزینه‌ی «پیکربندی‌های پیشرفته» کلیک کنید.
  2. در اکشن Route، روی ADD AN ITEM کلیک کنید. سپس موارد زیر را انجام دهید:
  3. برای نوع، «سیاست CDN» را انتخاب کنید.
  4. برای حالت حافظه پنهان، گزینه «همه را مجبور به ذخیره در حافظه پنهان کنید» را انتخاب کنید.
  5. بقیه را به صورت پیش‌فرض بگذارید
  6. روی «انجام شد» کلیک کنید.
  7. روی ذخیره کلیک کنید.

b7e77d059db84ab6.png

  1. روی ایجاد سرویس کلیک کنید.

منبع EdgeCacheService که به تازگی ایجاد شده است، در صفحه Services در لیست سرویس‌های پروژه شما ظاهر می‌شود.

آدرس IP MediaCDN را بازیابی کنید و آزمایش کنید

  1. در کنسول گوگل کلود، به صفحه Media CDN بروید.
  2. به 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 به عنوان Origin ایجاد کرده‌اید.

۷. پیکربندی رجیستری مصنوعات برای افزونه‌های سرویس

قبل از ایجاد افزونه‌های سرویس (Service Extensions)، باید رجیستری Artifact را پیکربندی کنیم. رجیستری Artifact، مدیر بسته جهانی Google Cloud برای مدیریت مصنوعات ساخت است. افزونه‌های افزونه سرویس (Proxy-Wasm) در رجیستری Artifact منتشر می‌شوند. پس از انتشار در رجیستری Artifact، افزونه‌های Proxy-Wasm می‌توانند در استقرار CDN رسانه شما مستقر شوند.

ما از دستور gcloud artifacts repositories create برای ایجاد مخزن استفاده خواهیم کرد.

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

به صورت اختیاری، می‌توانید با استفاده از رابط کاربری گرافیکی (GUI) به صورت زیر یک مخزن (Repository) ایجاد کنید:

  1. در کنسول گوگل کلود، به صفحه ثبت آثار باستانی بروید.
  2. روی دکمه + ایجاد مخزن کلیک کنید.
  3. یک نام برای مخزن وارد کنید. مثلاً 'service-extension-$PROJECT_ID'.
  4. قالب - «داکر»، حالت - «استاندارد»، نوع مکان - «منطقه» و انتخاب «us-central1 (آیووا)»
  5. روی دکمه‌ی CREATE کلیک کنید.

b525b3bc0867dc42.png

منبع تازه ایجاد شده‌ی Artifact Registry Repository باید در صفحه‌ی Repositories ظاهر شود.

پس از ایجاد منبع مخزن، دستور زیر را در Cloud Shell اجرا کنید تا کلاینت داکر Cloud Shell خود را برای ارسال و دریافت بسته‌ها با استفاده از این مخزن پیکربندی کنید.

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

خروجی:

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

۸. پیکربندی افزونه‌های سرویس در Media CDN

اکنون، ما نحوه نوشتن و ساخت یک افزونه Service Extension (Proxy-Wasm) را نشان خواهیم داد که می‌تواند با استفاده از زبان برنامه‌نویسی Rust در Media CDN مستقر شود.

در این مثال، ما یک افزونه Proxy-Wasm ایجاد خواهیم کرد که هر درخواست HTTP را بررسی می‌کند که آیا حاوی یک هدر Authorization با مقدار "secret" است یا خیر. اگر درخواست حاوی این هدر نباشد، افزونه یک پاسخ HTTP 403 Forbidden ایجاد می‌کند.

یک مرور سریع در مورد افزونه‌های سرویس - سه منبع کلیدی وجود دارد: WasmAction، WasmPlugin و WasmPluginVersion.

  • یک منبع WasmAction چیزی است که به Media CDN EdgeCacheService شما متصل می‌شود. یک WasmAction به یک منبع WasmPlugin ارجاع می‌دهد.
  • یک منبع WasmPlugin دارای یک نسخه اصلی است که با WasmPluginVersion فعال فعلی مطابقت دارد.
  • یک WasmPluginVersions به یک تصویر کانتینر از Artifact Registry ارجاع می‌دهد. همانطور که در افزونه‌های proxy-wasm خود تغییراتی ایجاد می‌کنید، WasmPluginVersions مختلفی ایجاد می‌کنید.

برای درک بهتر رابطه بین این منابع، لطفاً به نمودار زیر مراجعه کنید.

۲۲b3548b3a61c379.png

نوشتن و ساخت افزونه افزونه سرویس

  1. با دنبال کردن دستورالعمل‌های موجود در https://www.rust-lang.org/tools/install، ابزار Rust را نصب کنید.
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. حالا که فایل Manifest مربوط به 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 که قبلاً ایجاد کرده‌اید منتشر خواهیم کرد تا بتوان آن را در 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 منتشر یا "push" کنید. ما تصویر کانتینر خود را با برچسب '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 را با استقرار 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 با موفقیت به Container Image موجود در مخزن رجیستری Artifact مرتبط شده است، باید خروجی مشابهی را مشاهده کنید:

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

۹. افزونه‌ی 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
...

۱۰. اختیاری: مدیریت افزونه‌های Proxy-Wasm

به‌روزرسانی افزونه Proxy-Wasm

همانطور که افزونه‌های Proxy-Wasm خود را بهبود می‌بخشید یا قابلیت‌های جدیدی اضافه می‌کنید، باید افزونه‌های به‌روز شده خود را در Media CDN مستقر کنید. در زیر، مراحل استقرار نسخه به‌روز شده یک افزونه را بررسی می‌کنیم.

به عنوان مثال، می‌توانید کد افزونه نمونه را به‌روزرسانی کنید تا هدر Authorization را با مقدار دیگری برای احراز هویت ارزیابی کند، برای این کار کد را مانند زیر تغییر دهید.

ابتدا، فایل منبع 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، باید یک WasmPluginVersion جدید ایجاد کنیم و سپس نسخه اصلی 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 هر بار که یک منبع Wasm-plugin جدید ایجاد می‌شود، خلاصه تصویر تصویر Docker شما را ذخیره می‌کند، بازگرداندن به نسخه قبل از آخرین به‌روزرسانی از نسخه کد شما استفاده خواهد کرد.

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

۱۱. محیط آزمایشگاه را تمیز کنید

بعد از اینکه CodeLab را تکمیل کردید، فراموش نکنید که منابع آزمایشگاه را پاکسازی کنید - در غیر این صورت آنها همچنان در حال اجرا خواهند بود و هزینه ایجاد می‌کنند.

دستورات زیر سرویس 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

هر یک از دستورات بالا باید از شما بخواهد که حذف منبع را تأیید کنید.

۱۲. تبریک می‌گویم!

تبریک می‌گویم، شما بخش افزونه‌های سرویس روی کدلب مدیا CDN را تکمیل کردید!

آنچه ما پوشش داده‌ایم

  • نحوه تنظیم Media CDN با تنظیم Cloud Storage Bucket به عنوان Origin
  • نحوه ایجاد یک افزونه افزونه سرویس با احراز هویت HTTP سفارشی و مرتبط کردن آن با Media CDN
  • چگونه تأیید کنیم که افزونه افزونه سرویس طبق انتظار کار می‌کند؟
  • (اختیاری) نحوه مدیریت افزونه افزونه خدمات مانند به‌روزرسانی، ارجاع، بازگشت به نسخه قبلی و حذف یک نسخه خاص افزونه

بعدش چی؟

به برخی از این آزمایشگاه‌های کد نگاهی بیندازید...

مطالعه بیشتر

اسناد مرجع