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

1. บทนำ

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

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

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

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

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

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

1f19151bdd96acb0.png

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

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

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

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

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

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

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

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

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

เริ่มต้น Cloud Shell

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

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

1dec6f9683153af0.png

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

de496bb88f9a0b10.png

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

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

บทบาท 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 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, ตำแหน่งพื้นที่เก็บข้อมูลของบุคคลที่สาม หรือปลายทาง HTTP(HTTPS) ที่เข้าถึงได้แบบสาธารณะ

เราจะจัดเก็บเนื้อหาในที่เก็บข้อมูล Cloud Storage ใน Codelab นี้

เราจะใช้คำสั่ง gsutil mb เพื่อสร้างที่เก็บข้อมูล

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

ตอนนี้เราจะอัปโหลดออบเจ็กต์ลงในที่เก็บข้อมูล 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 เพื่อเข้าถึงที่เก็บข้อมูล
gsutil iam ch \
serviceAccount:service-$PROJECT_NUM@gcp-sa-mediaedgefill.iam.gserviceaccount.com:objectViewer gs://mediacdn-bucket-$PROJECT_ID

6. กำหนดค่า CDN สื่อ

ต่อไปเราจะสร้างการกำหนดค่า Media CDN

การกำหนดค่า Media CDN แต่ละรายการประกอบด้วยทรัพยากรหลัก 2 รายการ ได้แก่

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

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

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

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

e6eb0faa94838c4.png

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

กำหนดค่าบริการ Edge Cache

  1. ในคอนโซล Google Cloud ให้ไปที่หน้า CDN ของสื่อ
  2. คลิกแท็บบริการ
  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 ให้ไปที่หน้า CDN ของสื่อ
  2. ไปที่ CDN สื่อ
  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 ด้วย Cloud Storage เป็นต้นทางเรียบร้อยแล้ว

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

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

เราจะใช้คำสั่งสร้างที่เก็บอาร์ติแฟกต์ gcloud เพื่อสร้างที่เก็บ

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 Repository ที่สร้างใหม่จะปรากฏในหน้าที่เก็บ

เมื่อสร้างทรัพยากรที่เก็บแล้ว ให้เรียกใช้คำสั่งต่อไปนี้ใน 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

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

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

ทวนความจำสั้นๆ เกี่ยวกับส่วนขยายบริการ - มีทรัพยากรหลัก 3 แหล่ง ได้แก่ WasmAction, WasmPlugin และ WasmPluginVersion

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

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

22b3548b3a61c379.png

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

  1. ติดตั้ง Toolchain ของ Rust โดยทำตามวิธีการที่ https://www.rust-lang.org/tools/install
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  1. ถัดไป ให้เพิ่มการสนับสนุน Wasm ใน Toolchain ของ 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-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 เชื่อมโยงกับอิมเมจคอนเทนเนอร์อยู่ในที่เก็บ 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. สุดท้าย เราจะนำเข้าการกำหนดค่าที่อัปเดตแล้วสำหรับสภาพแวดล้อม CDN ของสื่อที่ใช้งานจริง
$ gcloud alpha edge-cache services import media-cdn --source=my-service-with-wasm.yaml

9. ตรวจสอบปลั๊กอิน Proxy-Wasm ของส่วนขยายบริการบน Media CDN

หากต้องการทดสอบว่าบริการของคุณได้รับการกำหนดค่าอย่างถูกต้องเพื่อแคชเนื้อหาหรือไม่ ให้ใช้เครื่องมือบรรทัดคำสั่ง 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 เวอร์ชันเก่าเพื่ออ้างอิงเวอร์ชันใหม่

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-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, การกำหนดค่า 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 เสร็จสมบูรณ์แล้ว

หัวข้อที่ครอบคลุม

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

สิ่งที่ต้องทำต่อไป

ลองดู Codelab เหล่านี้...

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

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