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

1. مقدمه

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

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

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

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

چیزی که خواهی ساخت

در این آزمایشگاه کد، مراحل استقرار یک محیط تحویل CDN با قابلیت Edge Compute را با CDN رسانه (CDN) + برنامه‌های افزودنی سرویس (برنامه‌نویسی لبه) + فضای ذخیره‌سازی ابری (منبع CDN) طی می‌کنیم.

1f19151bdd96acb0.png

چیزی که یاد خواهید گرفت

  • نحوه راه‌اندازی 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 در نوار ابزار بالا سمت راست کلیک کنید:

1dec6f9683153af0.png

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

de496bb88f9a0b10.png

این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 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

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

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

50475e01c5a3adbe.png

5. یک شی آزمایشی را در Cloud Storage Bucket آپلود کنید

اکنون یک شی را در سطل Cloud Storage آپلود می کنیم.

  1. یک فایل در پوسته ابری ایجاد کنید و سپس آن را با استفاده از 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

6. Media CDN را پیکربندی کنید

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

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

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

یک Edge Cache Origin را پیکربندی کنید

اکنون بیایید یک مبدا ایجاد کنیم که به سطل فضای ذخیره‌سازی ابری اشاره می‌کند که به تازگی ایجاد کرده‌اید.

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

e6eb0faa94838c4.png

منبع EdgeCacheOrigin جدید ایجاد شده در لیست مبدا پروژه شما در صفحه Origins ظاهر می شود.

یک سرویس کش لبه را پیکربندی کنید

  1. در کنسول Google Cloud، به صفحه Media CDN بروید.
  2. روی تب SERVICES کلیک کنید.
  3. روی CREATE SERVICE کلیک کنید.
  4. یک نام منحصر به فرد برای سرویس خود وارد کنید - یعنی 'media-cdn' - و سپس روی Next کلیک کنید.

d2f9ac837bc5d45a.png

  1. در بخش Routing، روی ADD HOST RULE کلیک کنید.
  2. علامت عام - "*" را در قسمت Hosts وارد کنید.

25d3e25000934e59.png

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

d1975f366233521a.png

  1. برای گسترش گزینه های پیکربندی بیشتر، روی تنظیمات پیشرفته کلیک کنید.
  2. در اقدام مسیر، روی افزودن یک مورد کلیک کنید. سپس، موارد زیر را انجام دهید:
  3. برای Type، "CDN Policy" را انتخاب کنید.
  4. برای حالت Cache، "Force cache all" را انتخاب کنید.
  5. بقیه را به عنوان پیش فرض بگذارید
  6. روی Done کلیک کنید.
  7. روی ذخیره کلیک کنید.

b7e77d059db84ab6.png

  1. روی CREATE SERVICE کلیک کنید.

منبع EdgeCacheService جدید ایجاد شده در صفحه خدمات در لیست خدمات پروژه شما ظاهر می شود.

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

  1. در کنسول Google Cloud، به صفحه Media CDN بروید.
  2. به Media CDN بروید
  3. روی تب Services کلیک کنید.
  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 ایجاد کرده اید.

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

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

  1. در کنسول Google Cloud، به صفحه آرتیفکت رجیستری بروید.
  2. روی دکمه + CREATE REPOSITORY کلیک کنید.
  3. یک نام برای مخزن وارد کنید. یعنی 'service-extension-$PROJECT_ID'.
  4. قالب - 'Docker' Mode - 'Standard'، نوع مکان - 'Region'، و 'us-central1 (Iowa)' را انتخاب کنید
  5. روی دکمه CREATE کلیک کنید.

b525b3bc0867dc42.png

منبع تازه ایجاد شده 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 مختلفی ایجاد می کنید.

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

22b3548b3a61c379.png

یک افزونه Service Extension بنویسید و بسازید

  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. در مرحله بعد، بسته 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 که قبلا ایجاد کرده‌اید منتشر می‌کنیم تا بتوان آن را در 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 منتشر کرده یا «فشار» کنید. تصویر ظرف خود را با تگ "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 مرتبط هستند.

  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. در نهایت، پیکربندی به روز شده را برای محیط 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
  • چگونه می توان تأیید کرد که افزونه افزونه سرویس مطابق انتظار کار می کند
  • (اختیاری) نحوه مدیریت یک افزونه افزونه خدمات مانند به روز رسانی، ارجاع دادن، بازگرداندن و حذف یک نسخه افزونه خاص

بعدش چی؟

برخی از این کدها را بررسی کنید...

در ادامه مطلب

اسناد مرجع