Lab: मीडिया सीडीएन पर सेवा एक्सटेंशन

1. परिचय

पिछले अपडेट की तारीख: 01-05-2024

कॉन्टेंट डिलीवरी नेटवर्क (सीडीएन), उपयोगकर्ताओं की परफ़ॉर्मेंस को बेहतर बनाते हैं. इसके लिए, वे अक्सर ऐक्सेस किए जाने वाले कॉन्टेंट को असली उपयोगकर्ताओं के डिवाइसों के आस-पास की कैश मेमोरी में सेव करते हैं. साथ ही, क्लाइंट के आस-पास के कनेक्शन बंद करते हैं, ओरिजनल सर्वर से कनेक्शन का फिर से इस्तेमाल करते हैं, और आधुनिक नेटवर्किंग प्रोटोकॉल और कस्टम सेटिंग का इस्तेमाल करते हैं.

Media CDN, मीडिया को स्ट्रीम करने के लिए GCP का ग्लोबल एज नेटवर्क है. इसमें कई सुविधाएं पहले से मौजूद हैं या "कोर" सुविधाएं उपलब्ध हैं. कोर सुविधाओं का मकसद, सबसे ज़्यादा इस्तेमाल किए जाने वाले मामलों को हल करना है. हालांकि, ऐसा हो सकता है कि आपकी कुछ ज़रूरतें, इन कोर सुविधाओं से पूरी न हों.

Media CDN के लिए सेवा एक्सटेंशन को कभी-कभी एज प्रोग्रामेबिलिटी भी कहा जाता है. इसकी मदद से, एज पर अपना कोड चलाया जा सकता है. इससे Media CDN के व्यवहार को पसंद के मुताबिक बनाया जा सकता है. इससे इस्तेमाल के कई और उदाहरणों को अनलॉक किया जा सकता है. जैसे, कैश मेमोरी की कुंजी को सामान्य बनाना, कस्टम टोकन की पुष्टि करना और टोकन रद्द करना, कस्टम लॉग फ़ील्ड जोड़ना, A/B टेस्टिंग, और कस्टम गड़बड़ी पेज.

आपको क्या बनाने को मिलेगा

इस कोडलैब में, हम Media CDN (सीडीएन) + Service Extensions (Edge Programmability) + Cloud Storage (सीडीएन का सोर्स) की मदद से, Edge Compute की सुविधा वाले सीडीएन डिलीवरी एनवायरमेंट को डिप्लॉय करने के चरणों के बारे में जानेंगे.

1f19151bdd96acb0.png

आपको क्या सीखने को मिलेगा

  • Cloud Storage बकेट को ओरिजन के तौर पर सेट करके, Media CDN को सेट अप करने का तरीका
  • कस्टम एचटीटीपी पुष्टि करने की सुविधा वाला सर्विस एक्सटेंशन प्लगिन बनाने और उसे Media CDN से जोड़ने का तरीका
  • यह पुष्टि कैसे करें कि Service Extension प्लगिन उम्मीद के मुताबिक काम कर रहा है
  • (वैकल्पिक) सर्विस एक्सटेंशन प्लगिन को मैनेज करने का तरीका. जैसे, किसी प्लगिन के वर्शन को अपडेट करना, उसका रेफ़रंस देना, उसे पहले जैसा करना, और मिटाना

आपको इन चीज़ों की ज़रूरत होगी

  • नेटवर्किंग की बुनियादी जानकारी और एचटीटीपी के बारे में जानकारी
  • Unix/Linux कमांड लाइन की बुनियादी जानकारी

2. शुरू करने से पहले

Media CDN और सेवा एक्सटेंशन की अनुमति वाली सूची में शामिल होने का अनुरोध

शुरू करने से पहले, आपको यह पक्का करना होगा कि आपके प्रोजेक्ट को Media CDN और Media CDN के लिए सेवा एक्सटेंशन, दोनों के लिए निजी तौर पर उपलब्ध पूर्वावलोकन की अनुमति वाली सूची में जोड़ा गया हो.

  • Media CDN और Media CDN के लिए सेवा एक्सटेंशन, दोनों का ऐक्सेस पाने का अनुरोध करने के लिए, कृपया अपनी Google खाता टीम से संपर्क करें. इससे वह आपकी ओर से, Media CDN और सेवा एक्सटेंशन के लिए ऐक्सेस का अनुरोध कर पाएगी

3. सेटअप और ज़रूरी शर्तें

Cloud Shell शुरू करें

Google Cloud को अपने लैपटॉप से रिमोटली ऐक्सेस किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जाएगा. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.

GCP Console में, सबसे ऊपर दाईं ओर मौजूद टूलबार पर मौजूद Cloud Shell आइकॉन पर क्लिक करें:

1dec6f9683153af0.png

इसे चालू करने और एनवायरमेंट से कनेक्ट करने में सिर्फ़ कुछ सेकंड लगेंगे. यह प्रोसेस पूरी होने के बाद, आपको कुछ ऐसा दिखेगा:

de496bb88f9a0b10.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है. साथ ही, यह Google Cloud पर काम करता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इस लैब में मौजूद सभी टास्क को सिर्फ़ ब्राउज़र की मदद से पूरा किया जा सकता है.

शुरू करने से पहले

IAM की भूमिकाएं और ऐक्सेस

Media CDN और Artifact Registry के संसाधन बनाने के लिए, पहचान और ऐक्सेस मैनेजमेंट (आईएएम) की ये अनुमतियां ज़रूरी हैं:

  • roles/networkservices.edgeCacheAdmin
  • roles/networkservices.edgeCacheUser
  • roles/networkservices.edgeCacheViewer
  • roles/artifactregistry.repoAdmin

Cloud Shell में, पक्का करें कि आपके project_id, project_num, location, और repository एनवायरमेंट वैरिएबल सेट अप हों.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
PROJECT_ID=[YOUR-PROJECT-NAME]
PROJECT_NUM=[YOUR-PROJECT-NUMBER]
LOCATION=us-central1
REPOSITORY=service-extension-$PROJECT_ID

एपीआई चालू करना

नीचे दिए गए निर्देशों का इस्तेमाल करके, Media CDN और Service Extensions 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

4. Cloud Storage बकेट बनाना

Media CDN का कॉन्टेंट, Cloud Storage बकेट, तीसरे पक्ष के स्टोरेज की जगह या सार्वजनिक तौर पर ऐक्सेस किए जा सकने वाले किसी भी एचटीटीपी(एचटीटीपीएस) एंडपॉइंट से मिल सकता है.

इस कोडलैब में, हम कॉन्टेंट को 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. क्लाउड शेल में कोई फ़ाइल बनाएं. इसके बाद, gsutil का इस्तेमाल करके उसे बकेट में अपलोड करें
echo media-cdn-service-extensions-test > file.txt

gsutil cp file.txt gs://mediacdn-bucket-$PROJECT_ID
  1. Media CDN को बकेट का ऐक्सेस देना
gsutil iam ch \
serviceAccount:service-$PROJECT_NUM@gcp-sa-mediaedgefill.iam.gserviceaccount.com:objectViewer gs://mediacdn-bucket-$PROJECT_ID

6. Media CDN को कॉन्फ़िगर करना

इसके बाद, हम Media CDN कॉन्फ़िगरेशन बनाएंगे.

Media CDN के हर कॉन्फ़िगरेशन में दो मुख्य संसाधन होते हैं:

  • EdgeCacheService, क्लाइंट के लिए कॉन्फ़िगरेशन (TLS, आईपी एड्रेसिंग), राउटिंग, सीडीएन कॉन्फ़िगरेशन (कैश मोड, टीटीएल, हस्ताक्षर), और सुरक्षा नीतियों के लिए ज़िम्मेदार है.
  • EdgeCacheOrigin, यह एचटीटीपी पर आधारित किसी भी ऑरिजिन के लिए, ऑरिजिन के हिसाब से कॉन्फ़िगरेशन के लिए ज़िम्मेदार होता है. साथ ही, यह तब फिर से कोशिश करने की शर्तों के लिए भी ज़िम्मेदार होता है, जब कॉन्टेंट उपलब्ध न हो या उस तक पहुंचा न जा सके.

Edge Cache Origin को कॉन्फ़िगर करना

अब हम एक ऐसा ऑरिजिन बनाते हैं जो उस Cloud Storage बकेट की ओर इशारा करता है जिसे आपने अभी बनाया है.

  1. Google Cloud Console में, Media CDN पेज पर जाएं.
  2. ओरिजन टैब पर क्लिक करें.
  3. ऑरिजिन बनाएं पर क्लिक करें.
  4. एज कैश मेमोरी के ऑरिजिन के लिए, ‘cloud-storage-origin' नाम डालें.
  5. 'मूल पता' में जाकर:
  6. ‘Google Cloud Storage बकेट चुनें' को चुनें.
  7. ‘mediacdn-bucket-$PROJECT_ID' नाम की Cloud Storage बकेट पर जाएं.
  8. 'चुनें' पर क्लिक करें.
  9. बाकी सेटिंग को डिफ़ॉल्ट पर रहने दें.
  10. ऑरिजिन बनाएं पर क्लिक करें.

e6eb0faa94838c4.png

नया EdgeCacheOrigin संसाधन, 'ओरिजन' पेज पर आपके प्रोजेक्ट में मौजूद ओरिजिन की सूची में दिखता है.

Edge Cache Service को कॉन्फ़िगर करना

  1. Google Cloud Console में, Media CDN पेज पर जाएं.
  2. SERVICES टैब पर क्लिक करें.
  3. सेवा बनाएं पर क्लिक करें.
  4. अपनी सेवा के लिए कोई यूनीक नाम डालें.जैसे, ‘media-cdn'. इसके बाद, आगे बढ़ें पर क्लिक करें.

d2f9ac837bc5d45a.png

  1. राउटिंग सेक्शन में, होस्ट करने का नियम जोड़ें पर क्लिक करें.
  2. होस्ट फ़ील्ड में वाइल्डकार्ड - "*" डालें.

25d3e25000934e59.png

  1. रास्ता तय करने का नियम जोड़ें पर क्लिक करें.
  2. प्राथमिकता के लिए, "1" डालें.
  3. मैच करने की शर्त जोड़ें पर क्लिक करें. पाथ मैच के लिए, मैच टाइप के तौर पर "प्रीफ़िक्स मैच" चुनें. पाथ मैच फ़ील्ड में "/" डालें. इसके बाद, हो गया पर क्लिक करें.
  4. 'मुख्य कार्रवाई' में जाकर, किसी ऑरिजिन से फ़ेच करें को चुनें. इसके बाद, ड्रॉप-डाउन सूची में कॉन्फ़िगर किया गया ऑरिजिन चुनें.

d1975f366233521a.png

  1. कॉन्फ़िगरेशन के ज़्यादा विकल्प देखने के लिए, ऐडवांस कॉन्फ़िगरेशन पर क्लिक करें.
  2. 'रास्ते से जुड़ी कार्रवाई' में जाकर, कोई आइटम जोड़ें पर क्लिक करें. इसके बाद, यह तरीका अपनाएं:
  3. टाइप के लिए, "सीडीएन नीति" चुनें.
  4. कैश मोड के लिए, "सभी को कैश करने के लिए मजबूर करें" चुनें.
  5. बाकी को डिफ़ॉल्ट के तौर पर छोड़ दें
  6. 'हो गया' पर क्लिक करें.
  7. सेव करें पर क्लिक करें.

b7e77d059db84ab6.png

  1. सेवा बनाएं पर क्लिक करें.

नई बनाई गई EdgeCacheService संसाधन, आपके प्रोजेक्ट में सेवाओं की सूची में मौजूद 'सेवाएं' पेज पर दिखता है.

MediaCDN का आईपी पता वापस पाना और टेस्टिंग करना

  1. Google Cloud Console में, 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
...

अब आपने Cloud Storage को ऑरिजिन के तौर पर इस्तेमाल करके, MediaCDN डिप्लॉयमेंट बना लिया है.

7. सर्विस एक्सटेंशन के लिए Artifact Registry कॉन्फ़िगर करना

सर्विस एक्सटेंशन बनाने से पहले, हमें Artifact Registry को कॉन्फ़िगर करना होगा. Artifact Registry, Google Cloud का यूनिवर्सल पैकेज मैनेजर है. इसका इस्तेमाल, बिल्ड आर्टफ़ैक्ट मैनेज करने के लिए किया जाता है. Service Extension (Proxy-Wasm) प्लगिन, Artifact Registry में पब्लिश किए जाते हैं. Artifact Registry पर पब्लिश होने के बाद, Proxy-Wasm प्लगिन को Media CDN डिप्लॉयमेंट पर डिप्लॉय किया जा सकता है.

हम डेटाबेस बनाने के लिए, gcloud artifacts repositories create कमांड का इस्तेमाल करेंगे

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

इसके अलावा, जीयूआई का इस्तेमाल करके भी रिपॉज़िटरी बनाई जा सकती है. इसके लिए, यह तरीका अपनाएं:

  1. Google Cloud Console में, Artifact Registry पेज पर जाएं.
  2. + रिपॉज़िटरी बनाएं बटन पर क्लिक करें.
  3. रिपॉज़िटरी का नाम डालें. जैसे, ‘service-extension-$PROJECT_ID'.
  4. फ़ॉर्मैट - ‘Docker,' मोड - ‘Standard', जगह का टाइप - ‘Region', और ‘us-central1 (Iowa)' चुनें
  5. बनाएं बटन पर क्लिक करें.

b525b3bc0867dc42.png

Artifact Registry में बनाया गया नया डेटाबेस, Repositories पेज पर दिखना चाहिए.

Repository संसाधन बन जाने के बाद, 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. Media CDN पर सेवा से जुड़े एक्सटेंशन कॉन्फ़िगर करना

अब हम यह दिखाएंगे कि Rust प्रोग्रामिंग भाषा का इस्तेमाल करके, Media CDN पर डिप्लॉय किया जा सकने वाला सर्विस एक्सटेंशन (Proxy-Wasm) प्लगिन कैसे लिखा और बनाया जाता है.

इस उदाहरण में, हम एक ऐसा Proxy-Wasm प्लगिन बनाएंगे जो यह पुष्टि करेगा कि हर एचटीटीपी अनुरोध में, "secret" वैल्यू वाला Authorization हेडर मौजूद है. अगर अनुरोध में यह हेडर शामिल नहीं है, तो प्लगिन, एचटीटीपी 403 'अनुमति नहीं है' वाला जवाब जनरेट करेगा.

सर्विस एक्सटेंशन के बारे में खास जानकारी: तीन मुख्य संसाधन होते हैं: WasmAction, WasmPlugin, और WasmPluginVersion.

  • WasmAction संसाधन, Media CDN EdgeCacheService से अटैच होता है. WasmAction, WasmPlugin संसाधन का रेफ़रंस देता है.
  • WasmPlugin संसाधन का एक मुख्य वर्शन होता है, जो मौजूदा चालू WasmPluginVersion से मेल खाता है.
  • WasmPluginVersions, Artifact Registry से कंटेनर इमेज को रेफ़रंस करता है. proxy-wasm प्लगिन में बदलाव करने पर, अलग-अलग WasmPluginVersions बनाए जाते हैं.

इन संसाधनों के बीच के संबंध को बेहतर तरीके से समझने के लिए, कृपया यहां दिया गया डायग्राम देखें.

22b3548b3a61c379.png

सर्विस एक्सटेंशन प्लगिन लिखना और बनाना

  1. https://www.rust-lang.org/tools/install पर दिए गए निर्देशों का पालन करके, Rust टूलचेन इंस्टॉल करें.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  1. इसके बाद, यहां दी गई कमांड चलाकर, अपने Rust टूलचेन में Wasm का सपोर्ट जोड़ें:
rustup target add wasm32-wasi
  1. my-wasm-plugin नाम का Rust पैकेज बनाएं:
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 पैकेज को कॉन्फ़िगर करें. Cargo.toml फ़ाइल में [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. बदलाव करने के बाद, 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 फ़ाइल के पूरे कॉन्टेंट को Cloud Shell में मौजूद src डायरेक्ट्री की lib.rs फ़ाइल में कॉपी करें.
  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 मेनिफ़ेस्ट फ़ाइल को कॉन्फ़िगर करने और lib.rs फ़ाइल में Proxy-Wasm कोड लिखने के बाद , अब हम अपना Proxy-Wasm प्लगिन बना सकते हैं.
cargo build --release --target wasm32-wasi

बिल्ड पूरा होने के बाद, आपको नीचे दिया गया मैसेज दिखेगा:

Finished release [optimized] target(s) in 1.01s

आइए, target डायरेक्ट्री की पुष्टि करें और देखें कि फ़ाइलें बन गई हैं या नहीं:

ls ./target

आपको आउटपुट इस तरह दिखेगा:

CACHEDIR.TAG release wasm32-wasi

Artifact Registry में Proxy-Wasm प्लगिन पब्लिश करना

अब हम अपने Proxy-Wasm प्लगिन को, Artifact Registry Repository में पब्लिश करेंगे. इसे आपने पहले बनाया था, ताकि इसे Media CDN पर डिप्लॉय किया जा सके.

हम सबसे पहले Proxy-Wasm प्लगिन को कंटेनर इमेज में पैकेज करते हैं.

  1. my-wasm-plugin डायरेक्ट्री में, Dockerfile नाम की फ़ाइल बनाएं. इसमें यह कॉन्टेंट शामिल करें:
FROM scratch 
COPY target/wasm32-wasi/release/my_wasm_plugin.wasm plugin.wasm
  1. इसके बाद, कंटेनर इमेज बनाएं:
docker build --no-cache --platform wasm -t my-wasm-plugin .

(सिर्फ़ नॉन-x86 प्रोसेसर के लिए) इसके बाद, कंटेनर इमेज बनाएं:

docker build --no-cache --platform wasm --provenance=false -t my-wasm-plugin . 

आउटपुट

[+] Building 0.2s (5/5) FINISHED                                     docker:default
...
  1. इसके बाद, अपने Proxy-Wasm प्लगिन को Artifact Registry में पब्लिश करें या "पुश" करें. हम अपनी कंटेनर इमेज को ‘prod' टैग के साथ टैग करेंगे.
docker tag my-wasm-plugin $LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/my-wasm-plugin:prod

अब हम टैग की गई ‘prod' कंटेनर इमेज को रिपॉज़िटरी में पुश करते हैं.

docker push $LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/my-wasm-plugin:prod

आउटपुट:

The push refers to repository 
...
8564ddd9910a: Pushed 
prod: digest: sha256:f3ae4e392eb45393bfd9c200cf8c0c261762f7f39dde5c7cd4b9a8951c6f2812 size: 525

अब पुष्टि करते हैं कि Proxy-Wasm प्लगिन की कंटेनर इमेज को Artifact Registry में पुश किया गया है या नहीं. आपको इससे मिलता-जुलता आउटपुट दिखेगा:

gcloud artifacts docker images list $LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/my-wasm-plugin --include-tags

आउटपुट:

Listing items under project 
...
IMAGE                                         DIGEST           TAGS  CREATE_TIME          UPDATE_TIME
<LOCATION>-docker.pkg.dev/.../my-wasm-plugin  sha256:08c12...  prod  2021-11-10T23:31:27  2021-11-10T23:31:27

अपने Media CDN डिप्लॉयमेंट से Proxy-Wasm प्लगिन को जोड़ना

अब हम प्रॉक्सी-वैज़म प्लगिन को आपके Media CDN डिप्लॉयमेंट से जोड़ने के लिए तैयार हैं.

Proxy-Wasm प्लगिन, EdgeCacheService संसाधन में Media CDN रास्तों से जुड़े होते हैं.

  1. सबसे पहले, हम अपने Proxy-Wasm प्लगिन के लिए एक Wasm-plugin संसाधन बनाते हैं.
gcloud alpha service-extensions wasm-plugins create my-wasm-plugin-resource
  1. इसके बाद, हम WasmPluginVersion बनाते हैं.
gcloud alpha service-extensions wasm-plugin-versions create my-version-1 \
    --wasm-plugin=my-wasm-plugin-resource \
    --image="$LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/my-wasm-plugin:prod"
  1. इसके बाद, हम अपने Proxy-Wasm प्लगिन के लिए मुख्य वर्शन तय करते हैं.
gcloud alpha service-extensions wasm-plugins update my-wasm-plugin-resource \
    --main-version=my-version-1

अब पुष्टि करें कि Proxy-Wasm प्लगिन, Artifact Registry Repository में मौजूद कंटेनर इमेज से सही तरीके से जुड़ा है. आपको कुछ ऐसा आउटपुट दिखेगा:

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 फ़ाइल खोलें और दिए गए रूट के लिए, routeAction में wasmAction जोड़ें. यह पहले बनाई गई WasmPlugin संसाधन को रेफ़रंस करता है.
wasmAction: "my-wasm-action-resource"
  1. बदलाव करने के बाद, my-service.yaml फ़ाइल कुछ ऐसी दिखनी चाहिए:
...

pathMatchers:
  - name: routes
    routeRules:
    - headerAction: {}
      matchRules:
      - prefixMatch: /
      origin: projects/<PROJECT_NUM>/locations/global/edgeCacheOrigins/cloud-storage-origin
      priority: '1'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 3600s
          signedRequestMode: DISABLED
        wasmAction: "my-wasm-action-resource"
...
  1. इसके बाद, हम अपडेट किए गए कॉन्फ़िगरेशन को Proxy-Wasm कॉन्फ़िगरेशन के साथ my-service-with-wasm.yaml फ़ाइल में सेव करते हैं.
  1. आखिर में, हम प्रोडक्शन Media CDN एनवायरमेंट के लिए अपडेट किया गया कॉन्फ़िगरेशन इंपोर्ट करते हैं:
$ gcloud alpha edge-cache services import media-cdn --source=my-service-with-wasm.yaml

9. Media CDN पर Service Extensions 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 पर डिप्लॉय करना होगा. यहां, हम प्लगिन के अपडेट किए गए वर्शन को डिप्लॉय करने का तरीका बता रहे हैं.

उदाहरण के लिए, पुष्टि करने के लिए किसी दूसरी वैल्यू के हिसाब से 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 Registry में कंटेनर इमेज अपडेट होने के बाद, हमें एक नया WasmPluginVersion बनाना होगा. इसके बाद, WasmPlugin के –main-version को अपडेट करके, नए वर्शन का रेफ़रंस देना होगा.

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 को मिटाने के लिए, कृपया यह तरीका अपनाएं.

सबसे पहले, Media CDN EdgeCacheService कॉन्फ़िगरेशन में WasmAction का रेफ़रंस हटाएं.

हटाने के लिए रेफ़रंस लाइन:

wasmAction: "my-wasm-action-resource"

इसके बाद, हम EdgeCacheService के बदले गए कॉन्फ़िगरेशन को अपडेट करते हैं.

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

इसके बाद, अपने WasmPlugin के मुख्य वर्शन को खाली स्ट्रिंग "" पर अपडेट करें.

gcloud alpha service-extensions wasm-plugins update my-wasm-plugin-resource --main-version=
""

आखिर में, मिटाने के लिए यहां दिया गया तरीका अपनाएं.

gcloud alpha service-extensions wasm-actions delete my-wasm-action-resource

gcloud alpha service-extensions wasm-plugin-versions delete my-version \ --wasm-plugin=my-wasm-plugin-resource

gcloud alpha service-extensions wasm-plugins delete my-wasm-plugin-resource

11. Lab के एनवायरमेंट को साफ़ करना

CodeLab पूरा करने के बाद, लैब के संसाधनों को बंद करना न भूलें. ऐसा न करने पर, वे चलते रहेंगे और उनसे शुल्क लगता रहेगा.

इन कमांड से, Media CDN EdgeCache सेवा, EdgeCache कॉन्फ़िगरेशन, और सेवा एक्सटेंशन प्लगिन मिट जाएगा. मिटाने की प्रोसेस को क्रम से पूरा करें.

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 बकेट को ओरिजन के तौर पर सेट करके, Media CDN को सेट अप करने का तरीका
  • कस्टम एचटीटीपी पुष्टि करने की सुविधा वाला सर्विस एक्सटेंशन प्लगिन बनाने और उसे Media CDN से जोड़ने का तरीका
  • यह पुष्टि कैसे करें कि Service Extension प्लगिन उम्मीद के मुताबिक काम कर रहा है
  • (वैकल्पिक) सर्विस एक्सटेंशन प्लगिन को मैनेज करने का तरीका. जैसे, किसी प्लगिन के वर्शन को अपडेट करना, उसका रेफ़रंस देना, उसे पहले जैसा करना, और मिटाना

आगे क्या करना है?

यहां दिए गए कुछ कोडलैब आज़माएं...

इस बारे में और पढ़ें

रेफ़रंस दस्तावेज़