เกี่ยวกับ Codelab นี้
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)
สิ่งที่คุณจะได้เรียนรู้
- วิธีตั้งค่า 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 บนแถบเครื่องมือด้านขวาบนดังนี้
การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมนี้ควรใช้เวลาเพียงครู่เดียว เมื่อเสร็จแล้ว คุณจะเห็นข้อมูลต่อไปนี้
เครื่องเสมือนนี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 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 ดังต่อไปนี้ได้
- ในคอนโซล Google Cloud ให้ไปที่หน้า Cloud Storage
- คลิกปุ่มสร้าง
- ป้อนชื่อที่เก็บข้อมูล - เช่น "mediacdn-bucket-$PROJECT_ID"
- ปล่อยการตั้งค่าที่เหลือเป็นค่าเริ่มต้น
- คลิกปุ่มสร้าง
5 อัปโหลดออบเจ็กต์ทดสอบไปยังที่เก็บข้อมูล Cloud Storage
ตอนนี้เราจะอัปโหลดออบเจ็กต์ลงในที่เก็บข้อมูล Cloud Storage
- สร้างไฟล์ใน Cloud Shell แล้วอัปโหลดไฟล์ดังกล่าวลงในที่เก็บข้อมูลโดยใช้ gsutil
echo media-cdn-service-extensions-test > file.txt gsutil cp file.txt gs://mediacdn-bucket-$PROJECT_ID
- ให้สิทธิ์ 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 ที่คุณเพิ่งสร้างกัน
- ในคอนโซล Google Cloud ให้ไปที่หน้า CDN ของสื่อ
- คลิกแท็บต้นทาง
- คลิกสร้างต้นทาง
- ป้อน "cloud-storage-origin" เป็นชื่อสำหรับต้นทางของแคช Edge
- ในส่วนที่อยู่ต้นทาง ให้ทำดังนี้
- ให้เลือก "เลือกที่เก็บข้อมูล Google Cloud Storage"
- เรียกดูไปยังที่เก็บข้อมูล Cloud Storage ชื่อ "mediacdn-bucket-$PROJECT_ID"
- คลิก "เลือก"
- ปล่อยการตั้งค่าที่เหลือเป็นค่าเริ่มต้น
- คลิกสร้างต้นทาง
ทรัพยากร EdgeCacheOrigin ที่สร้างใหม่จะปรากฏในรายการต้นทางในโปรเจ็กต์ของคุณในหน้าต้นทาง
กำหนดค่าบริการ Edge Cache
- ในคอนโซล Google Cloud ให้ไปที่หน้า CDN ของสื่อ
- คลิกแท็บบริการ
- คลิกสร้างบริการ
- ป้อนชื่อที่ไม่ซ้ำกันสำหรับบริการ เช่น "media-cdn" - จากนั้นคลิกถัดไป
- ในส่วนการกำหนดเส้นทาง ให้คลิกเพิ่มกฎของโฮสต์
- ป้อนไวลด์การ์ด - "*" ในฟิลด์โฮสต์
- คลิกเพิ่มกฎการกำหนดเส้นทาง
- สำหรับลำดับความสำคัญ ให้ระบุ "1"
- คลิกเพิ่มเงื่อนไขการจับคู่สำหรับการจับคู่เส้นทาง ให้เลือก "การจับคู่คำนำหน้า" เป็นประเภทการจับคู่ ให้ระบุ "/" ในช่องการจับคู่เส้นทาง แล้วคลิกเสร็จสิ้น
- เลือกดึงข้อมูลจากต้นทางในส่วน "การดำเนินการหลัก" แล้วเลือกต้นทางที่คุณกำหนดค่าไว้ในรายการแบบเลื่อนลง
- คลิกการกำหนดค่าขั้นสูงเพื่อขยายตัวเลือกการกำหนดค่าเพิ่มเติม
- ในการดำเนินการเส้นทาง ให้คลิกเพิ่มรายการ จากนั้นทำดังต่อไปนี้
- สำหรับประเภท ให้เลือก "นโยบาย CDN"
- สำหรับโหมดแคช ให้เลือก "บังคับแคชทั้งหมด"
- ปล่อยส่วนที่เหลือเป็นค่าเริ่มต้น
- คลิกเสร็จสิ้น
- คลิกบันทึก
- คลิกสร้างบริการ
ทรัพยากร EdgeCacheService ที่สร้างใหม่จะปรากฏในหน้าบริการในรายการบริการในโปรเจ็กต์
ดึงข้อมูลที่อยู่ IP ของ MediaCDN และการทดสอบ
- ในคอนโซล Google Cloud ให้ไปที่หน้า CDN ของสื่อ
- ไปที่ CDN สื่อ
- คลิกแท็บบริการ
- สำหรับบริการของคุณ โปรดดูที่คอลัมน์ที่อยู่
หากต้องการทดสอบว่าบริการของคุณได้รับการกำหนดค่าอย่างถูกต้องเพื่อแคชเนื้อหาหรือไม่ ให้ใช้เครื่องมือบรรทัดคำสั่ง 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 ดังต่อไปนี้ได้
- ในคอนโซล Google Cloud ให้ไปที่หน้า Artifact Registry
- คลิกปุ่ม + สร้างที่เก็บ
- ป้อนชื่อสำหรับที่เก็บ เช่น "service-extension-$PROJECT_ID"
- รูปแบบ - "Docker" โหมด - "มาตรฐาน" ประเภทสถานที่ตั้ง - "ภูมิภาค" แล้วเลือก "us-central1 (ไอโอวา)"
- คลิกปุ่มสร้าง
ทรัพยากร 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 ที่ต่างกันด้วย
โปรดดูแผนภาพด้านล่างเพื่อทำความเข้าใจความสัมพันธ์ระหว่างแหล่งข้อมูลเหล่านี้ให้ดียิ่งขึ้น
เขียนและสร้างปลั๊กอินส่วนขยายบริการ
- ติดตั้ง Toolchain ของ Rust โดยทำตามวิธีการที่ https://www.rust-lang.org/tools/install
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
- ถัดไป ให้เพิ่มการสนับสนุน Wasm ใน Toolchain ของ Rust โดยเรียกใช้คำสั่งต่อไปนี้
rustup target add wasm32-wasi
- สร้างแพ็กเกจ Rust ชื่อ my-wasm-plugin ด้วยคำสั่งต่อไปนี้
cargo new --lib my-wasm-plugin
เอาต์พุต:
Created library `my-wasm-plugin` package
- ป้อนไดเรกทอรี my-wasm-plugin จากนั้นคุณควรเห็นไฟล์
Cargo.toml
และไดเรกทอรีsrc
cd my-wasm-plugin ls
เอาต์พุต:
Cargo.toml src
- ถัดไป ให้กำหนดค่าแพ็กเกจ 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"
- หลังจากแก้ไขแล้ว ไฟล์
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"
- หลังจากแก้ไขแล้ว ไฟล์
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 {}
- เมื่อเรากำหนดค่าไฟล์ 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 ในอิมเมจคอนเทนเนอร์
- สร้างไฟล์ชื่อ
Dockerfile
ในไดเรกทอรีเดียวกัน my-wasm-plugin โดยใช้เนื้อหาต่อไปนี้
FROM scratch
COPY target/wasm32-wasi/release/my_wasm_plugin.wasm plugin.wasm
- จากนั้น สร้างอิมเมจคอนเทนเนอร์โดยทำดังนี้
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 ...
- ถัดไป เผยแพร่หรือ "พุช" ปลั๊กอิน 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
- ก่อนอื่น เราสร้างทรัพยากร Wasm-plugin สำหรับปลั๊กอิน Proxy-Wasm
gcloud alpha service-extensions wasm-plugins create my-wasm-plugin-resource
- ต่อไป เราจะสร้าง 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"
- ถัดไป เราจะระบุเวอร์ชันหลักสำหรับปลั๊กอิน 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... ... ... ...
- ต่อไป เราจะสร้างทรัพยากร 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 ...
- ตอนนี้เราจำเป็นต้องส่งออกการกำหนดค่า Media CDN EdgeCacheService โดยทำตามขั้นตอนต่อไปนี้
gcloud edge-cache services export media-cdn --destination=my-service.yaml
- จากนั้นเปิดไฟล์ my-service.yaml และเพิ่ม wasmAction ลงใน RouteAction สำหรับเส้นทางที่ระบุ ซึ่งอ้างอิงทรัพยากร WasmPlugin ที่สร้างขึ้นก่อนหน้านี้
wasmAction: "my-wasm-action-resource"
- หลังจากแก้ไขแล้ว ไฟล์ 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"
...
- จากนั้น เราจะบันทึกการกำหนดค่าที่อัปเดตพร้อมการกำหนดค่า Proxy-Wasm ลงในไฟล์
my-service-with-wasm.yaml
- สุดท้าย เราจะนำเข้าการกำหนดค่าที่อัปเดตแล้วสำหรับสภาพแวดล้อม 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 เหล่านี้...