ল্যাব: মিডিয়া CDN-এ পরিষেবা এক্সটেনশন

১. ভূমিকা

সর্বশেষ হালনাগাদ: ২০২৪-০৫-০১

কন্টেন্ট ডেলিভারি নেটওয়ার্ক (সিডিএন) প্রায়শই ব্যবহৃত কন্টেন্টকে প্রান্তিক ব্যবহারকারীর কাছাকাছি ক্যাশ করে, ক্লায়েন্টের কাছাকাছি সংযোগ শেষ করে, উৎসের সাথে সংযোগ পুনঃব্যবহার করে এবং আধুনিক নেটওয়ার্কিং প্রোটোকল ও কাস্টমাইজেশন গ্রহণের মাধ্যমে ব্যবহারকারীর পারফরম্যান্স উন্নত করে।

মিডিয়া সিডিএন, যা স্ট্রিমিং মিডিয়ার জন্য জিসিপি-র গ্লোবাল এজ নেটওয়ার্ক, অনেকগুলো বিল্ট-ইন বা "কোর" সক্ষমতা প্রদান করে। এই কোর সক্ষমতাগুলো সবচেয়ে সাধারণ ব্যবহারের ক্ষেত্রগুলো পূরণের উদ্দেশ্যে তৈরি, কিন্তু আপনার এমন কিছু প্রয়োজনীয়তাও থাকতে পারে যা এই কোর ফিচার সেটের আওতায় পড়ে না।

মিডিয়া সিডিএন-এর জন্য সার্ভিস এক্সটেনশন, যা কখনও কখনও এজ প্রোগ্রামেবিলিটি নামেও পরিচিত, আপনাকে মিডিয়া সিডিএন-এর আচরণ কাস্টমাইজ করার জন্য এজ-এ আপনার নিজস্ব কোড চালানোর সুযোগ দেয়। এর মাধ্যমে ক্যাশ কী নর্মালাইজিং, কাস্টম টোকেন অথেন্টিকেশন ও টোকেন রিভোকেশন, অতিরিক্ত কাস্টম লগ ফিল্ড, এ/বি টেস্টিং এবং কাস্টম এরর পেজের মতো বিভিন্ন অতিরিক্ত ব্যবহারের সুযোগ উন্মোচিত হয়।

আপনি যা তৈরি করবেন

এই কোড ল্যাবে, আমরা মিডিয়া সিডিএন (সিডিএন) + সার্ভিস এক্সটেনশন (এজ প্রোগ্রামেবিলিটি) + ক্লাউড স্টোরেজ (সিডিএন-এর উৎস) ব্যবহার করে একটি এজ কম্পিউট-সক্ষম সিডিএন ডেলিভারি এনভায়রনমেন্ট ডেপ্লয় করার ধাপগুলো দেখব।

1f19151bdd96acb0.png

আপনি যা শিখবেন

  • অরিজিন হিসেবে ক্লাউড স্টোরেজ বাকেট সেট করে কীভাবে মিডিয়া সিডিএন সেট আপ করবেন
  • কাস্টম HTTP অথেনটিকেশন সহ একটি সার্ভিস এক্সটেনশন প্লাগইন কীভাবে তৈরি করবেন এবং এটিকে মিডিয়া সিডিএন-এর সাথে যুক্ত করবেন
  • সার্ভিস এক্সটেনশন প্লাগইনটি প্রত্যাশিতভাবে কাজ করছে কিনা তা কীভাবে যাচাই করবেন
  • (ঐচ্ছিক) একটি সার্ভিস এক্সটেনশন প্লাগইন কীভাবে পরিচালনা করতে হয়, যেমন একটি নির্দিষ্ট প্লাগইন সংস্করণ আপডেট করা, রেফারেন্স করা, রোল ব্যাক করা এবং মুছে ফেলা।

আপনার যা যা লাগবে

  • নেটওয়ার্কিং-এর প্রাথমিক জ্ঞান এবং HTTP সম্পর্কে ধারণা
  • ইউনিক্স/লিনাক্স কমান্ড লাইনের প্রাথমিক জ্ঞান

২. শুরু করার আগে

মিডিয়া সিডিএন অ্যালাওলিস্ট এবং সার্ভিস এক্সটেনশন অ্যালাওলিস্টের জন্য অনুরোধ

কাজ শুরু করার আগে, আপনাকে নিশ্চিত করতে হবে যে আপনার প্রজেক্টটি Media CDN এবং Service Extensions for Media CDN উভয়ের প্রাইভেট প্রিভিউ অ্যালাওলিস্টে যুক্ত করা হয়েছে।

  • মিডিয়া সিডিএন এবং মিডিয়া সিডিএন-এর সার্ভিস এক্সটেনশন উভয়ের অ্যাক্সেসের জন্য অনুরোধ করতে, অনুগ্রহ করে আপনার গুগল অ্যাকাউন্ট টিমের সাথে যোগাযোগ করুন, যাতে তারা আপনার পক্ষ থেকে মিডিয়া সিডিএন এবং সার্ভিস এক্সটেনশনের জন্য একটি অ্যাক্সেস অনুরোধ তৈরি করে দেন।

৩. সেটআপ এবং প্রয়োজনীয়তা

ক্লাউড শেল শুরু করুন

যদিও গুগল ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালনা করা যায়, এই কোডল্যাবে আপনি গুগল ক্লাউড শেল ব্যবহার করবেন, যা ক্লাউডে চলমান একটি কমান্ড লাইন পরিবেশ।

GCP কনসোল থেকে উপরের ডানদিকের টুলবারে থাকা ক্লাউড শেল আইকনে ক্লিক করুন:

1dec6f9683153af0.png

পরিবেশটি প্রস্তুত করতে এবং এর সাথে সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগবে। এটি শেষ হলে, আপনি এইরকম কিছু দেখতে পাবেন:

de496bb88f9a0b10.png

এই ভার্চুয়াল মেশিনটিতে আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুলস লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি প্রদান করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক পারফরম্যান্স ও অথেনটিকেশনকে ব্যাপকভাবে উন্নত করে। এই ল্যাবে আপনার সমস্ত কাজ শুধুমাত্র একটি ব্রাউজার দিয়েই করা যাবে।

শুরু করার আগে

IAM ভূমিকা এবং অ্যাক্সেস

মিডিয়া সিডিএন এবং আর্টিফ্যাক্ট রেজিস্ট্রি রিসোর্স তৈরি করার জন্য প্রয়োজনীয় আইডেন্টিটি অ্যান্ড অ্যাক্সেস ম্যানেজমেন্ট (আইএএম) পারমিশনগুলো হলো নিম্নরূপ:

  • ভূমিকা/নেটওয়ার্কপরিষেবা.এজক্যাশঅ্যাডমিন
  • ভূমিকা/নেটওয়ার্কপরিষেবা.এজক্যাশব্যবহারকারী
  • ভূমিকা/নেটওয়ার্কপরিষেবা.এজক্যাশভিউয়ার
  • ভূমিকা/আর্টিফ্যাক্টরেজিস্ট্রি.রিপোঅ্যাডমিন

ক্লাউড শেলের ভেতরে, আপনার 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

এপিআই সক্ষম করুন

নিচের কমান্ডগুলোর মাধ্যমে মিডিয়া সিডিএন ও সার্ভিস এক্সটেনশন এপিআই সক্রিয় করুন।

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

৪. একটি ক্লাউড স্টোরেজ বাকেট তৈরি করুন

মিডিয়া সিডিএন কন্টেন্ট ক্লাউড স্টোরেজ বাকেট, কোনো তৃতীয় পক্ষের স্টোরেজ লোকেশন বা যেকোনো সর্বজনীনভাবে প্রবেশযোগ্য 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. ক্লাউড শেলে একটি ফাইল তৈরি করুন, তারপর gsutil ব্যবহার করে সেটি বাকেটে আপলোড করুন।
echo media-cdn-service-extensions-test > file.txt

gsutil cp file.txt gs://mediacdn-bucket-$PROJECT_ID
  1. মিডিয়াকে বাকেটে সিডিএন অ্যাক্সেস দিন
gsutil iam ch \
serviceAccount:service-$PROJECT_NUM@gcp-sa-mediaedgefill.iam.gserviceaccount.com:objectViewer gs://mediacdn-bucket-$PROJECT_ID

৬. মিডিয়া সিডিএন কনফিগার করুন

এরপরে আমরা একটি মিডিয়া সিডিএন কনফিগারেশন তৈরি করব।

প্রতিটি মিডিয়া সিডিএন কনফিগারেশন দুটি প্রধান রিসোর্স নিয়ে গঠিত:

  • EdgeCacheService ক্লায়েন্ট-মুখী কনফিগারেশন (TLS, IP অ্যাড্রেসিং), রাউটিং, CDN কনফিগারেশন (ক্যাশ মোড, TTL, সাইনিং) এবং নিরাপত্তা নীতিমালার জন্য দায়ী।
  • EdgeCacheOrigin , যা যেকোনো HTTP-ভিত্তিক অরিজিনের জন্য প্রতি-অরিজিন কনফিগারেশনের পাশাপাশি কন্টেন্ট অনুপলব্ধ বা নাগালের বাইরে থাকলে পুনরায় চেষ্টার শর্তাবলী নির্ধারণের জন্য দায়ী।

একটি এজ ক্যাশে অরিজিন কনফিগার করুন

এখন চলুন একটি অরিজিন তৈরি করি যা আপনার এইমাত্র তৈরি করা ক্লাউড স্টোরেজ বাকেটটিকে নির্দেশ করবে।

  1. গুগল ক্লাউড কনসোলে, মিডিয়া সিডিএন পেজে যান।
  2. ORIGINS ট্যাবে ক্লিক করুন।
  3. CREATE ORIGIN- এ ক্লিক করুন।
  4. এজ ক্যাশ অরিজিনের নাম হিসেবে 'cloud-storage-origin' লিখুন।
  5. অরিজিন অ্যাড্রেসের অধীনে:
  6. 'একটি গুগল ক্লাউড স্টোরেজ বাকেট নির্বাচন করুন' বেছে নিন।
  7. 'mediacdn-bucket-$PROJECT_ID' নামের ক্লাউড স্টোরেজ বাকেটটিতে ব্রাউজ করুন।
  8. সিলেক্ট-এ ক্লিক করুন।
  9. বাকি সেটিংস ডিফল্ট হিসাবে রাখুন।
  10. CREATE ORIGIN- এ ক্লিক করুন।

e6eb0faa94838c4.png

নতুন তৈরি করা EdgeCacheOrigin রিসোর্সটি আপনার প্রোজেক্টের Origins পৃষ্ঠার অরিজিন তালিকায় দেখা যায়।

একটি এজ ক্যাশে পরিষেবা কনফিগার করুন

  1. গুগল ক্লাউড কনসোলে, মিডিয়া সিডিএন পেজে যান।
  2. SERVICES ট্যাবে ক্লিক করুন।
  3. CREATE SERVICE-এ ক্লিক করুন।
  4. আপনার পরিষেবার জন্য একটি অনন্য নাম লিখুন - যেমন 'media-cdn' - এবং তারপর 'Next'-এ ক্লিক করুন।

d2f9ac837bc5d45a.png

  1. রাউটিং বিভাগে, অ্যাড হোস্ট রুল (ADD HOST RULE )-এ ক্লিক করুন।
  2. Hosts ফিল্ডে ওয়াইল্ডকার্ড - "*" প্রবেশ করান।

25d3e25000934e59.png

  1. রুট নিয়ম যোগ করুন- এ ক্লিক করুন।
  2. অগ্রাধিকারের জন্য '1' উল্লেখ করুন।
  3. ‘ADD A MATCH CONDITION’-এ ক্লিক করুন, ‘Path match’-এর জন্য ‘Match type’ হিসেবে ‘Prefix match’ নির্বাচন করুন, ‘Path match’ ফিল্ডে ‘/’ উল্লেখ করুন এবং তারপর ‘Done’-এ ক্লিক করুন।
  4. প্রাইমারি অ্যাকশনের অধীনে ‘ফেচ ফ্রম অ্যান অরিজিন’ নির্বাচন করুন, এবং তারপরে ড্রপ-ডাউন তালিকা থেকে আপনার কনফিগার করা অরিজিনটি বেছে নিন।

d1975f366233521a.png

  1. আরও কনফিগারেশন বিকল্প প্রসারিত করতে অ্যাডভান্সড কনফিগারেশন-এ ক্লিক করুন।
  2. Route অ্যাকশনে, ADD AN ITEM-এ ক্লিক করুন। তারপর, নিম্নলিখিতগুলি করুন:
  3. Type-এর জন্য, "CDN policy" নির্বাচন করুন।
  4. ক্যাশ মোডের জন্য, 'Force cache all' নির্বাচন করুন।
  5. বাকিগুলো ডিফল্ট হিসেবে রাখুন।
  6. সম্পন্ন ক্লিক করুন।
  7. সংরক্ষণ করুন- এ ক্লিক করুন।

b7e77d059db84ab6.png

  1. CREATE SERVICE-এ ক্লিক করুন।

নতুন তৈরি করা EdgeCacheService রিসোর্সটি আপনার প্রজেক্টের সার্ভিস তালিকার সার্ভিসেস পেজে দেখা যায়।

MediaCDN IP ঠিকানা পুনরুদ্ধার করুন এবং পরীক্ষা করুন

  1. গুগল ক্লাউড কনসোলে, মিডিয়া সিডিএন পেজে যান।
  2. মিডিয়া সিডিএন-এ যান
  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 ডেপ্লয়মেন্ট তৈরি করেছেন।

৭. সার্ভিস এক্সটেনশনের জন্য আর্টিফ্যাক্ট রেজিস্ট্রি কনফিগার করুন

সার্ভিস এক্সটেনশন তৈরি করার আগে, আমাদের আর্টিফ্যাক্ট রেজিস্ট্রি কনফিগার করতে হবে। আর্টিফ্যাক্ট রেজিস্ট্রি হলো বিল্ড আর্টিফ্যাক্ট পরিচালনার জন্য গুগল ক্লাউডের সার্বজনীন প্যাকেজ ম্যানেজার। সার্ভিস এক্সটেনশন (প্রক্সি-ওয়াসম) প্লাগইনগুলো আর্টিফ্যাক্ট রেজিস্ট্রি-তে প্রকাশ করা হয়। আর্টিফ্যাক্ট রেজিস্ট্রি-তে প্রকাশিত হয়ে গেলে, প্রক্সি-ওয়াসম প্লাগইনগুলো আপনার মিডিয়া সিডিএন ডেপ্লয়মেন্টে স্থাপন করা যেতে পারে।

আমরা রিপোজিটরি তৈরি করার জন্য gcloud artifacts repositorys create কমান্ডটি ব্যবহার করব।

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

ঐচ্ছিকভাবে, আপনি নিম্নলিখিত উপায়ে GUI ব্যবহার করে একটি রিপোজিটরি তৈরি করতে পারেন:

  1. গুগল ক্লাউড কনসোলে, আর্টিফ্যাক্ট রেজিস্ট্রি পৃষ্ঠায় যান।
  2. + রিপোজিটরি তৈরি করুন বোতামটিতে ক্লিক করুন।
  3. রিপোজিটরিটির জন্য একটি নাম লিখুন। যেমন 'service-extension-$PROJECT_ID'।
  4. ফরম্যাট - 'ডকার,' মোড - 'স্ট্যান্ডার্ড', অবস্থানের ধরণ - 'অঞ্চল', এবং 'us-central1 (Iowa)' বেছে নিন।
  5. CREATE বোতামটি ক্লিক করুন।

b525b3bc0867dc42.png

নতুন তৈরি করা আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরি রিসোর্সটি রিপোজিটরি পৃষ্ঠায় দেখা যাবে।

রিপোজিটরি রিসোর্সটি তৈরি হয়ে গেলে, এই রিপোজিটরি ব্যবহার করে প্যাকেজ পুশ ও পুল করার জন্য আপনার ক্লাউড শেল ডকার ক্লায়েন্ট কনফিগার করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান।

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

আউটপুট:

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

৮. মিডিয়া সিডিএন-এ সার্ভিস এক্সটেনশন কনফিগার করুন

এখন আমরা রাস্ট প্রোগ্রামিং ভাষা ব্যবহার করে দেখাবো কিভাবে একটি সার্ভিস এক্সটেনশন (প্রক্সি-ওয়াসম) প্লাগইন লিখতে ও বিল্ড করতে হয়, যা মিডিয়া সিডিএন-এ ডেপ্লয় করা যাবে।

এই উদাহরণে, আমরা একটি Proxy-Wasm প্লাগইন তৈরি করব যা যাচাই করবে যে প্রতিটি HTTP অনুরোধে 'secret' মানের একটি Authorization হেডার আছে কিনা। যদি অনুরোধে এই হেডারটি না থাকে, তাহলে প্লাগইনটি একটি HTTP 403 Forbidden প্রতিক্রিয়া তৈরি করবে।

সার্ভিস এক্সটেনশন সম্পর্কে সংক্ষেপে বলতে গেলে, এর তিনটি প্রধান রিসোর্স রয়েছে: WasmAction, WasmPlugin, এবং WasmPluginVersion।

  • একটি WasmAction রিসোর্স আপনার Media CDN EdgeCacheService-এর সাথে সংযুক্ত থাকে। একটি WasmAction একটি WasmPlugin রিসোর্সকে রেফারেন্স করে।
  • একটি WasmPlugin রিসোর্সের একটি প্রধান সংস্করণ (main-version) থাকে, যা বর্তমান সক্রিয় WasmPluginVersion-এর সাথে সঙ্গতিপূর্ণ।
  • একটি WasmPluginVersions, Artifact Registry থেকে একটি কন্টেইনার ইমেজকে রেফারেন্স করে। আপনি যখন আপনার proxy-wasm প্লাগইনগুলিতে পরিবর্তন আনেন, তখন বিভিন্ন WasmPluginVersions তৈরি হয়।

এই সম্পদগুলোর মধ্যে সম্পর্ক আরও ভালোভাবে বোঝার জন্য অনুগ্রহ করে নিচের চিত্রটি দেখুন।

22b3548b3a61c379.png

একটি সার্ভিস এক্সটেনশন প্লাগইন লিখুন এবং তৈরি করুন

  1. https://www.rust-lang.org/tools/install -এ দেওয়া নির্দেশাবলী অনুসরণ করে রাস্ট টুলচেইন ইনস্টল করুন।
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  1. এরপর, নিম্নলিখিত কমান্ডটি চালিয়ে আপনার রাস্ট টুলচেইনে Wasm সাপোর্ট যোগ করুন:
rustup target add wasm32-wasi
  1. 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 প্যাকেজটি কনফিগার করুন। 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. । Cloud Shell-এর src ডিরেক্টরিতে থাকা lib.rs ফাইলে sample_code ফাইলের সম্পূর্ণ বিষয়বস্তু কপি করুন।
  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

আর্টিফ্যাক্ট রেজিস্ট্রি-তে একটি প্রক্সি-ওয়াসম প্লাগইন প্রকাশ করুন

এখন, আমরা আমাদের Proxy-Wasm প্লাগইনটি আপনার পূর্বে তৈরি করা আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরিতে প্রকাশ করব, যাতে এটি মিডিয়া সিডিএন-এ স্থাপন করা যায়।

আমরা প্রথমে 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 প্লাগইনের কন্টেইনার ইমেজটি আর্টিফ্যাক্ট রেজিস্ট্রি-তে সফলভাবে পুশ করা হয়েছে কিনা, আপনি একটি অনুরূপ আউটপুট দেখতে পাবেন:

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

আউটপুট:

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

আপনার মিডিয়া সিডিএন ডেপ্লয়মেন্টের সাথে একটি প্রক্সি-ওয়াসম প্লাগইন সংযুক্ত করুন।

এখন আমরা আপনার মিডিয়া সিডিএন ডেপ্লয়মেন্টের সাথে Proxy-Wasm প্লাগইনটি যুক্ত করার জন্য প্রস্তুত।

Proxy-Wasm প্লাগইনগুলি 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 প্লাগইনটি আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরিতে থাকা কন্টেইনার ইমেজের সাথে সফলভাবে যুক্ত হয়েছে কিনা, আপনি একটি অনুরূপ আউটপুট দেখতে পাবেন:

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. এরপরে, আমরা আমাদের Wasm প্লাগইন রিসোর্সকে রেফারেন্স করে একটি WasmAction রিসোর্স তৈরি করব।
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. অবশেষে, আমরা প্রোডাকশন মিডিয়া সিডিএন এনভায়রনমেন্টের জন্য আপডেট করা কনফিগারেশনটি ইম্পোর্ট করি:
$ gcloud alpha edge-cache services import media-cdn --source=my-service-with-wasm.yaml

৯. মিডিয়া সিডিএন-এ সার্ভিস এক্সটেনশন প্রক্সি-ওয়াসম প্লাগইন যাচাই করুন

আপনার পরিষেবাটি কন্টেন্ট ক্যাশ করার জন্য সঠিকভাবে কনফিগার করা আছে কিনা তা পরীক্ষা করতে, `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 প্লাগইনগুলিতে উন্নতি সাধন করবেন বা নতুন কার্যকারিতা যোগ করবেন, তখন আপনাকে আপনার আপডেট করা প্লাগইনগুলি 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

আর্টিফ্যাক্ট রেজিস্ট্রি-তে কন্টেইনার ইমেজ আপডেট হয়ে গেলে, আমাদের একটি নতুন 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

এখন, আপনি আর্টিফ্যাক্ট রেজিস্ট্রি থেকে ইম্পোর্ট করার জন্য কন্টেইনার ইমেজের ভার্সনটি সফলভাবে আপডেট করেছেন এবং আপনার মিডিয়া সিডিএন ডিপ্লয়মেন্টে তা লাইভ করেছেন।

পূর্ববর্তী সংস্করণে ফিরে যাওয়া হচ্ছে

প্লাগইনের পূর্ববর্তী সংস্করণে ফিরে যেতে, আপনি 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"

যেহেতু মিডিয়া সিডিএন প্রতিটি নতুন Wasm-প্লাগইন রিসোর্স তৈরির সময় আপনার ডকার ইমেজের ইমেজ ডাইজেস্ট সংরক্ষণ করে, তাই রোলব্যাকের সময় আপনার কোডের সেই সংস্করণটি ব্যবহার করা হবে যা সর্বশেষ রোলআউটের আগে চলছিল।

gcloud alpha service-extensions wasm-plugins describe my-wasm-plugin-resource \
  --expand-config

"a2a8ce" ভার্সনটির ক্ষেত্রে, অর্থাৎ যে ভার্সনটির ডাইজেস্ট sha256:08c12...:

name: "my-wasm-plugin-resource"
mainVersion: "a2a8ce"
mainVersionDetails:
  image: "<LOCATION>-docker.pkg.dev/<PROJECT>/<REPOSITORY>/my-wasm-plugin"
  imageDigest: "<LOCATION>-docker.pkg.dev/<PROJECT>/<REPOSITORY>/my-wasm-plugin@sha256:08c121dd7fd1e4d3a116a28300e9fc1fa41b2e9775620ebf3d96cb7119bd9976"

একটি WasmAction এবং WasmPlugin মুছে ফেলা হচ্ছে

একটি WasmAction, 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-এর main-version-কে একটি খালি স্ট্রিং ""-এ আপডেট করুন।

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

১১. পরীক্ষাগারের পরিবেশ পরিষ্কার করুন।

কোডল্যাব শেষ করার পর, ল্যাবের রিসোর্সগুলো পরিষ্কার করতে ভুলবেন না — নইলে সেগুলো চলতে থাকবে এবং খরচ বাড়তে থাকবে।

নিম্নলিখিত কমান্ডগুলো Media CDN EdgeCache Service, EdgeCache Config, এবং Service Extensions Plugin মুছে ফেলবে। নিচের মুছে ফেলার ধাপগুলো ক্রমানুসারে অনুসরণ করুন।

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

উপরের প্রতিটি কমান্ড রিসোর্সটি মুছে ফেলার বিষয়টি নিশ্চিত করতে আপনাকে জিজ্ঞাসা করবে।

১২. অভিনন্দন!

অভিনন্দন, আপনি মিডিয়া সিডিএন-এ সার্ভিস এক্সটেনশন বিষয়ক কোডল্যাবটি সম্পন্ন করেছেন!

আমরা যা আলোচনা করেছি

  • অরিজিন হিসেবে ক্লাউড স্টোরেজ বাকেট সেট করে কীভাবে মিডিয়া সিডিএন সেট আপ করবেন
  • কাস্টম HTTP অথেনটিকেশন সহ একটি সার্ভিস এক্সটেনশন প্লাগইন কীভাবে তৈরি করবেন এবং এটিকে মিডিয়া সিডিএন-এর সাথে যুক্ত করবেন
  • সার্ভিস এক্সটেনশন প্লাগইনটি প্রত্যাশিতভাবে কাজ করছে কিনা তা কীভাবে যাচাই করবেন
  • (ঐচ্ছিক) একটি সার্ভিস এক্সটেনশন প্লাগইন কীভাবে পরিচালনা করতে হয়, যেমন একটি নির্দিষ্ট প্লাগইন সংস্করণ আপডেট করা, রেফারেন্স করা, রোল ব্যাক করা এবং মুছে ফেলা।

এরপর কী?

এই কোডল্যাবগুলো দেখে নিন...

আরও পড়ুন

রেফারেন্স নথি