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)

สิ่งที่คุณจะได้เรียนรู้
- วิธีตั้งค่า 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 ในแถบเครื่องมือด้านขวาบน

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

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 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 ได้ดังนี้
- ในคอนโซล Google Cloud ให้ไปที่หน้า Cloud Storage
- คลิกปุ่มสร้าง
- ป้อนชื่อของที่เก็บข้อมูล - เช่น "mediacdn-bucket-$PROJECT_ID"
- ปล่อยให้การตั้งค่าที่เหลือเป็นค่าเริ่มต้น
- คลิกปุ่มสร้าง

5. อัปโหลดออบเจ็กต์ทดสอบไปยังที่เก็บข้อมูล Cloud Storage
ตอนนี้เราจะอัปโหลดออบเจ็กต์ลงใน Bucket ของ Cloud Storage
- สร้างไฟล์ใน Cloud Shell แล้วอัปโหลดลงในที่เก็บข้อมูลโดยใช้ gsutil
echo media-cdn-service-extensions-test > file.txt gsutil cp file.txt gs://mediacdn-bucket-$PROJECT_ID
- ให้สิทธิ์เข้าถึง 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 ที่คุณเพิ่งสร้างกัน
- ในคอนโซล Google Cloud ให้ไปที่หน้า Media CDN
- คลิกแท็บต้นทาง
- คลิกสร้างต้นทาง
- ป้อน "cloud-storage-origin" เป็นชื่อต้นทางของ Edge Cache
- ในส่วนที่อยู่ต้นทาง ให้ทำดังนี้
- เลือก "เลือกที่เก็บข้อมูล Google Cloud Storage"
- เรียกดู Bucket ของ Cloud Storage ที่ชื่อ "mediacdn-bucket-$PROJECT_ID"
- คลิกเลือก
- ปล่อยให้การตั้งค่าที่เหลือเป็นค่าเริ่มต้น
- คลิกสร้างต้นทาง

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

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

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

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

- คลิกสร้างบริการ
ทรัพยากร EdgeCacheService ที่สร้างขึ้นใหม่จะปรากฏในหน้าบริการในรายการบริการในโปรเจ็กต์
ดึงข้อมูลที่อยู่ IP ของ MediaCDN และการทดสอบ
- ในคอนโซล Google Cloud ให้ไปที่หน้า Media CDN
- ไปที่ Media CDN
- คลิกแท็บ Services
- สำหรับบริการของคุณ ให้ดูคอลัมน์ที่อยู่

หากต้องการทดสอบว่าบริการได้รับการกำหนดค่าอย่างถูกต้องเพื่อแคชเนื้อหาหรือไม่ ให้ใช้เครื่องมือบรรทัดคำสั่ง 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 ก็ได้ ดังนี้
- ในคอนโซล Google Cloud ให้ไปที่หน้า Artifact Registry
- คลิกปุ่ม + สร้างที่เก็บ
- ป้อนชื่อที่เก็บ เช่น "service-extension-$PROJECT_ID"
- รูปแบบ - "Docker", โหมด - "มาตรฐาน", ประเภทสถานที่ตั้ง - "ภูมิภาค" และเลือก "us-central1 (ไอโอวา)"
- คลิกปุ่มสร้าง

ทรัพยากรที่เก็บ 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 ที่แตกต่างกัน
โปรดดูแผนภาพด้านล่างเพื่อทำความเข้าใจความสัมพันธ์ระหว่างแหล่งข้อมูลเหล่านี้ให้ดียิ่งขึ้น

เขียนและสร้างปลั๊กอินส่วนขยายบริการ
- ติดตั้งชุดเครื่องมือ Rust โดยทำตามวิธีการที่ https://www.rust-lang.org/tools/install
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
- จากนั้นเพิ่มการรองรับ Wasm ลงในชุดเครื่องมือ 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 สำหรับปลั๊กอิน 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
- สุดท้าย เราจะนำเข้าการกำหนดค่าที่อัปเดตแล้วสำหรับสภาพแวดล้อม 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 เหล่านี้