1. مقدمه
آخرین به روز رسانی: 01-05-2024
شبکههای تحویل محتوا (CDN) عملکرد کاربر را با ذخیرهسازی محتوایی که اغلب به آنها دسترسی دارند، نزدیکتر به کاربران نهایی، پایان دادن به اتصالات نزدیکتر به مشتریان، استفاده مجدد از اتصالات به مبدا، و از طریق اتخاذ پروتکلهای شبکه مدرن و سفارشیسازی، بهبود میبخشند.
Media CDN، شبکه لبه جهانی GCP برای پخش رسانه، بسیاری از قابلیتهای داخلی یا «هستهای» را ارائه میکند. قابلیتهای اصلی برای رسیدگی به رایجترین موارد استفاده در نظر گرفته شدهاند، اما ممکن است نیازهایی نیز داشته باشید که توسط این ویژگی اصلی برطرف نشده است. مجموعه
برنامههای افزودنی سرویس برای CDN رسانه، که گاهی اوقات بهعنوان برنامهنویسی لبه نیز شناخته میشود، به شما امکان میدهد کد خود را در لبه اجرا کنید تا رفتار CDN رسانه را سفارشی کنید. این موارد استفاده اضافی را باز می کند، از عادی سازی کلید حافظه پنهان، احراز هویت توکن سفارشی و لغو توکن، فیلدهای ثبت سفارشی اضافی، تست A/B، و صفحه خطای سفارشی.
چیزی که خواهی ساخت
در این آزمایشگاه کد، مراحل استقرار یک محیط تحویل CDN با قابلیت Edge Compute را با CDN رسانه (CDN) + برنامههای افزودنی سرویس (برنامهنویسی لبه) + فضای ذخیرهسازی ابری (منبع CDN) طی میکنیم.
چیزی که یاد خواهید گرفت
- نحوه راهاندازی CDN رسانه با یک سطل ذخیرهسازی ابری که بهعنوان Origin تنظیم شده است
- نحوه ایجاد پلاگین Service Extension با احراز هویت سفارشی HTTP و مرتبط کردن آن با Media CDN
- چگونه می توان تأیید کرد که افزونه افزونه سرویس مطابق انتظار کار می کند
- (اختیاری) نحوه مدیریت یک افزونه افزونه خدمات مانند به روز رسانی، ارجاع دادن، بازگرداندن و حذف یک نسخه افزونه خاص
آنچه شما نیاز دارید
- شبکه های اولیه و دانش HTTP
- دانش اولیه خط فرمان یونیکس/لینوکس
2. قبل از شروع
درخواست برای Media CDN Allowlist & Service Extensions Allowlist
قبل از شروع، باید مطمئن شوید که پروژه شما به فهرست مجاز پیشنمایش خصوصی برای CDN رسانه و برنامههای افزودنی سرویس برای CDN رسانه اضافه شده است.
- برای درخواست دسترسی به CDN رسانه و برنامههای افزودنی سرویس برای CDN رسانه، لطفاً با تیم حساب Google خود تماس بگیرید تا از طرف شما درخواست دسترسی برای CDN رسانه و برنامههای افزودنی سرویس ایجاد کنند.
3. راه اندازی و الزامات
Cloud Shell را راه اندازی کنید
در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.
از کنسول GCP روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:
تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:
این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد و احراز هویت شبکه را تا حد زیادی افزایش می دهد. تمام کارهای شما در این آزمایشگاه به سادگی با یک مرورگر قابل انجام است.
قبل از شروع
نقش و دسترسی IAM
مجوزهای مدیریت هویت و دسترسی (IAM) مورد نیاز برای ایجاد رسانه CDN و منابع رجیستری مصنوع به شرح زیر است:
- roles/networkservices.edgeCacheAdmin
- roles/networkservices.edgeCacheUser
- roles/networkservices.edgeCacheViewer
- roles/artifactregistry.repoAdmin
در داخل Cloud Shell، مطمئن شوید که پروژه_id ، project_num ، مکان ، و متغیرهای محیط مخزن شما تنظیم شده باشند.
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. یک سطل ذخیره سازی ابری ایجاد کنید
محتوای CDN رسانه میتواند از مکانهایی مانند سطل فضای ذخیرهسازی ابری، مکان ذخیرهسازی شخص ثالث، یا هر نقطه پایانی HTTP (HTTPS) قابل دسترسی عمومی باشد.
در این لبه کد، ما محتوا را در یک سطل ذخیرهسازی ابری ذخیره میکنیم.
برای ایجاد سطل از دستور gsutil mb استفاده می کنیم
gsutil mb gs://mediacdn-bucket-$PROJECT_ID
به صورت اختیاری، میتوانید یک سطل فضای ذخیرهسازی ابری با استفاده از رابط کاربری گرافیکی به صورت زیر ایجاد کنید:
- در کنسول Google Cloud، به صفحه Cloud Storage بروید.
- روی دکمه CREATE کلیک کنید.
- یک نام برای سطل وارد کنید. - یعنی "mediacdn-bucket-$PROJECT_ID".
- بقیه تنظیمات را به عنوان پیش فرض بگذارید.
- روی دکمه CREATE کلیک کنید.
5. یک شی آزمایشی را در Cloud Storage Bucket آپلود کنید
اکنون یک شی را در سطل Cloud Storage آپلود می کنیم.
- یک فایل در پوسته ابری ایجاد کنید و سپس آن را با استفاده از gsutil در سطل آپلود کنید
echo media-cdn-service-extensions-test > file.txt gsutil cp file.txt gs://mediacdn-bucket-$PROJECT_ID
- به رسانه 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 ایجاد می کنیم.
هر پیکربندی CDN رسانه از دو منبع اصلی تشکیل شده است:
- EdgeCacheService ، مسئول پیکربندی رو به مشتری (TLS، آدرسدهی IP)، مسیریابی، پیکربندی CDN (حالتهای کش، TTL، امضا) و سیاستهای امنیتی.
- EdgeCacheOrigin ، مسئول پیکربندی هر منبع برای هر منبع مبتنی بر HTTP، و همچنین شرایطی که محتوا در دسترس یا قابل دسترسی نیست، دوباره امتحان کنید.
یک Edge Cache Origin را پیکربندی کنید
اکنون بیایید یک مبدا ایجاد کنیم که به سطل فضای ذخیرهسازی ابری اشاره میکند که به تازگی ایجاد کردهاید.
- در کنسول Google Cloud، به صفحه Media CDN بروید.
- روی تب ORIGINS کلیک کنید.
- روی CREATE ORIGIN کلیک کنید.
- "Cloud-storage-origin" را به عنوان نام منبع حافظه پنهان لبه وارد کنید.
- آدرس زیر مبدا:
- «انتخاب یک سطل فضای ذخیرهسازی ابری Google» را انتخاب کنید.
- به سطل Cloud Storage با نام "mediacdn-bucket-$PROJECT_ID" بروید.
- روی SELECT کلیک کنید.
- بقیه تنظیمات را به عنوان پیش فرض بگذارید.
- روی CREATE ORIGIN کلیک کنید.
منبع EdgeCacheOrigin جدید ایجاد شده در لیست مبدا پروژه شما در صفحه Origins ظاهر می شود.
یک سرویس کش لبه را پیکربندی کنید
- در کنسول Google Cloud، به صفحه Media CDN بروید.
- روی تب SERVICES کلیک کنید.
- روی CREATE SERVICE کلیک کنید.
- یک نام منحصر به فرد برای سرویس خود وارد کنید - یعنی 'media-cdn' - و سپس روی Next کلیک کنید.
- در بخش Routing، روی ADD HOST RULE کلیک کنید.
- علامت عام - "*" را در قسمت Hosts وارد کنید.
- روی ADD ROUTE RULE کلیک کنید.
- برای اولویت، "1" را مشخص کنید.
- روی افزودن شرایط مطابقت کلیک کنید، برای تطابق مسیر، «پیوند مطابقت» را به عنوان نوع تطبیق انتخاب کنید، «/» را در قسمت تطابق مسیر مشخص کنید و سپس روی «انجام شد» کلیک کنید.
- Fetch from an Origin را در قسمت Primary انتخاب کنید و سپس منبعی را که پیکربندی کرده اید در لیست کشویی انتخاب کنید.
- برای گسترش گزینه های پیکربندی بیشتر، روی تنظیمات پیشرفته کلیک کنید.
- در اقدام مسیر، روی افزودن یک مورد کلیک کنید. سپس، موارد زیر را انجام دهید:
- برای Type، "CDN Policy" را انتخاب کنید.
- برای حالت Cache، "Force cache all" را انتخاب کنید.
- بقیه را به عنوان پیش فرض بگذارید
- روی Done کلیک کنید.
- روی ذخیره کلیک کنید.
- روی CREATE SERVICE کلیک کنید.
منبع EdgeCacheService جدید ایجاد شده در صفحه خدمات در لیست خدمات پروژه شما ظاهر می شود.
آدرس IP MediaCDN و تست را بازیابی کنید
- در کنسول Google Cloud، به صفحه Media CDN بروید.
- به Media CDN بروید
- روی تب Services کلیک کنید.
- برای خدمات خود، به ستون آدرس ها مراجعه کنید.
برای آزمایش اینکه سرویس شما به درستی برای محتوای کش پیکربندی شده است، از ابزار خط فرمان 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 ایجاد کرده اید.
7. رجیستری مصنوع را برای برنامه های افزودنی سرویس پیکربندی کنید
قبل از ایجاد یک سرویس افزودنی، باید رجیستری Artifact را پیکربندی کنیم. Artifact Registry مدیر بسته جهانی Google Cloud برای مدیریت مصنوعات ساخت است. افزونه های Service Extension (Proxy-Wasm) در Artifact Registry منتشر می شوند. پس از انتشار در Artifact Registry، افزونههای 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
به صورت اختیاری، می توانید یک مخزن با استفاده از رابط کاربری گرافیکی به صورت زیر ایجاد کنید:
- در کنسول Google Cloud، به صفحه آرتیفکت رجیستری بروید.
- روی دکمه + CREATE REPOSITORY کلیک کنید.
- یک نام برای مخزن وارد کنید. یعنی 'service-extension-$PROJECT_ID'.
- قالب - 'Docker' Mode - 'Standard'، نوع مکان - 'Region'، و 'us-central1 (Iowa)' را انتخاب کنید
- روی دکمه CREATE کلیک کنید.
منبع تازه ایجاد شده Artifact Registry Repository باید در صفحه Repositories ظاهر شود.
هنگامی که منبع Repository ایجاد شد، دستور زیر را در Cloud Shell اجرا کنید تا کلاینت داکر Cloud Shell خود را برای فشار دادن و کشیدن بسته ها با استفاده از این مخزن پیکربندی کنید.
gcloud auth configure-docker $LOCATION-docker.pkg.dev
خروجی:
... Adding credentials for: us-central1-docker.pkg.dev Docker configuration file updated.
8. برنامه های افزودنی سرویس را در CDN رسانه پیکربندی کنید
اکنون، نحوه نوشتن و ساخت افزونه Service Extension (Proxy-Wasm) را نشان خواهیم داد که می تواند با استفاده از زبان برنامه نویسی Rust در Media CDN مستقر شود.
در این مثال، ما یک افزونه Proxy-Wasm ایجاد خواهیم کرد که تأیید می کند هر درخواست HTTP حاوی یک سرصفحه مجوز با مقدار "مخفی" است. اگر درخواست شامل این هدر نباشد، افزونه یک پاسخ HTTP 403 Forbidden ایجاد می کند.
یک تازهسازی سریع در افزونههای سرویس - سه منبع کلیدی وجود دارد: WasmAction، WasmPlugin و WasmPluginVersion.
- منبع WasmAction چیزی است که به رسانه CDN EdgeCacheService شما متصل می شود. WasmAction به یک منبع WasmPlugin ارجاع می دهد.
- یک منبع WasmPlugin دارای یک نسخه اصلی است که با WasmPluginVersion فعال فعلی مطابقت دارد.
- WasmPluginVersions به یک تصویر ظرف از Artifact Registry اشاره می کند. همانطور که در پلاگین های proxy-wasm خود تغییراتی ایجاد می کنید، WasmPluginVersions مختلفی ایجاد می کنید.
لطفا برای درک بهتر رابطه بین این منابع به نمودار زیر مراجعه کنید.
یک افزونه Service Extension بنویسید و بسازید
- با دنبال کردن دستورالعملها در https://www.rust-lang.org/tools/install ، زنجیره ابزار Rust را نصب کنید.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
- سپس با اجرای دستور زیر، پشتیبانی Wasm را به زنجیره ابزار Rust خود اضافه کنید:
rustup target add wasm32-wasi
- یک بسته Rust به نام my-wasm-plugin ایجاد کنید:
cargo new --lib my-wasm-plugin
خروجی:
Created library `my-wasm-plugin` package
- دایرکتوری my-wasm-plugin را وارد کنید و باید یک فایل
Cargo.toml
و یک دایرکتوریsrc
را ببینید.
cd my-wasm-plugin ls
خروجی:
Cargo.toml src
- در مرحله بعد، بسته 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"
- پس از ویرایش های شما، فایل
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"
- پس از ویرایش های شما، فایل
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 {}
- اکنون که فایل مانیفست
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 که قبلا ایجاد کردهاید منتشر میکنیم تا بتوان آن را در CDN رسانه مستقر کرد.
ابتدا افزونه های Proxy-Wasm را در یک تصویر ظرف بسته بندی می کنیم.
- فایلی به نام
Dockerfile
در همان دایرکتوری my-wasm-plugin با محتوای زیر ایجاد کنید:
FROM scratch
COPY target/wasm32-wasi/release/my_wasm_plugin.wasm plugin.wasm
- بعد، تصویر ظرف را بسازید:
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 ...
- در مرحله بعد، افزونه Proxy-Wasm خود را به رجیستری Artifact منتشر کرده یا «فشار» کنید. تصویر ظرف خود را با تگ "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 فرستاده شده است، باید خروجی مشابهی ببینید:
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 را با استقرار CDN رسانه شما مرتبط کنیم.
افزونههای Proxy-Wasm با مسیرهای CDN رسانه در منبع EdgeCacheService مرتبط هستند.
- ابتدا یک منبع Wasm-plugin برای پلاگین Proxy-Wasm خود ایجاد می کنیم.
gcloud alpha service-extensions wasm-plugins create my-wasm-plugin-resource
- بعد، یک 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"
- در مرحله بعد، نسخه اصلی افزونه 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... ... ... ...
- در مرحله بعد، ما یک منبع 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 ...
- اکنون، باید پیکربندی Media CDN EdgeCacheService خود را صادر کنیم:
gcloud edge-cache services export media-cdn --destination=my-service.yaml
- سپس، فایل my-service.yaml را باز کنید و یک wasmAction را به routeAction برای مسیر داده شده اضافه کنید، که به منبع WasmPlugin که قبلا ایجاد شده اشاره می کند.
wasmAction: "my-wasm-action-resource"
- پس از ویرایش های شما، فایل 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"
...
- سپس، پیکربندی به روز شده را با پیکربندی Proxy-Wasm در فایل
my-service-with-wasm.yaml
ذخیره می کنیم.
- در نهایت، پیکربندی به روز شده را برای محیط CDN Media تولیدی وارد می کنیم:
$ gcloud alpha edge-cache services import media-cdn --source=my-service-with-wasm.yaml
9. اعتبار افزونه Proxy-Wasm Service Extensions را در Media CDN تأیید کنید
برای آزمایش اینکه سرویس شما به درستی برای محتوای کش پیکربندی شده است، از ابزار خط فرمان curl برای صدور درخواست ها و بررسی پاسخ ها استفاده کنید.
curl -svo /dev/null "http://IP_ADDRESS/file.txt"
دستور باید خروجی مشابه زیر تولید کند:
< HTTP/2 403 Forbidden ... Access forbidden. ...
اکنون، دوباره درخواست را با یک هدر Authorization و مقدار مخفی آن صادر کنید
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 مستقر کنید. در زیر، ما مراحل استقرار یک نسخه به روز یک افزونه را طی می کنیم.
به عنوان مثال، میتوانید کد پلاگین نمونه را بهروزرسانی کنید تا هدر 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 وارد شود و بهطور زنده به استقرار 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. محیط آزمایشگاه را تمیز کنید
پس از تکمیل CodeLab، فراموش نکنید که منابع آزمایشگاه را پاکسازی کنید - در غیر این صورت آنها به کار خود ادامه می دهند و هزینه ها را افزایش می دهند.
دستورات زیر Media CDN EdgeCache Service، 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. تبریک می گویم!
تبریک میگوییم، شما برنامههای افزودنی سرویس را در Media CDN Codelab تکمیل کردهاید!
آنچه را پوشش داده ایم
- نحوه راهاندازی CDN رسانه با یک سطل ذخیرهسازی ابری که بهعنوان Origin تنظیم شده است
- نحوه ایجاد پلاگین Service Extension با احراز هویت سفارشی HTTP و مرتبط کردن آن با Media CDN
- چگونه می توان تأیید کرد که افزونه افزونه سرویس مطابق انتظار کار می کند
- (اختیاری) نحوه مدیریت یک افزونه افزونه خدمات مانند به روز رسانی، ارجاع دادن، بازگرداندن و حذف یک نسخه افزونه خاص
بعدش چی؟
برخی از این کدها را بررسی کنید...