ห้องทดลอง: ส่วนขยายบริการใน Media CDN

1. บทนำ

อัปเดตล่าสุด: 2024-05-01

เครือข่ายนำส่งข้อมูล (CDN) ช่วยปรับปรุงประสิทธิภาพของผู้ใช้โดยการแคชเนื้อหาที่เข้าถึงบ่อยๆ ให้ใกล้กับผู้ใช้ปลายทางมากขึ้น ปิดการเชื่อมต่อให้ใกล้กับไคลเอ็นต์มากขึ้น นำการเชื่อมต่อไปยังต้นทางกลับมาใช้ใหม่ และผ่านการใช้โปรโตคอลเครือข่ายและการปรับแต่งที่ทันสมัย

Media CDN ซึ่งเป็นเครือข่าย Edge ทั่วโลกของ GCP สำหรับการสตรีมสื่อ มีความสามารถในตัวหรือ "หลัก" มากมาย ความสามารถหลักมีไว้เพื่อรองรับ Use Case ที่พบบ่อยที่สุด แต่คุณอาจมีข้อกำหนดที่ชุดฟีเจอร์หลักนี้ไม่รองรับ

ส่วนขยายบริการสำหรับ Media CDN หรือที่เรียกว่าความสามารถในการตั้งโปรแกรมที่ Edge ช่วยให้คุณเรียกใช้โค้ดของคุณเองที่ Edge เพื่อปรับแต่งลักษณะการทำงานของ Media CDN ได้ ซึ่งจะช่วยให้คุณใช้กรณีการใช้งานเพิ่มเติมได้ ตั้งแต่การทำให้คีย์แคชเป็นปกติ การตรวจสอบสิทธิ์โทเค็นที่กำหนดเองและการเพิกถอนโทเค็น ฟิลด์บันทึกที่กำหนดเองเพิ่มเติม การทดสอบ A/B และหน้าข้อผิดพลาดที่กำหนดเอง

สิ่งที่คุณจะสร้าง

ใน Codelab นี้ เราจะแนะนำขั้นตอนในการติดตั้งใช้งานสภาพแวดล้อมการนำส่ง CDN ที่เปิดใช้ Edge Compute ด้วย Media CDN (CDN) + ส่วนขยายบริการ (Edge Programmability) + Cloud Storage (แหล่งที่มาของ CDN)

1f19151bdd96acb0.png

สิ่งที่คุณจะได้เรียนรู้

  • วิธีตั้งค่า Media CDN โดยตั้งค่า Bucket ของ Cloud Storage เป็นต้นทาง
  • วิธีสร้างปลั๊กอินส่วนขยายบริการด้วยการตรวจสอบสิทธิ์ HTTP ที่กำหนดเองและเชื่อมโยงกับ Media CDN
  • วิธีตรวจสอบว่าปลั๊กอินส่วนขยายบริการทำงานได้ตามที่คาดไว้
  • (ไม่บังคับ) วิธีจัดการปลั๊กอินส่วนขยายบริการ เช่น การอัปเดต การอ้างอิง การย้อนกลับ และการลบปลั๊กอินเวอร์ชันที่เฉพาะเจาะจง

สิ่งที่คุณต้องมี

  • ความรู้พื้นฐานด้านเครือข่ายและความรู้เกี่ยวกับ HTTP
  • ความรู้พื้นฐานเกี่ยวกับบรรทัดคำสั่ง Unix/Linux

2. ก่อนเริ่มต้น

ขอรายการที่อนุญาตสำหรับ Media CDN และรายการที่อนุญาตสำหรับส่วนขยายบริการ

ก่อนเริ่มต้น คุณจะต้องตรวจสอบว่าได้เพิ่มโปรเจ็กต์ลงในรายการที่อนุญาตของรุ่นตัวอย่างแบบส่วนตัวสำหรับทั้ง Media CDN และส่วนขยายบริการสำหรับ Media CDN แล้ว

  • หากต้องการขอสิทธิ์เข้าถึงทั้ง Media CDN และส่วนขยายบริการสำหรับ Media CDN โปรดติดต่อทีมดูแลบัญชี Google เพื่อสร้างคำขอสิทธิ์เข้าถึงในนามของคุณสำหรับ Media CDN และส่วนขยายบริการ

3. การตั้งค่าและข้อกำหนด

เริ่มต้น Cloud Shell

แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลจากแล็ปท็อปได้ แต่ใน Codelab นี้คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

จาก GCP Console ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

1dec6f9683153af0.png

การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อเสร็จแล้ว คุณควรเห็นข้อความคล้ายกับตัวอย่างต่อไปนี้

de496bb88f9a0b10.png

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานบน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานทั้งหมดในห้องทดลองนี้ได้โดยใช้เพียงเบราว์เซอร์

ก่อนเริ่มต้น

บทบาทและการเข้าถึง IAM

สิทธิ์ Identity and Access Management (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

เปิดใช้ 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. สร้าง Bucket ของ Cloud Storage

เนื้อหา Media CDN อาจมาจากตำแหน่งต่างๆ เช่น Bucket ของ Cloud Storage, ตำแหน่งจัดเก็บข้อมูลของบุคคลที่สาม หรือปลายทาง HTTP(HTTPS) ที่เข้าถึงได้แบบสาธารณะ

ใน Codelab นี้ เราจะจัดเก็บเนื้อหาไว้ใน Bucket ของ Cloud Storage

เราจะใช้คำสั่ง gsutil mb เพื่อสร้าง Bucket

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

คุณเลือกสร้างที่เก็บข้อมูล Cloud Storage โดยใช้ GUI ได้ดังนี้

  1. ในคอนโซล Google Cloud ให้ไปที่หน้า Cloud Storage
  2. คลิกปุ่มสร้าง
  3. ป้อนชื่อของที่เก็บข้อมูล - เช่น "mediacdn-bucket-$PROJECT_ID"
  4. ปล่อยให้การตั้งค่าที่เหลือเป็นค่าเริ่มต้น
  5. คลิกปุ่มสร้าง

50475e01c5a3adbe.png

5. อัปโหลดออบเจ็กต์ทดสอบไปยังที่เก็บข้อมูล Cloud Storage

ตอนนี้เราจะอัปโหลดออบเจ็กต์ลงใน Bucket ของ Cloud Storage

  1. สร้างไฟล์ใน Cloud Shell แล้วอัปโหลดลงในที่เก็บข้อมูลโดยใช้ gsutil
echo media-cdn-service-extensions-test > file.txt

gsutil cp file.txt gs://mediacdn-bucket-$PROJECT_ID
  1. ให้สิทธิ์เข้าถึง Media CDN แก่ Bucket
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 แต่ละรายการประกอบด้วยทรัพยากรหลัก 2 รายการ ได้แก่

  • EdgeCacheService มีหน้าที่รับผิดชอบการกำหนดค่าที่หันหน้าไปทางไคลเอ็นต์ (TLS, การกำหนด IP), การกำหนดเส้นทาง, การกำหนดค่า CDN (โหมดแคช, TTL, การลงนาม) และนโยบายความปลอดภัย
  • EdgeCacheOrigin มีหน้าที่รับผิดชอบการกำหนดค่าต่อต้นทางสำหรับต้นทางที่ใช้ HTTP รวมถึงเงื่อนไขการลองอีกครั้งเมื่อเนื้อหาไม่พร้อมใช้งานหรือเข้าถึงไม่ได้

กำหนดค่าต้นทางของ Edge Cache

ตอนนี้มาสร้างต้นทางที่ชี้ไปยัง Bucket ของ Cloud Storage ที่คุณเพิ่งสร้างกัน

  1. ในคอนโซล Google Cloud ให้ไปที่หน้า Media CDN
  2. คลิกแท็บต้นทาง
  3. คลิกสร้างต้นทาง
  4. ป้อน "cloud-storage-origin" เป็นชื่อต้นทางของ Edge Cache
  5. ในส่วนที่อยู่ต้นทาง ให้ทำดังนี้
  6. เลือก "เลือกที่เก็บข้อมูล Google Cloud Storage"
  7. เรียกดู Bucket ของ Cloud Storage ที่ชื่อ "mediacdn-bucket-$PROJECT_ID"
  8. คลิกเลือก
  9. ปล่อยให้การตั้งค่าที่เหลือเป็นค่าเริ่มต้น
  10. คลิกสร้างต้นทาง

e6eb0faa94838c4.png

ทรัพยากร EdgeCacheOrigin ที่สร้างขึ้นใหม่จะปรากฏในรายการต้นทางในโปรเจ็กต์ของคุณในหน้าต้นทาง

กำหนดค่าบริการแคชที่ Edge

  1. ในคอนโซล Google Cloud ให้ไปที่หน้า Media CDN
  2. คลิกแท็บ SERVICES
  3. คลิกสร้างบริการ
  4. ป้อนชื่อที่ไม่ซ้ำกันสำหรับบริการ เช่น "media-cdn" แล้วคลิกถัดไป

d2f9ac837bc5d45a.png

  1. ในส่วนการกำหนดเส้นทาง ให้คลิกเพิ่มกฎโฮสต์
  2. ป้อนไวลด์การ์ด "*" ในช่องโฮสต์

25d3e25000934e59.png

  1. คลิกเพิ่มกฎการกำหนดเส้นทาง
  2. ระบุ "1" สำหรับลำดับความสำคัญ
  3. คลิกเพิ่มเงื่อนไขการจับคู่ สำหรับการจับคู่เส้นทาง ให้เลือก "การจับคู่คำนำหน้า" เป็นประเภทการจับคู่ ระบุ "/" ในช่องการจับคู่เส้นทาง แล้วคลิกเสร็จสิ้น
  4. เลือกดึงข้อมูลจากต้นทางในส่วนการดำเนินการหลัก แล้วเลือกต้นทางที่คุณกำหนดค่าไว้ในรายการแบบเลื่อนลง

d1975f366233521a.png

  1. คลิกการกำหนดค่าขั้นสูงเพื่อขยายตัวเลือกการกำหนดค่าเพิ่มเติม
  2. ในการดำเนินการเส้นทาง ให้คลิกเพิ่มรายการ จากนั้นทำดังนี้
  3. เลือก "นโยบาย CDN" สำหรับประเภท
  4. สำหรับโหมดแคช ให้เลือก "บังคับแคชทั้งหมด"
  5. ปล่อยให้ส่วนที่เหลือเป็นค่าเริ่มต้น
  6. คลิกเสร็จสิ้น
  7. คลิกบันทึก

b7e77d059db84ab6.png

  1. คลิกสร้างบริการ

ทรัพยากร 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
...

ตอนนี้คุณสร้างการติดตั้งใช้งาน Media CDN โดยใช้ Cloud Storage เป็นต้นทางเรียบร้อยแล้ว

7. กำหนดค่า Artifact Registry สำหรับส่วนขยายบริการ

เราต้องกำหนดค่า Artifact Registry ก่อนสร้างส่วนขยายบริการ Artifact Registry คือตัวจัดการแพ็กเกจแบบสากลของ Google Cloud สำหรับจัดการอาร์ติแฟกต์การสร้าง ระบบจะเผยแพร่ปลั๊กอินส่วนขยายบริการ (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

คุณจะสร้างที่เก็บโดยใช้ GUI ก็ได้ ดังนี้

  1. ในคอนโซล Google Cloud ให้ไปที่หน้า Artifact Registry
  2. คลิกปุ่ม + สร้างที่เก็บ
  3. ป้อนชื่อที่เก็บ เช่น "service-extension-$PROJECT_ID"
  4. รูปแบบ - "Docker", โหมด - "มาตรฐาน", ประเภทสถานที่ตั้ง - "ภูมิภาค" และเลือก "us-central1 (ไอโอวา)"
  5. คลิกปุ่มสร้าง

b525b3bc0867dc42.png

ทรัพยากรที่เก็บ Artifact Registry ที่สร้างใหม่ควรปรากฏในหน้า "ที่เก็บ"

เมื่อสร้างทรัพยากรที่เก็บแล้ว ให้เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อกำหนดค่าไคลเอ็นต์ Docker ของ Cloud Shell ให้พุชและพุลแพ็กเกจโดยใช้ที่เก็บนี้

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

เอาต์พุต:

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

8. กำหนดค่าส่วนขยายบริการใน Media CDN

ตอนนี้เราจะสาธิตวิธีเขียนและสร้างปลั๊กอินส่วนขยายบริการ (Proxy-Wasm) ที่สามารถนำไปใช้กับ Media CDN โดยใช้ภาษาโปรแกรม Rust

ในตัวอย่างนี้ เราจะสร้างปลั๊กอิน Proxy-Wasm ที่ตรวจสอบว่าคำขอ HTTP แต่ละรายการมีส่วนหัวการให้สิทธิ์ที่มีค่าเป็น "secret" หากคำขอไม่มีส่วนหัวนี้ ปลั๊กอินจะสร้างการตอบกลับ HTTP 403 Forbidden

มาทบทวนส่วนขยายบริการกันสักหน่อย โดยมีทรัพยากรหลัก 3 อย่าง ได้แก่ WasmAction, WasmPlugin และ WasmPluginVersion

  • ทรัพยากร WasmAction คือสิ่งที่แนบกับ EdgeCacheService ของ Media CDN WasmAction อ้างอิงทรัพยากร WasmPlugin
  • ทรัพยากร WasmPlugin มีเวอร์ชันหลักซึ่งสอดคล้องกับ WasmPluginVersion ที่ใช้งานอยู่ในปัจจุบัน
  • WasmPluginVersions อ้างอิงอิมเมจคอนเทนเนอร์จาก Artifact Registry เมื่อทำการเปลี่ยนแปลงปลั๊กอิน Proxy-Wasm คุณจะสร้าง WasmPluginVersion ที่แตกต่างกัน

โปรดดูแผนภาพด้านล่างเพื่อทำความเข้าใจความสัมพันธ์ระหว่างแหล่งข้อมูลเหล่านี้ให้ดียิ่งขึ้น

22b3548b3a61c379.png

เขียนและสร้างปลั๊กอินส่วนขยายบริการ

  1. ติดตั้งชุดเครื่องมือ Rust โดยทำตามวิธีการที่ https://www.rust-lang.org/tools/install
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. ตอนนี้เราได้กำหนดค่าไฟล์ Manifest Cargo.toml และเขียนโค้ด Proxy-Wasm ในไฟล์ lib.rs แล้ว เราก็สามารถสร้างปลั๊กอิน Proxy-Wasm ได้
cargo build --release --target wasm32-wasi

เมื่อบิลด์เสร็จสมบูรณ์แล้ว คุณจะเห็นข้อความดังที่แสดงด้านล่าง

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

นอกจากนี้ ให้ยืนยันไดเรกทอรี target และตรวจสอบว่ามีการสร้างไฟล์แล้ว

ls ./target

คุณจะเห็นเอาต์พุตดังที่แสดงด้านล่าง

CACHEDIR.TAG release wasm32-wasi

เผยแพร่ปลั๊กอิน Proxy-Wasm ไปยัง Artifact Registry

ตอนนี้เราจะเผยแพร่ปลั๊กอิน Proxy-Wasm ไปยังที่เก็บ Artifact Registry ที่คุณสร้างไว้ก่อนหน้านี้เพื่อให้สามารถนำไปใช้กับ Media CDN ได้

เราจะแพ็กเกจปลั๊กอิน Proxy-Wasm ในอิมเมจคอนเทนเนอร์ก่อน

  1. สร้างไฟล์ชื่อ Dockerfile ในไดเรกทอรี my-wasm-plugin เดียวกัน โดยมีเนื้อหาต่อไปนี้
FROM scratch 
COPY target/wasm32-wasi/release/my_wasm_plugin.wasm plugin.wasm
  1. จากนั้นสร้างอิมเมจคอนเทนเนอร์โดยทำดังนี้
docker build --no-cache --platform wasm -t my-wasm-plugin .

(โปรเซสเซอร์ที่ไม่ใช่ x86 เท่านั้น) จากนั้นสร้างอิมเมจคอนเทนเนอร์โดยทำดังนี้

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

เอาต์พุต

[+] Building 0.2s (5/5) FINISHED                                     docker:default
...
  1. จากนั้นเผยแพร่หรือ "พุช" ปลั๊กอิน Proxy-Wasm ไปยัง Artifact Registry เราจะติดแท็กอิมเมจคอนเทนเนอร์ด้วยแท็ก "prod"
docker tag my-wasm-plugin $LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/my-wasm-plugin:prod

ตอนนี้เราจะพุชอิมเมจคอนเทนเนอร์ "prod" ที่ติดแท็กไปยังที่เก็บ

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

เอาต์พุต:

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

ตอนนี้มาตรวจสอบว่าระบบได้พุชอิมเมจคอนเทนเนอร์ของปลั๊กอิน Proxy-Wasm ไปยัง Artifact Registry เรียบร้อยแล้ว คุณควรเห็นเอาต์พุตที่คล้ายกันดังนี้

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

เอาต์พุต:

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

เชื่อมโยงปลั๊กอิน Proxy-Wasm กับการติดตั้งใช้งาน Media CDN

ตอนนี้เราพร้อมที่จะเชื่อมโยงปลั๊กอิน Proxy-Wasm กับการติดตั้งใช้งาน Media CDN แล้ว

ปลั๊กอิน Proxy-Wasm จะเชื่อมโยงกับเส้นทาง Media CDN ในทรัพยากร EdgeCacheService

  1. ก่อนอื่น เราจะสร้างทรัพยากรปลั๊กอิน Wasm สำหรับปลั๊กอิน 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 เชื่อมโยงกับอิมเมจคอนเทนเนอร์ที่อยู่ในที่เก็บ Artifact Registry เรียบร้อยแล้ว คุณควรเห็นเอาต์พุตที่คล้ายกันดังนี้

gcloud alpha service-extensions wasm-plugin-versions list --wasm-plugin=my-wasm-plugin-resource

เอาต์พุต:

NAME   WASM_IMAGE WASM_IMAGE_DIGEST CONFIG_SIZE  CONFIG_IMAGE CONFIG_IMAGE_DIGEST UPDATE_TIME                                            
c7cfa2 <LOCATION>-docker.pkg.dev/.../my-wasm-plugin@sha256:6d663... ... ... 
...
  1. จากนั้นเราจะสร้างทรัพยากร WasmAction ที่อ้างอิงทรัพยากรปลั๊กอิน Wasm
gcloud alpha service-extensions wasm-actions create my-wasm-action-resource \
    --wasm-plugin=my-wasm-plugin-resource

นอกจากนี้ ให้ตรวจสอบว่าเชื่อมโยงทรัพยากร WasmAction กับปลั๊กอิน Proxy-Wasm เรียบร้อยแล้ว คุณควรเห็นเอาต์พุตที่คล้ายกันดังนี้

gcloud alpha service-extensions wasm-actions list

เอาต์พุต:

NAME                                     WASMPLUGIN                                            
my-wasm-action-resource                  projects/805782461588/locations/global/wasmPlugins/myenvoyfilter-resource
...
  1. ตอนนี้เราต้องส่งออกการกำหนดค่าของ Media CDN EdgeCacheService โดยทำดังนี้
gcloud edge-cache services export media-cdn --destination=my-service.yaml
  1. จากนั้นเปิดไฟล์ my-service.yaml แล้วเพิ่ม wasmAction ลงใน routeAction สำหรับเส้นทางที่กำหนด ซึ่งอ้างอิงถึงทรัพยากร WasmPlugin ที่สร้างไว้ก่อนหน้านี้
wasmAction: "my-wasm-action-resource"
  1. หลังจากแก้ไขแล้ว ไฟล์ my-service.yaml ควรมีลักษณะดังนี้
...

pathMatchers:
  - name: routes
    routeRules:
    - headerAction: {}
      matchRules:
      - prefixMatch: /
      origin: projects/<PROJECT_NUM>/locations/global/edgeCacheOrigins/cloud-storage-origin
      priority: '1'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 3600s
          signedRequestMode: DISABLED
        wasmAction: "my-wasm-action-resource"
...
  1. จากนั้นเราจะบันทึกการกำหนดค่าที่อัปเดตพร้อมการกำหนดค่า Proxy-Wasm ลงในไฟล์ my-service-with-wasm.yaml
  1. สุดท้าย เราจะนำเข้าการกำหนดค่าที่อัปเดตแล้วสำหรับสภาพแวดล้อม Media CDN ที่ใช้งานจริง
$ gcloud alpha edge-cache services import media-cdn --source=my-service-with-wasm.yaml

9. ตรวจสอบปลั๊กอิน Service Extensions Proxy-Wasm ใน Media CDN

หากต้องการทดสอบว่าบริการได้รับการกำหนดค่าอย่างถูกต้องเพื่อแคชเนื้อหาหรือไม่ ให้ใช้เครื่องมือบรรทัดคำสั่ง curl เพื่อส่งคำขอและตรวจสอบการตอบกลับ

curl -svo /dev/null "http://IP_ADDRESS/file.txt"

คำสั่งควรสร้างเอาต์พุตที่คล้ายกับตัวอย่างต่อไปนี้

< HTTP/2 403 Forbidden
...
Access forbidden.
...

ตอนนี้ให้ส่งคำขออีกครั้งโดยมีส่วนหัวการให้สิทธิ์และค่าเป็น "secret"

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 ด้านล่างนี้ เราจะอธิบายขั้นตอนการทำให้ปลั๊กอินเวอร์ชันที่อัปเดตแล้วใช้งานได้

ตัวอย่างเช่น คุณอาจอัปเดตโค้ดปลั๊กอินตัวอย่างเพื่อประเมินส่วนหัวการให้สิทธิ์เทียบกับค่าอื่นสำหรับการตรวจสอบสิทธิ์ โดยแก้ไขโค้ดดังต่อไปนี้

ก่อนอื่น ให้อัปเดตไฟล์ต้นฉบับ 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 ใหม่ จากนั้นอัปเดต –main-version ของ WasmPlugin เพื่ออ้างอิงเวอร์ชันใหม่

gcloud alpha service-extensions wasm-plugin-versions create my-version-2 \
    --wasm-plugin=my-wasm-plugin-resource \
   --image="$LOCATION-docker.pkg.dev/$PROJECT_NUM/$REPOSITORY>/my-wasm-plugin:prod"
gcloud alpha service-extensions wasm-plugins update my-wasm-plugin-resource \
    --main-version=my-version-2

ตอนนี้คุณได้อัปเดตเวอร์ชันของอิมเมจคอนเทนเนอร์ที่จะนำเข้าจาก Artifact Registry และพุชไปยังการติดตั้งใช้งาน Media CDN เรียบร้อยแล้ว

การย้อนกลับไปใช้เวอร์ชันก่อนหน้า

หากต้องการเปลี่ยนกลับไปใช้ปลั๊กอินเวอร์ชันก่อนหน้า คุณสามารถอัปเดตทรัพยากรปลั๊กอิน Wasm เพื่ออ้างอิงเวอร์ชันก่อนหน้าได้

ก่อนอื่นเราจะแสดงรายการเวอร์ชันที่พร้อมใช้งาน

gcloud alpha service-extensions wasm-plugin-versions list --wasm-plugin=my-wasm-plugin-resource

คุณควรเห็นเอาต์พุตต่อไปนี้

NAME   WASM_IMAGE WASM_IMAGE_DIGEST CONFIG_SIZE  CONFIG_IMAGE CONFIG_IMAGE_DIGEST UPDATE_TIME                                            
c7cfa2 <LOCATION>-docker.pkg.dev/.../my-wasm-plugin@sha256:6d663... ... ... 
a2a8ce <LOCATION>-docker.pkg.dev/.../my-wasm-plugin@sha256:08c12... ... ... 

จากนั้นเราจะอัปเดตทรัพยากรปลั๊กอิน Wasm เพื่ออ้างอิงเวอร์ชันก่อนหน้า "a2a8ce" ดังนี้

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

เมื่อดำเนินการสำเร็จแล้ว คุณควรเห็นเอาต์พุตต่อไปนี้

✓ WASM Plugin [my-wasm-plugin-resource] is now serving version "a2a8ce"

เนื่องจาก Media CDN จะบันทึกไดเจสต์ของอิมเมจ Docker ทุกครั้งที่มีการสร้างทรัพยากรปลั๊กอิน 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 ที่เชื่อมโยงกัน โปรดทำตามขั้นตอนต่อไปนี้

ก่อนอื่น ให้นำการอ้างอิงถึง 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. ล้างข้อมูลในสภาพแวดล้อมของ Lab

หลังจากทำ CodeLab เสร็จแล้ว อย่าลืมล้างข้อมูลทรัพยากรของ Lab มิฉะนั้นทรัพยากรจะยังคงทำงานและสร้างค่าใช้จ่ายต่อไป

คำสั่งต่อไปนี้จะลบบริการ EdgeCache ของ Media CDN, การกำหนดค่า 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. ยินดีด้วย

ขอแสดงความยินดี คุณทำ Codelab ส่วนขยายบริการใน Media CDN เสร็จสมบูรณ์แล้ว

สิ่งที่เราได้พูดถึง

  • วิธีตั้งค่า Media CDN โดยตั้งค่า Bucket ของ Cloud Storage เป็นต้นทาง
  • วิธีสร้างปลั๊กอินส่วนขยายบริการด้วยการตรวจสอบสิทธิ์ HTTP ที่กำหนดเองและเชื่อมโยงกับ Media CDN
  • วิธีตรวจสอบว่าปลั๊กอินส่วนขยายบริการทำงานได้ตามที่คาดไว้
  • (ไม่บังคับ) วิธีจัดการปลั๊กอินส่วนขยายบริการ เช่น การอัปเดต การอ้างอิง การย้อนกลับ และการลบปลั๊กอินเวอร์ชันที่เฉพาะเจาะจง

สิ่งต่อไปที่ควรทำ

ลองใช้ Codelab เหล่านี้

อ่านเพิ่มเติม

เอกสารอ้างอิง