1. บทนำ
อัปเดตล่าสุด: 01-11-2024
เราจะปรับแอปพลิเคชัน PHP เก่าให้ทันสมัยใน Google Cloud ได้อย่างไร
(📽️ ดูวิดีโอแนะนำความยาว 7 นาที เกี่ยวกับโค้ดแล็บนี้)
เป็นเรื่องปกติที่จะมีการใช้งานแอปพลิเคชันเดิมในองค์กรที่ต้องปรับปรุงให้ทันสมัย ซึ่งหมายความว่าต้องปรับขนาดได้ ปลอดภัย และใช้งานได้ในสภาพแวดล้อมต่างๆ
ในเวิร์กช็อปนี้ คุณจะได้ทําสิ่งต่อไปนี้
- สร้างคอนเทนเนอร์แอปพลิเคชัน PHP
- เปลี่ยนไปใช้บริการฐานข้อมูลที่มีการจัดการ ( Cloud SQL)
- ทำให้ใช้งานได้กับ Cloud Run (เป็นทางเลือกแบบไม่ต้องดำเนินการใดๆ กับ GKE/Kubernetes)
- รักษาความปลอดภัยแอปพลิเคชันด้วย Identity and Access Management (IAM) และ Secret Manager
- กำหนดไปป์ไลน์ CI/CD ผ่าน Cloud Build Cloud Build สามารถเชื่อมต่อกับที่เก็บ Git ที่โฮสต์โดยผู้ให้บริการ Git ยอดนิยม เช่น GitHub หรือ GitLab และทริกเกอร์เมื่อมีการพุชไปยังเมนได้ เป็นต้น
- โฮสต์รูปภาพแอปพลิเคชันใน Cloud Storage ซึ่งทำได้ผ่านการต่อเชื่อม และไม่จำเป็นต้องใช้โค้ดเพื่อเปลี่ยนแอป
- เปิดตัวฟังก์ชันการทำงานของ Gen AI ผ่าน Gemini ซึ่งจัดการผ่าน Cloud Functions (แบบไม่ใช้เซิร์ฟเวอร์)
- ทำความคุ้นเคยกับ SLOs และการดําเนินการแอปที่รีเฟรชใหม่
การทำตามขั้นตอนเหล่านี้จะช่วยให้คุณทยอยทำให้แอปพลิเคชัน PHP ทันสมัยขึ้น ซึ่งจะปรับปรุงความสามารถในการปรับขนาด ความปลอดภัย และความยืดหยุ่นในการใช้งาน นอกจากนี้ การเปลี่ยนไปใช้ Google Cloud ยังช่วยให้คุณใช้ประโยชน์จากโครงสร้างพื้นฐานและบริการที่มีประสิทธิภาพเพื่อให้แอปพลิเคชันทำงานได้อย่างราบรื่นในสภาพแวดล้อมแบบคลาวด์เนทีฟ
เราเชื่อว่าสิ่งที่คุณจะได้เรียนรู้จากการทำตามขั้นตอนง่ายๆ เหล่านี้สามารถนำไปใช้กับแอปพลิเคชันและองค์กรของคุณเองที่มีภาษา/สแต็กและกรณีการใช้งานที่แตกต่างกันได้
เกี่ยวกับแอป
แอปพลิเคชัน ( โค้ดภายใต้ใบอนุญาต MIT) ที่คุณแยกคือแอปพลิเคชัน PHP 5.7 พื้นฐานที่มีการตรวจสอบสิทธิ์ MySQL แนวคิดหลักของแอปนี้คือการสร้างแพลตฟอร์มที่ผู้ใช้อัปโหลดรูปภาพได้ และผู้ดูแลระบบสามารถติดแท็กรูปภาพที่ไม่เหมาะสมได้ แอปพลิเคชันมี 2 ตาราง ได้แก่
- ผู้ใช้ มาพร้อมกับผู้ดูแลระบบที่คอมไพล์ไว้ล่วงหน้า ผู้ใช้ใหม่จะลงทะเบียนได้
- รูปภาพ มีภาพตัวอย่าง 2-3 ภาพ ผู้ใช้ที่เข้าสู่ระบบจะอัปโหลดรูปภาพใหม่ได้ เราจะเพิ่มข้อมูลบางอย่างที่นี่
เป้าหมายของคุณ
เราต้องการปรับปรุงแอปพลิเคชันเก่าให้ทันสมัยเพื่อใช้ใน Google Cloud เราจะใช้ประโยชน์จากเครื่องมือและบริการต่างๆ เพื่อปรับปรุงความสามารถในการปรับขนาด เพิ่มความปลอดภัย จัดการโครงสร้างพื้นฐานแบบอัตโนมัติ และผสานรวมฟีเจอร์ขั้นสูง เช่น การจัดการรูปภาพ การตรวจสอบ และพื้นที่เก็บข้อมูล โดยใช้บริการต่างๆ เช่น Cloud SQL, Cloud Run, Cloud Build, Secret Manager และอื่นๆ
และที่สำคัญกว่านั้น เราต้องการอธิบายทีละขั้นตอนเพื่อให้คุณเรียนรู้กระบวนการคิดเบื้องหลังแต่ละขั้นตอน และโดยปกติแล้วแต่ละขั้นตอนจะเปิดโอกาสใหม่ๆ ให้กับขั้นตอนถัดไป (เช่น โมดูลที่ 2 -> 3 และ 6 -> 7)
หากยังไม่แน่ใจ ดูวิดีโอความยาว 7 นาทีนี้บน YouTube
สิ่งที่ต้องมี
- คอมพิวเตอร์ที่มีเบราว์เซอร์ที่เชื่อมต่ออินเทอร์เน็ต
- เครดิต GCP บางรายการ โปรดสอบถามผู้ชื่นชอบ Google ในพื้นที่ ;)
- คำสั่ง
gcloud
ทำงานได้ - หากทํางานในเครื่อง ให้ดาวน์โหลดที่นี่ คุณจะต้องมีเครื่องมือแก้ไขที่ดีด้วย (เช่น vscode หรือ intellij)
- หากต้องการทําทุกอย่าง "ในระบบคลาวด์" จากนั้นคุณจะใช้ Cloud Shell ได้
- ผู้ใช้ GitHub คุณต้องใช้คำสั่งนี้เพื่อแยกสาขาโค้ดต้นฉบับ 🧑🏻💻 gdgpescara/app-mod-workshop กับที่เก็บ Git ของคุณเอง ซึ่งจำเป็นต้องมีเพื่อใช้ไปป์ไลน์ CI/CD ของคุณเอง (การคอมมิตอัตโนมัติ -> บิลด์ -> ติดตั้งใช้งาน)
ดูตัวอย่างโซลูชันได้ที่นี่
- Repo ของผู้เขียน: https://github.com/Friends-of-Ricc/app-mod-workshop
- Repo เวิร์กช็อปต้นฉบับในโฟลเดอร์
.solutions/
ต่อบท
คุณเข้าร่วมเวิร์กช็อปนี้ได้จากคอมพิวเตอร์เครื่องที่ใช้อยู่ หรือจะเข้าร่วมทั้งหมดในเบราว์เซอร์ก็ได้
2. การตั้งค่าเครดิตและการแยก
แลกรับเครดิต GCP และตั้งค่าสภาพแวดล้อม GCP [ไม่บังคับ]
หากต้องการเข้าร่วมเวิร์กช็อปนี้ คุณต้องมีบัญชีการเรียกเก็บเงินที่มีเครดิตบ้าง หากมีการเรียกเก็บเงินของคุณเองอยู่แล้ว ให้ข้ามขั้นตอนนี้
สร้างบัญชี Google Gmail ใหม่ (*) เพื่อลิงก์กับเครดิต GCP สอบถามลิงก์สำหรับแลกรับเครดิต GCP หรือใช้เครดิตที่นี่ bit.ly/PHP-Amarcord-credits
ลงชื่อเข้าใช้ด้วยบัญชีที่สร้างใหม่ แล้วทำตามวิธีการ
(
) Why do I need a brand new gmail account?*
เราพบว่าผู้ใช้ทำ Codelab ไม่สำเร็จเนื่องจากบัญชี (โดยเฉพาะอีเมลงานหรืออีเมลนักเรียน) เคยมีการใช้งาน GCP มาก่อน และมีนโยบายขององค์กร ที่จำกัดไม่ให้ผู้ใช้ทำ Codelab เราขอแนะนำให้สร้างบัญชี Gmail ใหม่หรือใช้บัญชี Gmail ที่มีอยู่ (gmail.com) ที่ไม่ได้ใช้ GCP มาก่อน
คลิกปุ่มเพื่อแลกสิทธิ์
กรอกแบบฟอร์มต่อไปนี้พร้อมชื่อและนามสกุล แล้วยอมรับข้อกำหนดและเงื่อนไข
คุณอาจต้องรอ 2-3 วินาทีก่อนที่บัญชีการเรียกเก็บเงินจะปรากฏที่นี่ https://console.cloud.google.com/billing
เมื่อเสร็จแล้ว ให้เปิดคอนโซล Google Cloud และสร้างโปรเจ็กต์ใหม่โดยคลิกตัวเลือกโปรเจ็กต์ที่เมนูแบบเลื่อนลงด้านซ้ายบนซึ่งแสดง "ไม่มีองค์กร" ดูด้านล่าง
สร้างโปรเจ็กต์ใหม่หากยังไม่มี ดังที่แสดงในภาพหน้าจอด้านล่าง มีตัวเลือก "โปรเจ็กต์ใหม่" ที่มุมขวาบน
โปรดลิงก์โปรเจ็กต์ใหม่กับบัญชีสำหรับการเรียกเก็บเงินช่วงทดลองใช้ GCP ดังนี้
คุณพร้อมที่จะใช้ Google Cloud Platform แล้ว หากคุณเป็นผู้เริ่มต้นหรือต้องการทําทุกอย่างในสภาพแวดล้อมระบบคลาวด์ คุณสามารถเข้าถึง Cloud Shell และเครื่องมือแก้ไขได้ผ่านปุ่มต่อไปนี้ที่มุมซ้ายบนดังที่แสดงด้านล่าง
ตรวจสอบว่าได้เลือกโปรเจ็กต์ใหม่ทางด้านซ้ายบนแล้ว
ไม่ได้เลือก (ไม่ดี):
เลือก (ดี):
แยกแอปจาก GitHub
- ไปที่แอปเดโม: https://github.com/gdgpescara/app-mod-workshop
- คลิก🍴ส้อม
- หากไม่มีบัญชี คุณต้องสร้างบัญชีใหม่
- แก้ไขสิ่งต่างๆ ได้ตามต้องการ
- โคลนโค้ดแอปโดยใช้
git clone
https://github.com/
YOUR-GITHUB-USER/YOUR-REPO-NAME
- เปิดโฟลเดอร์โปรเจ็กต์ที่โคลนด้วยเครื่องมือแก้ไขที่ต้องการ หากเลือก Cloud Shell ให้คลิก "เปิดเครื่องมือแก้ไข" ดังที่แสดงด้านล่าง
คุณมีทุกอย่างที่จำเป็นใน Google Cloud Shell Editor ดังที่แสดงในรูปภาพต่อไปนี้
ซึ่งทำได้โดยคลิก "เปิดโฟลเดอร์" แล้วเลือกโฟลเดอร์ อาจเป็น app-mod-workshop
ในโฟลเดอร์หน้าแรก
3. โมดูลที่ 1: สร้างอินสแตนซ์ SQL
สร้างอินสแตนซ์ Google Cloud SQL
แอป PHP จะเชื่อมต่อกับฐานข้อมูล MySQL เราจึงต้องจำลองข้อมูลไปยัง Google Cloud เพื่อให้การย้ายข้อมูลเป็นไปอย่างราบรื่น Cloud SQL เหมาะอย่างยิ่งเนื่องจากช่วยให้คุณเรียกใช้ฐานข้อมูล MySQL ที่มีการจัดการครบวงจรในระบบคลาวด์ได้ ขั้นตอนมีดังนี้
- ไปที่หน้า Cloud SQL: https://console.cloud.google.com/sql/instances
- คลิก "สร้างอินสแตนซ์"
- เปิดใช้ API (หากจำเป็น) การดำเนินการนี้อาจใช้เวลาสักครู่
- เลือก MySQL
- (เราพยายามหาเวอร์ชันที่ถูกที่สุดให้คุณเพื่อให้ใช้งานได้นานขึ้น)
- รุ่น: Enterprise
- ที่กำหนดล่วงหน้า: การพัฒนา (เราลองใช้แซนด์บ็อกซ์แล้ว แต่ใช้ไม่ได้)
- Mysql Ver: 5.7 (ว้าว นึกถึงอดีตเลย)
- รหัสอินสแตนซ์: เลือก
appmod-phpapp
(หากเปลี่ยนรหัสนี้ อย่าลืมเปลี่ยนสคริปต์และโซลูชันในอนาคตด้วย) - รหัสผ่าน: อะไรก็ได้ แต่ให้จดไว้เป็น CLOUDSQL_INSTANCE_PASSWORD
- ภูมิภาค: ใช้ค่าเดียวกับที่คุณเลือกไว้สำหรับส่วนที่เหลือของแอป (เช่น มิลาน =
europe-west8
) - ความพร้อมระดับโซน: โซนเดียว (เราประหยัดเงินไว้สำหรับเวอร์ชันเดโม)
คลิกปุ่ม "สร้างอินสแตนซ์" เพื่อทำให้ฐานข้อมูล Cloud SQL ใช้งานได้ ⌛การดำเนินการจะใช้เวลาประมาณ 10 นาทีจึงจะเสร็จสมบูรณ์⌛ ในระหว่างนี้ โปรดอ่านเอกสารประกอบต่อ หรือจะเริ่มต้นแก้ปัญหาในโมดูลถัดไป ("จัดคอนเทนเนอร์แอป PHP") ก็ได้ เนื่องจากโมดูลนี้ไม่ได้ขึ้นอยู่กับโมดูลแรก (จนกว่าคุณจะแก้ไขการเชื่อมต่อฐานข้อมูล)
หมายเหตุ อินสแตนซ์นี้ควรมีค่าใช้จ่ายประมาณ 7$/วัน อย่าลืมนำไปใช้หลังจากเวิร์กช็อป
สร้างฐานข้อมูล image_catalog และผู้ใช้ใน Cloud SQL
โปรเจ็กต์แอปมาพร้อมกับโฟลเดอร์ db/
ที่มีไฟล์ SQL 2 ไฟล์ ดังนี้
- 01_schema.sql : มีโค้ด SQL เพื่อสร้างตาราง 2 ตารางที่มีข้อมูลผู้ใช้และรูปภาพ
- 02_seed.sql: มีโค้ด SQL เพื่อสร้างข้อมูลในตารางที่สร้างไว้ก่อนหน้านี้
ระบบจะใช้ไฟล์เหล่านี้ในภายหลังเมื่อสร้างฐานข้อมูล image_catalog
ซึ่งทำได้โดยทำตามขั้นตอนต่อไปนี้
- เปิดอินสแตนซ์แล้วคลิกแท็บฐานข้อมูล
- คลิก "สร้างฐานข้อมูล"
- ตั้งชื่อว่า
image_catalog
(เช่น ในการกำหนดค่าแอป PHP)
จากนั้นสร้างผู้ใช้ฐานข้อมูล ซึ่งช่วยให้เราตรวจสอบสิทธิ์เข้าสู่ฐานข้อมูล image_catalog ได้
- ตอนนี้คลิกแท็บผู้ใช้
- คลิก "เพิ่มบัญชีผู้ใช้"
- ผู้ใช้: มาสร้างกัน
- ชื่อผู้ใช้:
appmod-phpapp-user
- รหัสผ่าน: เลือกรหัสผ่านที่จำได้ หรือคลิก "สร้าง"
- เลือก "อนุญาตทุกโฮสต์ (%)" ไว้
- คลิก "เพิ่ม"
เปิด DB ให้กับ IP ที่รู้จักกันดี
โปรดทราบว่าฐานข้อมูลทั้งหมดใน Cloud SQL จะเป็น "แบบแยกส่วน" คุณต้องตั้งค่าเครือข่ายอย่างชัดเจนเพื่อให้เข้าถึงได้
- คลิกอินสแตนซ์
- เปิดเมนู "การเชื่อมต่อ"
- คลิกแท็บ "การทํางานร่วมกัน"
- คลิกในส่วน "เครือข่ายที่ได้รับอนุญาต" จากนั้นเพิ่มเครือข่าย (เช่น ซับเน็ต)
- ในระหว่างนี้ ให้เลือกการตั้งค่าที่รวดเร็วแต่ไม่ปลอดภัยเพื่อให้แอปทำงานได้ คุณอาจต้องจำกัดการตั้งค่านี้ในภายหลังให้เข้าถึงได้เฉพาะ IP ที่คุณเชื่อถือเท่านั้น
- ชื่อ: "Everyone in the world - INSECURE"
- เครือข่าย: "
0.0.0.0/0"
(หมายเหตุ: นี่เป็นส่วนที่ไม่ปลอดภัย) - คลิก "เสร็จสิ้น"
- คลิกบันทึก
คุณควรเห็นข้อมูลในลักษณะนี้
หมายเหตุ โซลูชันนี้เป็นวิธีประนีประนอมที่ดีในการทำให้เวิร์กช็อปเสร็จสิ้นใน O(hours) อย่างไรก็ตาม โปรดอ่านเอกสารความปลอดภัยเพื่อช่วยรักษาความปลอดภัยให้กับโซลูชันสำหรับเวอร์ชันที่ใช้งานจริง
ถึงเวลาทดสอบการเชื่อมต่อ DB แล้ว
มาดูกันว่าผู้ใช้ image_catalog
ที่เราสร้างไว้ก่อนหน้านี้ใช้งานได้ไหม
เข้าถึง "Cloud SQL Studio" ภายในอินสแตนซ์ แล้วป้อนฐานข้อมูล ผู้ใช้ และรหัสผ่านเพื่อตรวจสอบสิทธิ์ดังที่แสดงด้านล่าง
เมื่อเข้าสู่ส่วนนี้แล้ว คุณสามารถเปิดเครื่องมือแก้ไข SQL และไปยังส่วนถัดไปได้
นําเข้าฐานข้อมูลจากโค้ดเบส
ใช้เครื่องมือแก้ไข SQL เพื่อนําเข้าตาราง image_catalog
พร้อมข้อมูล คัดลอกโค้ด SQL จากไฟล์ในรีโป ( 01_schema.sql แล้วตามด้วย 02_seed.sql) แล้วเรียกใช้ทีละรายการตามลำดับ
หลังจากนี้ คุณควรเห็นตาราง 2 ตารางใน image_catalog ซึ่งได้แก่ users และ images ดังที่แสดงด้านล่าง
คุณสามารถทดสอบได้โดยเรียกใช้ select * from images;
ในเครื่องมือแก้ไข
นอกจากนี้ อย่าลืมจดที่อยู่ IP สาธารณะของอินสแตนซ์ Cloud SQL ไว้ด้วย เนื่องจากคุณจะต้องใช้ในภายหลัง หากต้องการดู IP ให้ไปที่หน้าหลักของอินสแตนซ์ Cloud SQL ในส่วนหน้าภาพรวม (ภาพรวม > เชื่อมต่อกับอินสแตนซ์นี้ > ที่อยู่ IP สาธารณะ)
4. โมดูลที่ 2: บรรจุแอป PHP ลงในคอนเทนเนอร์
เราต้องการสร้างแอปนี้สำหรับระบบคลาวด์
ซึ่งหมายถึงการแพ็กโค้ดเป็นไฟล์ ZIP บางประเภทซึ่งมีข้อมูลทั้งหมดที่จะเรียกใช้ในระบบคลาวด์
แพ็กเกจมีด้วยกัน 2-3 วิธีดังนี้
- Docker ได้รับความนิยมอย่างมาก แต่การตั้งค่าให้ถูกต้องค่อนข้างซับซ้อน
- Buildpack ไม่ค่อยได้รับความนิยม แต่มักจะ "เดาอัตโนมัติ" ว่าควรสร้างและเรียกใช้อะไร บ่อยครั้งก็แค่ใช้งานได้เลย
ในบริบทของเวิร์กช็อปนี้ เราจะสมมติว่าคุณใช้ Docker
หากเลือกใช้ Cloud Shell ขณะนี้เป็นเวลาที่ควรเปิด Cloud Shell อีกครั้ง (คลิกที่ด้านขวาบนของคอนโซลระบบคลาวด์)
ซึ่งจะเปิดเชลล์ที่สะดวกที่ด้านล่างของหน้า ซึ่งคุณควรแยกโค้ดในขั้นตอนการตั้งค่า
Docker
หากต้องการควบคุม โซลูชันนี้เหมาะกับคุณ ซึ่งจะมีประโยชน์เมื่อคุณต้องกำหนดค่าไลบรารีที่เฉพาะเจาะจง และแทรกลักษณะการทำงานบางอย่างที่ไม่ชัดเจน (chmod ในการอัปโหลด ไฟล์ปฏิบัติการที่ไม่ใช่มาตรฐานในแอป ฯลฯ)
เนื่องจากเราต้องการทำให้แอปพลิเคชันที่ใช้คอนเทนเนอร์ใช้งานได้ใน Cloud Run ในท้ายที่สุด โปรดดูเอกสารประกอบต่อไปนี้ คุณจะพอร์ตจาก PHP 8 กลับไปเป็น PHP 5.7 ได้อย่างไร คุณอาจใช้ Gemini กับปัญหานี้ได้ หรือจะใช้เวอร์ชันที่คอมไพล์ไว้ล่วงหน้านี้ก็ได้
Dockerfile
เวอร์ชันล่าสุดมีให้ที่นี่
หากต้องการทดสอบแอปพลิเคชันของเราในเครื่อง เราต้องเปลี่ยนไฟล์ config.php ในลักษณะที่แอป PHP จะเชื่อมต่อกับฐานข้อมูล MYSQL ที่มีอยู่ใน Google CloudSQL กรอกข้อมูลในช่องว่างตามสิ่งที่คุณตั้งค่าไว้ก่อนหน้านี้
<?php
// Database configuration
$db_host = '____________';
$db_name = '____________';
$db_user = '____________';
$db_pass = '____________';
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Errore di connessione: " . $e->getMessage());
}
session_start();
?>
DB_HOST
คือที่อยู่ IP สาธารณะของ Cloud SQL ซึ่งคุณดูได้ในคอนโซล SQL
DB_NAME
ไม่ควรมีการเปลี่ยนแปลง:image_catalog
DB_USER
ควรเป็นappmod-phpapp-user
DB_PASS
คือสิ่งที่คุณเลือก ตั้งค่าโดยใช้เครื่องหมายคำพูดเดี่ยวและหนีค่าตามต้องการ
นอกจากนี้ คุณยังแปลบทความภาษาอิตาลี 🇮🇹 บางส่วนเป็นภาษาอังกฤษได้ด้วยความช่วยเหลือจาก Gemini
โอเค ตอนนี้คุณมี Dockerfile
และกำหนดค่าแอป PHP ให้เชื่อมต่อกับ DB แล้ว ลองใช้กัน
ติดตั้ง Docker หากยังไม่มี ( ลิงก์) คุณไม่จำเป็นต้องทำขั้นตอนนี้หากใช้ Cloud Shell (เจ๋งไหมล่ะ)
ตอนนี้ให้ลองสร้างและเรียกใช้แอป PHP ที่ใช้คอนเทนเนอร์ด้วยคำสั่ง docker build และ run ที่เหมาะสม
# Build command - don't forget the final . This works if Dockerfile is inside the code folder:
$ docker build -t my-php-app-docker .
# Local Run command: most likely ports will be 8080:8080
$ docker run -it -p <CONTAINER_PORT>:<LOCAL_MACHINE_PORT> my-php-app-docker
หากทุกอย่างทำงานได้ คุณควรจะเห็นหน้าเว็บต่อไปนี้เมื่อเชื่อมต่อกับโฮสต์ในเครื่อง ตอนนี้แอปของคุณทำงานบนพอร์ต 8080 แล้ว ให้คลิกไอคอน "ตัวอย่างเว็บ" (เบราว์เซอร์ที่มีรูปตา) แล้วคลิกแสดงตัวอย่างบนพอร์ต 8080 (หรือ "เปลี่ยนพอร์ต" สำหรับพอร์ตอื่น)
การทดสอบผลลัพธ์ในเบราว์เซอร์
ตอนนี้แอปพลิเคชันของคุณควรมีลักษณะดังนี้
และหากคุณเข้าสู่ระบบด้วย Admin/admin123 คุณควรเห็นข้อมูลต่อไปนี้
เยี่ยมไปเลย ใช้งานได้แล้ว ยกเว้นข้อความภาษาอิตาลี 🎉🎉🎉
หากการบรรจุลงในคอนเทนเนอร์ถูกต้องแต่ข้อมูลเข้าสู่ระบบของ DB ไม่ถูกต้อง คุณอาจเห็นข้อความประมาณนี้
ลองอีกครั้ง คุณใกล้จะถึงแล้ว
การบันทึกไปยัง Artifact Registry [ไม่บังคับ]
ตอนนี้คุณควรมีแอปพลิเคชัน PHP ในคอนเทนเนอร์ที่ใช้งานได้พร้อมที่จะนำไปใช้งานในระบบคลาวด์แล้ว ถัดไป เราต้องมีพื้นที่ในระบบคลาวด์สำหรับจัดเก็บอิมเมจ Docker และทำให้เข้าถึงได้เพื่อนำไปใช้งานในบริการ Google Cloud เช่น Cloud Run โซลูชันพื้นที่เก็บข้อมูลนี้เรียกว่า Artifact Registry ซึ่งเป็นบริการ Google Cloud ที่มีการจัดการอย่างเต็มรูปแบบซึ่งออกแบบมาเพื่อจัดเก็บอาร์ติแฟกต์แอปพลิเคชัน ซึ่งรวมถึงอิมเมจคอนเทนเนอร์ Docker, แพ็กเกจ Maven, โมดูล npm และอื่นๆ
มาสร้างที่เก็บถาวรใน Google Cloud Artifact Registry โดยใช้ปุ่มที่เหมาะสมกัน
เลือกชื่อ รูปแบบ และภูมิภาคที่ถูกต้องซึ่งเหมาะสำหรับจัดเก็บรายการต่างๆ
กลับไปที่แท็กสภาพแวดล้อมการพัฒนาในเครื่อง แล้วพุชอิมเมจคอนเทนเนอร์ของแอปไปยังที่เก็บ Artifact Registry ที่เพิ่งสร้างขึ้น โดยให้ทำตามคำสั่งต่อไปนี้
- docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
- docker push TARGET_IMAGE[:TAG]
ผลลัพธ์ควรมีลักษณะดังภาพหน้าจอต่อไปนี้
เยี่ยมไปเลย 🎉🎉🎉 คุณก็เลื่อนระดับไปอีกขั้นได้ ในระหว่างนี้ ให้ลองใช้เวลา 2 นาทีในการอัปโหลด/เข้าสู่ระบบ/ออกจากระบบ และทำความคุ้นเคยกับปลายทางของแอป คุณจะต้องใช้งานปลายทางเหล่านี้ในภายหลัง
ข้อผิดพลาดที่อาจเกิดขึ้น
หากพบข้อผิดพลาดเกี่ยวกับคอนเทนเนอร์ ให้ลองใช้ Gemini เพื่ออธิบายและแก้ไขข้อผิดพลาด โดยให้ข้อมูลต่อไปนี้
- Dockerfile ปัจจุบัน
- ข้อผิดพลาดที่ได้รับ
- [if needed] โค้ด PHP ที่ใช้งานอยู่
สิทธิ์การอัปโหลด ลองใช้ปลายทาง /upload.php
และลองอัปโหลดรูปภาพ คุณอาจได้รับข้อผิดพลาดด้านล่าง หากใช่ คุณจะต้องทำการแก้ไข chmod/chown
ใน Dockerfile
คำเตือน: move_uploaded_file(uploads/image (3).png): เปิดสตรีมไม่สำเร็จ: ไม่ได้รับสิทธิ์ใน /var/www/html/upload.php บรรทัดที่ 11
PDOException "ไม่พบไดรเวอร์" (หรือ "Errore di connessione: ไม่พบไดรเวอร์") ตรวจสอบว่า Dockerfile มีไลบรารี PDO ที่เหมาะสมสําหรับ mysql (pdo_mysql
) เพื่อเชื่อมต่อกับ DB รับแรงบันดาลใจจากโซลูชันที่นี่
ส่งต่อคำขอไปยังแบ็กเอนด์ไม่ได้ เชื่อมต่อกับเซิร์ฟเวอร์บนพอร์ต 8080 ไม่ได้ ซึ่งหมายความว่าคุณอาจเปิดพอร์ตที่ไม่ถูกต้อง ตรวจสอบว่าคุณกำลังแสดงพอร์ตที่ Apache/Nginx ให้บริการอยู่ การดำเนินการนี้สำคัญมาก หากเป็นไปได้ ให้ลองตั้งค่าพอร์ตเป็น 8080 (ทำให้ชีวิตง่ายขึ้นด้วย Cloud Run) หากต้องการใช้พอร์ต 80 ต่อไป (เช่น เนื่องจาก Apache ต้องการใช้พอร์ตดังกล่าว) ให้ใช้คำสั่งอื่นเพื่อเรียกใช้ดังนี้
$ docker run -it -p 8080:80 # force 80
# Use the PORT environment variable in Apache configuration files.
# https://cloud.google.com/run/docs/reference/container-contract#port
RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf
5. โมดูลที่ 3: ติดตั้งใช้งานแอปใน Cloud Run
เหตุผลที่ควรใช้ Cloud Run
เป็นคำถามที่ดี เมื่อหลายปีก่อน คุณคงเลือก Google App Engine
กล่าวโดยย่อคือ ตอนนี้ Cloud Run มีแพ็กเกจเทคโนโลยีที่ใหม่กว่า ติดตั้งใช้งานได้ง่ายกว่า ราคาถูกกว่า และปรับขนาดเป็น 0 เมื่อคุณไม่ได้ใช้งาน ความยืดหยุ่นในการใช้งานคอนเทนเนอร์แบบไม่เก็บสถานะและการผสานรวมกับบริการต่างๆ ของ Google Cloud ทำให้เหมาะสําหรับการทําให้ใช้งานได้กับ Microservice และแอปพลิเคชันสมัยใหม่โดยมีค่าใช้จ่ายเพิ่มเติมน้อยที่สุดและมีประสิทธิภาพสูงสุด
กล่าวอย่างเจาะจงคือ Cloud Run เป็นแพลตฟอร์มที่มีการจัดการโดยสมบูรณ์โดย Google Cloud ซึ่งช่วยให้คุณเรียกใช้แอปพลิเคชันคอนเทนเนอร์แบบไม่เก็บสถานะในสภาพแวดล้อมแบบ Serverless ได้ โดยระบบจะจัดการโครงสร้างพื้นฐานทั้งหมดโดยอัตโนมัติ ปรับขนาดจาก 0 เพื่อรองรับการเข้าชมขาเข้าและลดขนาดเมื่อไม่มีการใช้งาน ทำให้ประหยัดต้นทุนและมีประสิทธิภาพ Cloud Run รองรับภาษาหรือไลบรารีใดก็ได้ ตราบใดที่แพ็กเกจอยู่ในคอนเทนเนอร์ ซึ่งช่วยให้การพัฒนามีความยืดหยุ่นอย่างมาก ซึ่งผสานรวมกับบริการอื่นๆ ของ Google Cloud ได้เป็นอย่างดี และเหมาะสำหรับการสร้างไมโครเซอร์วิส, API, เว็บไซต์ และแอปพลิเคชันแบบขับเคลื่อนด้วยเหตุการณ์โดยไม่ต้องจัดการโครงสร้างพื้นฐานเซิร์ฟเวอร์
ข้อกำหนดเบื้องต้น
คุณควรติดตั้ง gcloud
ในเครื่องของคุณเพื่อดำเนินการนี้ หากยังไม่ได้ดำเนินการ ให้ดูวิธีการที่นี่ แต่หากคุณใช้ Google Cloud Shell ก็ไม่ต้องดําเนินการใดๆ
ก่อนการทําให้ใช้งานได้...
หากคุณทํางานในสภาพแวดล้อมภายใน ให้ตรวจสอบสิทธิ์กับ Google Cloud ด้วยข้อมูลต่อไปนี้
$ gcloud auth login –update-adc # not needed in Cloud Shell
ซึ่งจะตรวจสอบสิทธิ์ผ่านเข้าสู่ระบบ OAuth ในเบราว์เซอร์ ตรวจสอบว่าคุณเข้าสู่ระบบผ่าน Chrome ด้วยผู้ใช้รายเดียวกัน (เช่น vattelapesca@gmail.com) ที่เข้าสู่ระบบ Google Cloud โดยเปิดใช้การเรียกเก็บเงิน
เปิดใช้ Cloud Run API ด้วยคำสั่งต่อไปนี้
$ gcloud services enable run.googleapis.com cloudbuild.googleapis.com
ตอนนี้ทุกอย่างพร้อมที่จะนำไปใช้งานใน Cloud Run แล้ว
ทำให้แอปใช้งานได้กับ Cloud Run ผ่าน gcloud
คำสั่งที่ให้คุณทําให้แอปใช้งานได้ใน Cloud Run คือ gcloud run deploy
คุณตั้งค่าได้หลายวิธีเพื่อให้บรรลุเป้าหมาย ชุดตัวเลือกขั้นต่ำ (ซึ่งคุณสามารถระบุผ่านบรรทัดคำสั่ง หรือเครื่องมือจะถามคุณด้วยพรอมต์แบบอินเทอร์แอกทีฟ) มีดังนี้
- ชื่อบริการ Cloud Run ที่ต้องการทำให้ใช้งานได้สําหรับแอป บริการ Cloud Run จะแสดง URL ที่ระบุปลายทางสําหรับแอป
- ภูมิภาค Google Cloud ที่แอปจะทํางาน (
--region
ภูมิภาค) - อิมเมจคอนเทนเนอร์ที่รวมแอปของคุณ
- ตัวแปรสภาพแวดล้อมที่แอปของคุณต้องใช้ในระหว่างการดำเนินการ
- Flag Allow-Unauthenticated ที่อนุญาตให้ทุกคนเข้าถึงแอปของคุณได้โดยไม่ต้องมีการตรวจสอบสิทธิ์เพิ่มเติม
โปรดดูวิธีใช้ตัวเลือกนี้กับบรรทัดคำสั่งในเอกสารประกอบ (หรือเลื่อนลงเพื่อดูวิธีแก้ปัญหาที่เป็นไปได้)
การทำให้ใช้งานได้จะใช้เวลา 2-3 นาที หากทุกอย่างถูกต้อง คุณควรเห็นข้อมูลประมาณนี้ในคอนโซล Google Cloud
คลิก URL ที่ Cloud Run ระบุและทดสอบแอปพลิเคชัน เมื่อตรวจสอบสิทธิ์แล้ว คุณควรเห็นข้อมูลประมาณนี้
"gcloud run deploy" ที่ไม่มีอาร์กิวเมนต์
คุณอาจสังเกตเห็นว่า gcloud run deploy
ถามคำถามที่ถูกต้องและเติมข้อมูลในช่องว่างที่คุณเว้นไว้ ยอดเยี่ยมไปเลย
อย่างไรก็ตาม ในบางโมดูล เราจะเพิ่มคําสั่งนี้ลงในทริกเกอร์ Cloud Build จึงใช้คําถามแบบอินเทอร์แอกทีฟไม่ได้ เราต้องกรอกทุกตัวเลือกในคำสั่ง คุณจึงต้องการคราฟ gcloud run deploy --option1 blah --foo bar --region your-fav-region
สีทอง คุณจะใช้วิธีใด
- ทำซ้ำขั้นตอนที่ 2-3-4 จนกว่า gcloud จะหยุดถามคำถาม
- [LOOP]
gcloud run deploy
พร้อมตัวเลือกที่พบจนถึงตอนนี้ - [LOOP] systems ask for option X
- [LOOP] ค้นหาในเอกสารสาธารณะเกี่ยวกับวิธีตั้งค่า X จาก CLI โดยเพิ่มตัวเลือก
--my-option [my-value]
- กลับไปที่ขั้นตอนที่ 2 เว้นแต่ gcloud จะดำเนินการเสร็จสมบูรณ์โดยไม่มีคำถามเพิ่มเติม
- gcloud run deploy BLAH BLAH BLAH นี้เจ๋งสุดๆ บันทึกคำสั่งไว้ เนื่องจากจะต้องใช้ในขั้นตอน Cloud Build ในภายหลัง
โปรดดูวิธีแก้ปัญหาที่เป็นไปได้ที่นี่ ดูเอกสารได้ที่นี่
เยี่ยมไปเลย 🎉🎉🎉 คุณได้ติดตั้งใช้งานแอปใน Google Cloud เรียบร้อยแล้ว ซึ่งเป็นขั้นตอนแรกในการทำให้ทันสมัย
6. โมดูล 4: ล้างรหัสผ่านด้วย Secret Manager
ในขั้นตอนก่อนหน้า เราได้ทำให้แอปใช้งานได้ใน Cloud Run อย่างสมบูรณ์ อย่างไรก็ตาม เราดำเนินการนี้ด้วยแนวทางปฏิบัติด้านความปลอดภัยที่ไม่ถูกต้อง ซึ่งก็คือการให้ข้อมูลลับบางส่วนในรูปแบบข้อความธรรมดา
การทำซ้ำครั้งแรก: อัปเดต config.php เพื่อใช้ ENV
คุณอาจสังเกตเห็นว่าเราใส่รหัสผ่าน DB ลงในโค้ดในไฟล์ config.php โดยตรง ซึ่งไม่เป็นปัญหาสำหรับการทดสอบและดูว่าแอปทำงานได้หรือไม่ แต่คุณจะคอมมิต/ใช้โค้ดดังกล่าวในสภาพแวดล้อมเวอร์ชันที่ใช้งานจริงไม่ได้ ควรอ่านรหัสผ่าน (และพารามิเตอร์การเชื่อมต่อ DB อื่นๆ) แบบไดนามิกและส่งไปยังแอปที่รันไทม์ เปลี่ยนไฟล์ config.php เพื่อให้อ่านพารามิเตอร์ db จากตัวแปร ENV หากไม่สำเร็จ คุณควรพิจารณาตั้งค่าค่าเริ่มต้น ซึ่งจะมีประโยชน์ในกรณีที่คุณโหลด ENV ไม่สําเร็จ เพื่อให้เอาต์พุตของหน้าเว็บบอกได้ว่าระบบใช้ค่าเริ่มต้นหรือไม่ กรอกข้อมูลในช่องว่างและแทนที่โค้ดใน config.php
<?php
// Database configuration with ENV variables. Set default values as well
$db_host = getenv('DB_HOST') ?: 'localhost';
$db_name = getenv('DB_NAME') ?: 'image_catalog';
$db_user = getenv('DB_USER') ?: 'appmod-phpapp-user';
$db_pass = getenv('DB_PASS') ?: 'wrong_password';
// Note getenv() is PHP 5.3 compatible
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Errore di connessione: " . $e->getMessage());
}
session_start();
?>
เนื่องจากแอปของคุณเป็นคอนเทนเนอร์ คุณจึงต้องระบุวิธีระบุตัวแปร ENV ให้กับแอป ซึ่งทำได้หลายวิธีดังนี้
- เวลาที่สร้างใน Dockerfile เพิ่มพารามิเตอร์ 4 รายการลงใน Dockerfile ก่อนหน้าโดยใช้ไวยากรณ์ ENV DB_VAR=ENV_VAR_VALUE ซึ่งจะตั้งค่าเริ่มต้นที่ลบล้างได้ในรันไทม์ เช่น คุณตั้งค่า "DB_NAME" และ "DB_USER" ได้ที่นี่และที่อื่นไม่ได้
- ในเวลาเรียกใช้ คุณตั้งค่าตัวแปรเหล่านี้สำหรับ Cloud Run ได้ทั้งจาก CLI หรือจาก UI นี่เป็นตำแหน่งที่เหมาะสมในการใส่ตัวแปรทั้ง 4 รายการ (เว้นแต่คุณจะต้องการใช้ค่าเริ่มต้นที่กำหนดไว้ใน Dockerfile ต่อไป)
ใน localhost คุณอาจต้องใส่ตัวแปร ENV ในไฟล์ .env
(ดูโฟลเดอร์ solutions)
นอกจากนี้ โปรดตรวจสอบว่าได้เพิ่ม .env ลงใน .gitignore
แล้ว คุณไม่ต้องการพุชข้อมูลลับไปยัง Github
echo .env >> .gitignore
หลังจากนั้น คุณสามารถทดสอบอินสแตนซ์ในเครื่องได้ โดยทำดังนี้
docker run -it -p 8080:8080 --env-file .env my-php-app-docker
ตอนนี้คุณก็บรรลุเป้าหมายต่อไปนี้แล้ว
- แอปจะอ่านตัวแปรแบบไดนามิกจาก ENV
- คุณเพิ่มความปลอดภัยแล้วเนื่องจากนำรหัสผ่าน DB ออกจากโค้ดแล้ว)
ตอนนี้คุณทำให้การแก้ไขใหม่ใช้งานได้ใน Cloud Run ได้แล้ว มาลองใช้ UI และตั้งค่าตัวแปรสภาพแวดล้อมด้วยตนเองกัน
- ไปที่ https://console.cloud.google.com/run
- คลิกที่แอป
- คลิก "แก้ไขและทำให้การแก้ไขใหม่ใช้งานได้"
- ในแท็บแรก "คอนเทนเนอร์" ให้คลิกแท็บด้านล่าง "ตัวแปรและข้อมูลลับ"
- คลิก "+ เพิ่มตัวแปร" แล้วเพิ่มตัวแปรที่จําเป็นทั้งหมด ผลลัพธ์ที่ได้ควรมีลักษณะดังนี้
แบบนี้ถูกต้องไหม ไม่ได้ ผู้ให้บริการส่วนใหญ่จะยังคงเห็นบัตรของคุณ ปัญหานี้อาจลดลงเมื่อมีการใช้ Secret Manager ของ Google Cloud
รุ่นที่ 2: ตัวจัดการข้อมูลลับ
รหัสผ่านหายไปจากรหัสของคุณเอง แสดงว่าคุณชนะแล้ว แต่เดี๋ยวก่อน ปัญหาได้รับการแก้ไขแล้วใช่ไหม
รหัสผ่านของคุณจะยังคงแสดงแก่ทุกคนที่มีสิทธิ์เข้าถึงคอนโซล Google Cloud คุณสามารถเรียกข้อมูลได้หากเข้าถึงไฟล์การนําส่ง YAML ของ Cloud Run หรือหากคุณพยายามแก้ไขหรือทำให้เวอร์ชัน Cloud Run ใหม่ใช้งานได้ รหัสผ่านจะปรากฏในส่วนตัวแปรและข้อมูลลับตามที่แสดงในภาพหน้าจอด้านล่าง
เครื่องมือจัดการข้อมูลลับของ Google Cloud เป็นบริการที่ปลอดภัยและรวมศูนย์สำหรับจัดการข้อมูลที่ละเอียดอ่อน เช่น คีย์ API, รหัสผ่าน, ใบรับรอง และข้อมูลลับอื่นๆ
ซึ่งช่วยให้คุณจัดเก็บ จัดการ และเข้าถึงข้อมูลลับได้ด้วยสิทธิ์แบบละเอียดและการเข้ารหัสที่มีประสิทธิภาพ ผู้จัดการข้อมูลลับผสานรวมกับ Identity and Access Management (IAM) ของ Google Cloud ซึ่งช่วยให้คุณควบคุมผู้ที่มีสิทธิ์เข้าถึงข้อมูลลับที่เฉพาะเจาะจงได้ เพื่อรักษาความปลอดภัยของข้อมูลและการปฏิบัติตามข้อกำหนด
นอกจากนี้ยังรองรับการเปลี่ยนความลับและการจัดเวอร์ชันอัตโนมัติ ซึ่งทำให้การจัดการวงจรของข้อมูลลับง่ายขึ้นและช่วยเพิ่มความปลอดภัยในแอปพลิเคชันต่างๆ ในบริการของ Google Cloud
หากต้องการเข้าถึงเครื่องมือจัดการข้อมูลลับ ให้ไปที่เมนูแฮมเบอร์เกอร์เพื่อไปยังบริการความปลอดภัย แล้วค้นหาในส่วนการคุ้มครองข้อมูลตามที่แสดงในภาพหน้าจอด้านล่าง
เปิดใช้ Secret Manager API เมื่อคุณอยู่ที่ส่วนดังกล่าวตามรูปภาพต่อไปนี้
- ตอนนี้คลิก "สร้างข้อมูลลับ":
- ชื่อ:
php-amarcord-db-pass
- ค่าลับ: "รหัสผ่าน DB" (ไม่ต้องสนใจส่วน "อัปโหลดไฟล์")
- กำกับเนื้อหาลิงก์ลับนี้ ควรมีลักษณะดังนี้
projects/123456789012/secrets/php-amarcord-db-pass
นี่คือเคอร์เซอร์ที่ไม่ซ้ำกันซึ่งไปยังข้อมูลลับ (สําหรับ Terraform, Cloud Run และอื่นๆ) หมายเลขดังกล่าวคือหมายเลขโปรเจ็กต์ที่ไม่ซ้ำกัน
เคล็ดลับ: พยายามใช้รูปแบบการตั้งชื่อที่สอดคล้องกันสำหรับข้อมูลลับ โดยจัดเรียงจากซ้ายไปขวา เช่น cloud-devrel-phpamarcord-dbpass
- องค์กร (มีบริษัท)
- ทีม (ภายในองค์กร)
- แอปพลิเคชัน (ภายในทีม)
- ชื่อตัวแปร (ภายในแอป)
ซึ่งจะช่วยให้คุณมีนิพจน์ทั่วไปที่ค้นหาข้อมูลลับทั้งหมดสำหรับแอปเดียวได้อย่างง่ายดาย
สร้างการแก้ไข Cloud Run ใหม่
เมื่อสร้างข้อมูลลับใหม่แล้ว เราจะต้องนำตัวแปร ENV ของ DB_PASS ออกและแทนที่ด้วยข้อมูลลับใหม่ ดังนั้น
- การเข้าถึง Cloud Run โดยใช้คอนโซล Google Cloud
- เลือกแอป
- คลิก "แก้ไขและทำให้การแก้ไขใหม่ใช้งานได้"
- ค้นหาแท็บ "ตัวแปรและข้อมูลลับ"
- ใช้ปุ่ม "+ อ้างอิงข้อมูลลับ" เพื่อรีเซ็ตตัวแปร ENV ของ DB_PASS
- ใช้ "DB_PASS" เดียวกันสำหรับข้อมูลลับที่อ้างอิงและใช้เวอร์ชันล่าสุด
เมื่อดำเนินการเสร็จแล้ว คุณควรได้รับข้อผิดพลาดต่อไปนี้
ลองหาวิธีแก้ไข ในการแก้ปัญหานี้ คุณต้องไปที่ส่วน IAM และผู้ดูแลระบบ แล้วเปลี่ยนสิทธิ์การให้ ขอให้สนุกกับการแก้ไขข้อบกพร่อง
เมื่อแก้ปัญหาแล้ว ให้กลับไปที่ Cloud Run และทำให้เวอร์ชันใหม่ใช้งานได้อีกครั้ง ผลลัพธ์ควรมีลักษณะดังรูปต่อไปนี้
เคล็ดลับ: คอนโซลของนักพัฒนาแอป (UI) ชี้ให้เห็นปัญหาเกี่ยวกับสิทธิ์ได้ดีมาก โปรดสละเวลาเพื่อไปยังลิงก์ทั้งหมดสำหรับเอนทิตีในระบบคลาวด์
7. โมดูลที่ 5: ตั้งค่า CI/CD ด้วย Cloud Build
เหตุผลที่ควรใช้ไปป์ไลน์ CI/CD
ตอนนี้คุณควรพิมพ์ gcloud run deploy
ไปแล้ว 2-3 ครั้ง ซึ่งอาจเป็นการตอบคำถามเดิมซ้ำๆ
หากเบื่อหน่ายกับการติดตั้งใช้งานแอปด้วยตนเองด้วย gcloud run deploy คงจะดีไม่น้อยหากแอปของคุณสามารถทําให้การเผยแพร่เป็นไปโดยอัตโนมัติทุกครั้งที่คุณพุชการเปลี่ยนแปลงใหม่ไปยังที่เก็บ Git
หากต้องการใช้ไปป์ไลน์ CI/CD คุณจะต้องมี 2 อย่างต่อไปนี้
- ที่เก็บ Git ส่วนตัว: คุณควรแยกที่เก็บเวิร์กช็อปไปยังบัญชี GitHub ของคุณแล้วในขั้นตอนที่ 2 หากไม่ ให้กลับไปทำขั้นตอนนั้นให้เสร็จสมบูรณ์ ที่เก็บที่แยกควรมีลักษณะดังนี้
https://github.com/<YOUR_GITHUB_USER>/app-mod-workshop
- Cloud Build บริการที่ยอดเยี่ยมและราคาถูกนี้ช่วยให้คุณกำหนดค่าการทำงานอัตโนมัติของบิลด์ได้เกือบทุกอย่าง เช่น Terraform, แอปที่ทำงานใน Docker ฯลฯ
ส่วนนี้จะเน้นที่การตั้งค่า Cloud Build
เข้าสู่ Cloud Build
เราจะใช้ Cloud Build เพื่อทำดังนี้
- บิลด์แหล่งที่มา (ด้วย Dockerfile) โปรดคิดว่าไฟล์นี้เป็น "ไฟล์ .zip ขนาดใหญ่" ที่มีทุกอย่างที่จำเป็นต่อการสร้างและเรียกใช้ ("อาร์ติแฟกต์การสร้าง")
- พุชอาร์ติแฟกต์นี้ไปยัง Artifact Registry (AR)
- จากนั้นทําการทําให้ใช้งานได้จาก AR ไปยัง Cloud Run สําหรับแอป "php-amarcord"
- ซึ่งจะสร้างเวอร์ชัน ("การแก้ไข") ใหม่ของแอปที่มีอยู่ (ให้นึกถึงเลเยอร์ที่มีโค้ดใหม่) และเราจะกําหนดค่าแอปเพื่อเปลี่ยนเส้นทางการเข้าชมไปยังเวอร์ชันใหม่หากการพุชสําเร็จ
ตัวอย่างบิลด์บางส่วนสำหรับแอป php-amarcord
ของฉันมีดังนี้
เราจะทำสิ่งเหล่านี้ได้อย่างไร
- การสร้างไฟล์ YAML ที่สมบูรณ์แบบไฟล์เดียว
cloudbuild.yaml
- การสร้างทริกเกอร์ Cloud Build
- โดยเชื่อมต่อกับที่เก็บ GitHub ของเราผ่าน UI ของ Cloud Build
สร้างทริกเกอร์ (และเชื่อมต่อที่เก็บ)
- ไปที่ https://console.cloud.google.com/cloud-build/triggers
- คลิก "สร้างทริกเกอร์"
- คอมไพล์
- ชื่อ: ตั้งชื่อที่สื่อความหมาย เช่น
on-git-commit-build-php-app
- เหตุการณ์: พุชไปยัง Branch
- แหล่งที่มา: "เชื่อมต่อที่เก็บใหม่"
- ซึ่งจะเป็นการเปิดหน้าต่าง "เชื่อมต่อที่เก็บ" ทางด้านขวา
- ผู้ให้บริการแหล่งที่มา: "GitHub" (รายการแรก)
- "ดำเนินการต่อ"
- การตรวจสอบสิทธิ์จะเปิดหน้าต่างใน GitHub เพื่อตรวจสอบสิทธิ์ข้าม โปรดทำตามขั้นตอนและอดทนรอ หากมีรีพอสิทหลายรายการ การดำเนินการนี้อาจใช้เวลาสักครู่
- "เลือกที่เก็บ" เลือกบัญชี/ที่เก็บ และเลือกส่วน "ฉันเข้าใจ..."
- หากได้รับข้อผิดพลาด: แอป GitHub ยังไม่ได้ติดตั้งอยู่บนที่เก็บของคุณ ให้คลิก "ติดตั้ง Google Cloud Build" แล้วทําตามวิธีการ
คลิกเชื่อมต่อ
- บิงโก เชื่อมต่อที่เก็บแล้ว
- กลับไปที่ส่วนทริกเกอร์
- การกำหนดค่า: ตรวจพบโดยอัตโนมัติ (*)
- ขั้นสูง: เลือกบัญชีบริการ "[PROJECT_NUMBER]- compute@developer.gserviceaccount.com"
- xxxxx คือรหัสโปรเจ็กต์
- บัญชีบริการ Compute เริ่มต้นเหมาะสำหรับแนวทางแบบห้องทดลอง แต่อย่านำไปใช้ในระบบจริง ( ดูข้อมูลเพิ่มเติม)
- ปล่อยทุกอย่างไว้ตามเดิม
- คลิกปุ่ม "สร้าง"
(*) วิธีนี้เป็นวิธีที่ง่ายที่สุดเนื่องจากจะตรวจสอบหา Dockerfile หรือ cloudbuild.yaml อย่างไรก็ตาม cloudbuild.yaml
ช่วยให้คุณตัดสินใจได้อย่างแท้จริงว่าจะทำสิ่งใดในขั้นตอนใด
ฉันมีสิทธิ์เข้าถึงแล้ว
ตอนนี้ทริกเกอร์จะไม่ทำงานเว้นแต่คุณจะให้สิทธิ์บัญชีบริการ Cloud Build (บัญชีบริการคืออะไร อีเมลของ "หุ่นยนต์" ที่ดําเนินการในนามของคุณสําหรับงานหนึ่งๆ ซึ่งในกรณีนี้คือการสร้างสิ่งต่างๆ ในระบบคลาวด์
SA จะสร้างและทำให้ใช้งานได้ไม่สำเร็จ เว้นแต่คุณจะให้สิทธิ์ SA ดำเนินการ แต่โชคดีที่การแก้ไขนั้นง่ายมาก
- ไปที่ "Cloud Build" > "การตั้งค่า"
- บัญชีบริการ "[PROJECT_NUMBER]- compute@developer.gserviceaccount.com"
- เลือกช่องต่อไปนี้
- Cloud Run
- Secret Manager
- บัญชีบริการ
- Cloud Build
- เลือก "ตั้งค่าเป็นบัญชีบริการที่ต้องการ" ด้วย
ไฟล์ YAML ของ Cloud Build อยู่ที่ไหน
เราขอแนะนําอย่างยิ่งให้คุณสละเวลาสร้าง YAML การสร้างในระบบคลาวด์ของคุณเอง
อย่างไรก็ตาม หากไม่มีเวลาหรือไม่อยากหาเวลา คุณก็ดูแรงบันดาลใจในโฟลเดอร์โซลูชันนี้ .solutions
ตอนนี้คุณสามารถพุชการเปลี่ยนแปลงไปยัง GitHub และตรวจสอบ Cloud Build ในส่วนนั้นได้แล้ว
การตั้งค่า Cloud Build อาจเป็นเรื่องยาก โปรดรอการติดต่อกลับภายใน
- ตรวจสอบบันทึกใน https://console.cloud.google.com/cloud-build/builds;region=global
- การค้นหาข้อผิดพลาด
- แก้ไขโค้ดและออก git commit / git push อีกครั้ง
- บางครั้งข้อผิดพลาดไม่ได้อยู่ในโค้ด แต่อยู่ในการกำหนดค่าบางอย่าง ในกรณีนี้ คุณสามารถออกบิลด์ใหม่จาก UI (บิลด์ในระบบคลาวด์ > "ทริกเกอร์" > เรียกใช้)
โปรดทราบว่าหากใช้โซลูชันนี้ คุณยังคงต้องดําเนินการบางอย่าง เช่น คุณต้องตั้งค่าตัวแปร ENV สําหรับปลายทาง dev/prod ที่สร้างขึ้นใหม่ ดังนี้
โดยสามารถทำได้สองวิธี:
- ผ่าน UI - โดยการตั้งค่าตัวแปร ENV อีกครั้ง
- ผ่าน CLI โดยใช้สคริปต์ที่ "สมบูรณ์แบบ" สำหรับคุณ ดูตัวอย่างได้ที่ gcloud-run-deploy.sh คุณต้องปรับแต่งบางอย่าง เช่น ปลายทางและหมายเลขโปรเจ็กต์ ซึ่งดูหมายเลขโปรเจ็กต์ได้ในภาพรวมระบบคลาวด์
ฉันจะคอมมิตโค้ดไปยัง GitHub ได้อย่างไร
การสอนวิธีที่ดีที่สุดในการgit push
ไปยัง GitHub อยู่นอกเหนือขอบเขตของเวิร์กช็อปนี้ อย่างไรก็ตาม ในกรณีที่คุณติดขัดและอยู่ใน Cloud Shell คุณมี 2 วิธีในการดำเนินการดังนี้
- CLI เพิ่มคีย์ SSH ในเครื่องและเพิ่มรีโมตด้วย git@github.com:YOUR_USER/app-mod-workshop.git (แทนที่จะเป็น http)
- VSCode หากใช้เครื่องมือแก้ไข Cloud Shell คุณสามารถใช้แท็บการควบคุมแหล่งที่มา (ctrl-shift-G) คลิก "ซิงค์การเปลี่ยนแปลง" แล้วทําตามวิธีการ คุณควรตรวจสอบสิทธิ์บัญชี GitHub กับ vscode ได้ และดึง/พุชจากตรงนั้นได้อย่างง่ายดาย
อย่าลืมgit add clodubuild.yaml
ไฟล์นี้ไว้กับไฟล์อื่นๆ ไม่เช่นนั้นระบบจะไม่ทำงาน
"ความเท่าเทียมของเวอร์ชันพัฒนา/เวอร์ชันที่ใช้งานจริง" แบบเจาะลึกกับแบบไม่เจาะลึก [ไม่บังคับ]
หากคุณคัดลอกเวอร์ชันโมเดลจากที่นี่ คุณจะมีเวอร์ชัน DEV และ PROD ที่เหมือนกัน 2 เวอร์ชัน วิธีนี้เจ๋งมากและสอดคล้องกับกฎข้อ 10 ของแอป 12 ข้อ
อย่างไรก็ตาม เราใช้ปลายทางเว็บ 2 รายการที่แตกต่างกันเพื่อให้แอปชี้ไปยังฐานข้อมูลเดียวกัน การดำเนินการนี้เหมาะสำหรับเวิร์กช็อป แต่ในชีวิตจริง คุณควรใช้เวลาสร้างสภาพแวดล้อมเวอร์ชันที่ใช้งานจริงที่เหมาะสม ซึ่งหมายความว่าคุณจะมีฐานข้อมูล 2 ฐาน (1 ฐานสําหรับนักพัฒนาซอฟต์แวร์และ 1 ฐานสําหรับเวอร์ชันที่ใช้งานจริง) และเลือกตําแหน่งที่จะจัดเก็บฐานข้อมูลสําหรับการกู้คืนภัยพิบัติ / ความพร้อมใช้งานสูงด้วย เรื่องนี้อยู่นอกเหนือขอบเขตของเวิร์กช็อปนี้ แต่ให้ลองพิจารณาดู
หากมีเวลาทำเวอร์ชัน "ขั้นสูง" ของเวอร์ชันที่ใช้งานจริง โปรดคำนึงถึงทรัพยากรทั้งหมดที่ต้องทำซ้ำ เช่น
- ฐานข้อมูล Cloud SQL (และอาจเป็นอินสแตนซ์ SQL)
- ที่เก็บข้อมูล GCS
- Cloud Function
- คุณอาจใช้ Gemini 1.5 Flash เป็นโมเดลในการพัฒนา (ราคาถูกกว่าและเร็วกว่า) และ Gemini 1.5 Pro (มีประสิทธิภาพมากกว่า)
โดยทั่วไปแล้ว ทุกครั้งที่คุณทําสิ่งใดกับแอป ให้คิดอย่างถี่ถ้วนว่าเวอร์ชันที่ใช้งานจริงควรมีค่าเดียวกันนี้หรือไม่ หากไม่ ให้ทำซ้ำ ซึ่งแน่นอนว่าการดำเนินการนี้ทำได้ง่ายขึ้นมากด้วย Terraform เนื่องจากคุณสามารถแทรกสภาพแวดล้อม (-dev, -prod) เป็นส่วนต่อท้ายของทรัพยากรได้
8. โมดูล 6: ย้ายข้อมูลไปยัง Google Cloud Storage
พื้นที่เก็บข้อมูล
ปัจจุบันแอปจัดเก็บสถานะไว้ในคอนเทนเนอร์ Docker หากเครื่องเสีย แอประเบิด หรือคุณเพียงแค่พุชการแก้ไขใหม่ ระบบจะกำหนดเวลาการแก้ไขใหม่โดยใช้พื้นที่เก็บข้อมูลใหม่ซึ่งว่างเปล่า ดังนี้ 🙈
วิธีแก้ไขปัญหานี้มีหลายวิธี
- จัดเก็บรูปภาพในฐานข้อมูล เราใช้วิธีนี้กับแอป PHP ก่อนหน้านี้ ซึ่งเป็นวิธีแก้ปัญหาที่ง่ายที่สุดเนื่องจากไม่เพิ่มความซับซ้อน แต่วิธีนี้จะทำให้เวลาในการตอบสนองและภาระงานของ DB เพิ่มขึ้นอย่างแน่นอน
- ย้ายข้อมูลแอป Cloud Run ไปยังโซลูชันที่ประหยัดพื้นที่เก็บข้อมูล: GCE + ดิสก์ถาวร อาจเป็น GKE + Storage ใช่ไหม หมายเหตุ: การควบคุมที่มากขึ้นจะทําให้เกิดความยืดหยุ่นน้อยลง
- ย้ายไปที่ GCS Google Cloud Storage มีพื้นที่เก็บข้อมูลที่ดีที่สุดสำหรับทั้ง Google Cloud และเป็นโซลูชันที่เหมาะกับระบบคลาวด์มากที่สุด แต่วิธีนี้ทำให้เราต้องยุ่งเกี่ยวกับไลบรารี PHP เรามีไลบรารี PHP 5.7 สำหรับ GCS ไหม
PHP 5.7
รองรับComposer
ไหม (ดูเหมือนว่า PHP 5.3.2 เป็นเวอร์ชันต่ำสุดที่ Composer รองรับ) - อาจจะใช้ docker sidecar ไหม
- หรืออาจใช้ การต่อเชื่อม Cloud Run Volume ของ GCS ฟังดูดีมาก
🤔 ย้ายข้อมูลพื้นที่เก็บข้อมูล (ปลายเปิด)
[แบบปลายเปิด] ในแบบฝึกหัดนี้ เราต้องการให้คุณหาวิธีย้ายรูปภาพในลักษณะที่คงอยู่
การทดสอบการยอมรับ
เราไม่ได้ต้องการบอกวิธีแก้ปัญหาให้คุณทราบ แต่เราต้องการให้คุณดำเนินการดังนี้
- คุณอัปโหลด
newpic.jpg
คุณจะเห็นข้อมูลนี้ในแอป - คุณอัปเกรดแอปเป็นเวอร์ชันใหม่
newpic.jpg
ยังคงแสดงอยู่
💡 แนวทางแก้ปัญหาที่เป็นไปได้ (การต่อเชื่อมวอลุ่ม Cloud Run ของ GCS)
นี่เป็นโซลูชันที่ยอดเยี่ยมมากซึ่งช่วยให้เราอัปโหลดไฟล์ที่มีสถานะได้โดยไม่ต้องแตะโค้ดเลย (นอกเหนือจากการแสดงคำอธิบายรูปภาพ แต่นั่นเป็นเรื่องเล็กน้อยและเพื่อความสวยงามเท่านั้น)
ซึ่งจะช่วยให้คุณมาสก์โฟลเดอร์จาก Cloud Run ไปยัง GCS ได้ ดังนี้
- การอัปโหลดทั้งหมดไปยัง GCS จะปรากฏในแอปของคุณ
- การอัปโหลดทั้งหมดไปยังแอปของคุณจะอัปโหลดไปยัง GCS
- ความมหัศจรรย์จะเกิดขึ้นกับออบเจ็กต์ที่อัปโหลดใน GCS (บทที่ 7)
หมายเหตุ โปรดอ่านข้อกำหนดในการให้บริการของ FUSE การดำเนินการนี้ไม่เหมาะสมหากมีปัญหาด้านประสิทธิภาพ
สร้างที่เก็บข้อมูล GCS
GCS คือบริการพื้นที่เก็บข้อมูลที่มีให้บริการในทุกที่ของ Google Cloud บริการนี้ผ่านการทดสอบการใช้งานจริง และบริการ GCP ทุกประเภทที่ต้องการพื้นที่เก็บข้อมูลก็ใช้บริการนี้
โปรดทราบว่า Cloud Shell จะส่งออก PROJECT_ID เป็น GOOGLE_CLOUD_PROJECT
$ export PROJECT_ID=$GOOGLE_CLOUD_PROJECT
#!/bin/bash
set -euo pipefail
# Your Cloud Run Service Name, eg php-amarcord-dev
SERVICE_NAME='php-amarcord-dev'
BUCKET="${PROJECT_ID}-public-images"
GS_BUCKET="gs://${BUCKET}"
# Create bucket
gsutil mb -l "$GCP_REGION" -p "$PROJECT_ID" "$GS_BUCKET/"
# Copy original pictures there - better if you add an image of YOURS before.
gsutil cp ./uploads/*.png "$GS_BUCKET/"
กําหนดค่า Cloud Run ให้ต่อเชื่อมที่เก็บข้อมูลในโฟลเดอร์ /uploads/
ทีนี้มาพูดถึงส่วนที่น่าสนใจกัน เราสร้างวอลุ่ม php_uploads
และสั่งให้ Cloud Run ทำการต่อเชื่อม FUSE ใน MOUNT_PATH
(เช่น /var/www/html/uploads/
)
#!/bin/bash
set -euo pipefail
# .. keep variables from previous script..
# Uploads folder within your docker container.
# Tweak it for your app code.
MOUNT_PATH='/var/www/html/uploads/'
# Inject a volume mount to your GCS bucket in the right folder.
gcloud --project "$PROJECT_ID" beta run services update "$SERVICE_NAME" \
--region $GCP_REGION \
--execution-environment gen2 \
--add-volume=name=php_uploads,type=cloud-storage,bucket="$BUCKET" \
--add-volume-mount=volume=php_uploads,mount-path="$MOUNT_PATH"
จากนั้นทำขั้นตอนนี้ซ้ำสำหรับปลายทางทั้งหมดที่ต้องการชี้ไปยัง Cloud Storage
คุณยังดำเนินการเดียวกันนี้จาก UI ได้ด้วย
- ในแท็บ "วอลุ่ม" ให้สร้างการต่อเชื่อมวอลุ่มที่ชี้ไปยังที่เก็บข้อมูลประเภท "ที่เก็บข้อมูล Cloud Storage" เช่น ใช้ชื่อ "php_uploads"
- ในส่วนคอนเทนเนอร์ > การต่อเชื่อมวอลุ่ม ให้ต่อเชื่อมวอลุ่มที่คุณเพิ่งสร้างขึ้นในจุดวอลุ่มที่แอปขอ โดยการดำเนินการนี้ขึ้นอยู่กับไฟล์ Dockerfile แต่อาจมีลักษณะดังนี้
var/www/html/uploads/
ไม่ว่าจะด้วยวิธีใด หากการแก้ไขใช้งานได้ การแก้ไขการแก้ไข Cloud Run ใหม่ควรแสดงข้อมูลต่อไปนี้
ตอนนี้ให้ทดสอบแอปพลิเคชันใหม่โดยอัปโหลดรูปภาพใหม่ 1 รูปไปยังปลายทาง /upload.php
รูปภาพควรทำงานได้อย่างราบรื่นใน GCS โดยไม่ต้องเขียน PHP แม้แต่บรรทัดเดียว
เกิดอะไรขึ้น
เกิดสิ่งมหัศจรรย์ขึ้น
แอปพลิเคชันเก่าที่มีโค้ดเก่ายังคงทํางานอยู่ สแต็กใหม่ที่ทันสมัยช่วยให้เรามีรูปภาพทั้งหมดในแอปของเราอยู่ในที่เก็บข้อมูล Cloud แบบมีสถานะได้อย่างสบาย ตอนนี้คุณก็สร้างวิดีโอได้แบบไร้ขีดจำกัด
- หากต้องการส่งอีเมลทุกครั้งที่มีรูปภาพ "อันตราย" หรือ "ภาพเปลือย" เข้ามา ซึ่งคุณทําได้โดยไม่ต้องแตะโค้ด PHP
- หากต้องการใช้โมเดลมัลติโมดัลของ Gemini ทุกครั้งที่มีรูปภาพเข้ามาเพื่ออธิบายรูปภาพนั้น และอัปโหลด DB พร้อมคำอธิบาย ซึ่งคุณทําได้โดยไม่ต้องแตะโค้ด PHP คุณไม่เชื่อฉันใช่ไหม อ่านต่อในบทที่ 7
เราเพิ่งเปิดโอกาสใหม่ๆ มากมาย
9. โมดูลที่ 7: เพิ่มประสิทธิภาพแอปด้วย Google Gemini
ตอนนี้คุณมีแอป PHP ใหม่สุดเจ๋ง (เหมือน Fiat 126
ปี 2024) ที่ทันสมัยและมีพื้นที่เก็บข้อมูลระบบคลาวด์
คุณใช้ชื่อช่องทำอะไรได้บ้าง
ข้อกำหนดเบื้องต้น
ในบทก่อนหน้า โซลูชันโมเดลช่วยให้เราต่อเชื่อมรูปภาพ /uploads/
ใน GCS ได้ ซึ่งโดยพฤตินัยแล้วเป็นการแยกตรรกะของแอปออกจากพื้นที่เก็บข้อมูลรูปภาพ
การออกกำลังกายนี้กำหนดให้คุณต้องดำเนินการต่อไปนี้
- ทําแบบฝึกหัดในบทที่ 6 (พื้นที่เก็บข้อมูล) จนเสร็จสมบูรณ์
- มีที่เก็บข้อมูล GCS ที่มีรูปภาพการอัปโหลด ซึ่งผู้ใช้จะอัปโหลดรูปภาพในแอปของคุณและรูปภาพจะส่งไปยังที่เก็บข้อมูล
ตั้งค่าฟังก์ชันระบบคลาวด์ (ใน Python)
เคยสงสัยไหมว่าจะติดตั้งใช้งานแอปพลิเคชันแบบขับเคลื่อนด้วยเหตุการณ์ได้อย่างไร ประมาณนี้
- เมื่อ <event> เกิดขึ้น => ส่งอีเมล
- เมื่อ <event> เกิดขึ้น => หาก <condition> เป็นจริง ให้อัปเดตฐานข้อมูล
เหตุการณ์อาจเป็นอะไรก็ได้ ตั้งแต่ระเบียนใหม่ที่มีอยู่ใน BigQuery, ออบเจ็กต์ใหม่ที่เปลี่ยนแปลงในโฟลเดอร์ใน GCS หรือข้อความใหม่ที่รออยู่ในคิวใน Pub/Sub
Google Cloud รองรับแพลตฟอร์มหลายรูปแบบเพื่อให้บรรลุเป้าหมายนี้ โดยการเปลี่ยนแปลงที่สำคัญที่สุดมีดังนี้
- EventArc ดูวิธีรับเหตุการณ์ GCS เหมาะสําหรับการสร้าง DAG และประสานงานการดำเนินการตามเงื่อนไข if-then-else ในระบบคลาวด์
- Cloud Scheduler เหมาะสําหรับงาน cron ในเวลาเที่ยงคืนในระบบคลาวด์ เป็นต้น
- เวิร์กโฟลว์ระบบคลาวด์ คล้ายกับเหตุการณ์สำคัญ ซึ่งช่วยให้คุณทำสิ่งต่อไปนี้ได้
- Cloud Run Functions (หรือที่รู้จักกันในชื่อ
lambdas
) - Cloud Composer โดยทั่วไปแล้วคือ Apache Airflow เวอร์ชัน Google ซึ่งเหมาะสำหรับ DAG ด้วย
ในการฝึกนี้ เราจะเจาะลึก Cloud Function เพื่อให้ได้ผลลัพธ์ที่น่าทึ่ง และเราจะให้แบบฝึกหัดให้คุณแบบไม่บังคับ
โปรดทราบว่าโค้ดตัวอย่างมีอยู่ใน .solutions/
ตั้งค่า Cloud Function (🐍 python)
เราพยายามสร้าง GCF ที่มุ่งมั่นมาก
- เมื่อสร้างรูปภาพใหม่ใน GCS (อาจเป็นเพราะมีคนอัปโหลดลงในแอป แต่ไม่ใช่แค่นั้น)
- .. call Gemini to describe it and get a textual description of the image .. (would be nice to check the MIME and ensure its an image and not a PDF, MP3, or Text)
- .. และอัปเดต DB ด้วยคําอธิบายนี้ (ซึ่งอาจต้องมีการแก้ไขข้อบกพร่องของฐานข้อมูลเพื่อเพิ่มคอลัมน์
description
ลงในตารางimages
)
แพตช์ DB เพื่อเพิ่ม description
ลงในรูปภาพ
- เปิด Cloud SQL Studio โดยทำดังนี้
- ป้อนชื่อผู้ใช้และรหัสผ่านสําหรับฐานข้อมูลรูปภาพ
- แทรก SQL นี้ซึ่งจะเพิ่มคอลัมน์สําหรับคําอธิบายรูปภาพ
ALTER TABLE images ADD COLUMN description TEXT;
และ bingo ลองตรวจสอบว่าได้ผลหรือไม่
SELECT * FROM images;
คุณควรเห็นคอลัมน์คำอธิบายใหม่ดังนี้
เขียน f(x) ของ Gemini
หมายเหตุ ฟังก์ชันนี้สร้างขึ้นด้วยความช่วยเหลือจากฟีเจอร์ช่วยเขียนโค้ดของ Gemini
หมายเหตุ การสร้างฟังก์ชันนี้อาจทำให้เกิดข้อผิดพลาดเกี่ยวกับสิทธิ์ IAM บางส่วนจะแสดงอยู่ในย่อหน้า "ข้อผิดพลาดที่เป็นไปได้" ด้านล่าง
- เปิดใช้ API
- ไปที่ https://console.cloud.google.com/functions/list
- คลิก "สร้างฟังก์ชัน"
- เปิดใช้ API จากวิซาร์ด API
คุณสร้าง GCF จาก UI หรือจากบรรทัดคำสั่งก็ได้ เราจะใช้บรรทัดคำสั่ง
รหัสที่เป็นไปได้จะอยู่ในส่วน .solutions/
- สร้างโฟลเดอร์เพื่อโฮสต์โค้ด เช่น "gcf/" เข้าสู่โฟลเดอร์
- วิธีสร้างไฟล์
requirements.txt
google-cloud-storage
google-cloud-aiplatform
pymysql
- สร้างฟังก์ชัน Python โค้ดตัวอย่างที่นี่: gcf/main.py
#!/usr/bin/env python
"""Complete this"""
from google.cloud import storage
from google.cloud import aiplatform
import vertexai
from vertexai.generative_models import GenerativeModel, Part
import os
import pymysql
import pymysql.cursors
# Replace with your project ID
PROJECT_ID = "your-project-id"
GEMINI_MODEL = "gemini-1.5-pro-002"
DEFAULT_PROMPT = "Generate a caption for this image: "
def gemini_describe_image_from_gcs(gcs_url, image_prompt=DEFAULT_PROMPT):
pass
def update_db_with_description(image_filename, caption, db_user, db_pass, db_host, db_name):
pass
def generate_caption(event, context):
"""
Cloud Function triggered by a GCS event.
Args:
event (dict): The dictionary with data specific to this type of event.
context (google.cloud.functions.Context): The context parameter contains
event metadata such as event ID
and timestamp.
"""
pass
- พุชฟังก์ชัน คุณใช้สคริปต์ที่คล้ายกับ gcf/push-to-gcf.sh ได้
หมายเหตุ 1 ตรวจสอบว่าใช้ ENV ที่มีค่าที่ถูกต้อง หรือจะเพิ่มค่าที่ด้านบนก็ได้ (GS_BUCKET=blah
, ..)
หมายเหตุ 2 ซึ่งจะพุชโค้ดทั้งหมดในเครื่อง (.
) ดังนั้นโปรดตรวจสอบว่าได้ใส่โค้ดไว้ในโฟลเดอร์ที่เฉพาะเจาะจงและใช้ .gcloudignore
อย่างมือโปรเพื่อหลีกเลี่ยงการพุชไลบรารีขนาดใหญ่ ( example)
#!/bin/bash
set -euo pipefail
# add your logic here, for instance:
source .env || exit 2
echo "Pushing ☁️ f(x)☁ to 🪣 $GS_BUCKET, along with DB config.. (DB_PASS=$DB_PASS)"
gcloud --project "$PROJECT_ID" functions deploy php_amarcord_generate_caption \
--runtime python310 \
--region "$GCP_REGION" \
--trigger-event google.cloud.storage.object.v1.finalized \
--trigger-resource "$BUCKET" \
--set-env-vars "DB_HOST=$DB_HOST,DB_NAME=$DB_NAME,DB_PASS=$DB_PASS,DB_USER=$DB_USER" \
--source . \
--entry-point generate_caption \
--gen2
หมายเหตุ: ในตัวอย่างนี้ generate_caption
จะเป็นเมธอดที่เรียกใช้ และ Cloud Function จะส่งเหตุการณ์ GCS ไปยังเมธอดนั้นพร้อมข้อมูลที่เกี่ยวข้องทั้งหมด (ชื่อที่เก็บข้อมูล ชื่อออบเจ็กต์ ฯลฯ) โปรดใช้เวลาสักครู่เพื่อแก้ไขข้อบกพร่องของคําสั่ง Python ของเหตุการณ์นั้น
การทดสอบฟังก์ชัน
การทดสอบหน่วย
ฟังก์ชันมีองค์ประกอบหลายอย่าง คุณอาจต้องทดสอบรายการเดี่ยวทั้งหมด
ตัวอย่างอยู่ใน gcf/test.py
UI ของ Cloud Functions
นอกจากนี้ ให้ลองสำรวจฟังก์ชันใน UI ด้วย แท็บทุกแท็บควรค่าแก่การสำรวจ โดยเฉพาะแท็บ Source
(แท็บโปรดของเรา), Variables
, Trigger
และ Logs
คุณจะต้องใช้เวลาส่วนใหญ่ในแท็บ Logs
เพื่อแก้ปัญหาข้อผิดพลาด (ดูข้อผิดพลาดที่เป็นไปได้ที่ด้านล่างของหน้านี้ด้วย) และอย่าลืมตรวจสอบแท็บ Permissions
ด้วย
การทดสอบจากต้นทางถึงปลายทาง
ถึงเวลาทดสอบฟังก์ชันด้วยตนเอง
- ไปที่แอปและเข้าสู่ระบบ
- อัปโหลดรูปภาพ (อย่ามีขนาดใหญ่เกินไป เนื่องจากเราพบปัญหาเกี่ยวกับรูปภาพขนาดใหญ่)
- ตรวจสอบใน UI ว่ารูปภาพอัปโหลดแล้ว
- ตรวจสอบใน Cloud SQL Studio ว่าคำอธิบายได้รับการอัปเดตแล้ว เข้าสู่ระบบและเรียกใช้คําค้นหานี้
SELECT * FROM images
ซึ่งก็ใช้ได้ผล เราอาจต้องอัปเดตส่วนหน้าเว็บเพื่อแสดงคำอธิบายดังกล่าวด้วย
อัปเดต PHP ให้แสดง [ไม่บังคับ]
เราพิสูจน์แล้วว่าแอปใช้งานได้ อย่างไรก็ตาม ผู้ใช้ควรเห็นคำอธิบายดังกล่าวด้วย
เราไม่จำเป็นต้องเป็นผู้เชี่ยวชาญ PHP เพื่อเพิ่มคำอธิบายลงใน index.php
โค้ดนี้น่าจะใช้ได้ (ใช่ Gemini เขียนให้ฉันด้วย)
<?php if (!empty($image['description'])): ?>
<p class="font-bold">Gemini Caption:</p>
<p class="italic"><?php echo $image['description']; ?></p>
<?php endif; ?>
จัดตําแหน่งโค้ดนี้ภายใน foreach
ได้ตามต้องการ
ในขั้นตอนถัดไป เราจะเห็น UI เวอร์ชันที่สวยขึ้นด้วย ขอขอบคุณ Gemini Code Assist เวอร์ชันที่แสดงผลอาจมีลักษณะดังนี้
สรุป
คุณมี Cloud Function ที่ทริกเกอร์เมื่อออบเจ็กต์ใหม่เข้าสู่ GCS ซึ่งสามารถกำกับเนื้อหาของรูปภาพได้เหมือนที่มนุษย์ทำ และอัปเดต DB โดยอัตโนมัติ ว้าว
ขั้นตอนถัดไปคือ คุณอาจใช้เหตุผลเดียวกันนี้เพื่อให้ได้ฟังก์ชันการทำงานที่ยอดเยี่ยม 2 รายการ
[ไม่บังคับ] เพิ่ม Cloud Function เพิ่มเติม [ปลายเปิด]
ฟีเจอร์เพิ่มเติมที่นึกออกมีดังนี้
📩 ทริกเกอร์อีเมล
ทริกเกอร์อีเมลที่จะส่งอีเมลถึงคุณทุกครั้งที่มีคนส่งรูปภาพ
- บ่อยเกินไปไหม เพิ่มข้อจำกัดเพิ่มเติม: รูปภาพขนาดใหญ่ หรือรูปภาพที่มีเนื้อหา Gemini ซึ่งมีคำว่า "ภาพเปลือย/ภาพเปลือย/ความรุนแรง"
- โปรดตรวจสอบเรื่องนี้ใน
EventArc
🚫 ดูแลรูปภาพไม่เหมาะสมโดยอัตโนมัติ
ปัจจุบันผู้ดูแลระบบจะแจ้งว่ารูปภาพ "ไม่เหมาะสม" ให้คุณ Gemini ช่วยจัดการภาระหนักและดูแลพื้นที่ทำงานแทนไหม เพิ่มการทดสอบเพื่อแจ้งเนื้อหาทริกเกอร์ที่ไม่เหมาะสมและอัปเดตฐานข้อมูลตามที่เราได้เรียนรู้ในฟังก์ชันก่อนหน้า ซึ่งหมายความว่าโดยพื้นฐานแล้ว จะใช้ฟังก์ชันก่อนหน้า เปลี่ยนพรอมต์ และอัปเดตฐานข้อมูลตามคำตอบ
ข้อควรระวัง Generative AI จะให้ผลลัพธ์ที่คาดเดาไม่ได้ ตรวจสอบว่า "เอาต์พุตครีเอทีฟโฆษณา" จาก Gemini ทำงานได้อย่างถูกต้อง คุณอาจถามคำตอบแบบกำหนดได้ เช่น คะแนนความเชื่อมั่น 0 ถึง 1, JSON เป็นต้น ซึ่งทำได้หลายวิธี เช่น * ใช้ไลบรารี Python pydantic
, langchain
, .. * ใช้ Gemini Structured Output
เคล็ดลับ คุณอาจมีฟังก์ชันหลายรายการหรือพรอมต์เดียวที่บังคับใช้คำตอบ JSON (ทำงานได้ดีกับ "Structured Output ของ Gemini" ตามที่ไฮไลต์ไว้ด้านบน) เช่น
พรอมต์ในการสร้างข้อความนี้ควรเป็นอย่างไร
{
"description": "This is the picture of an arrosticino",
"suitable": TRUE
}
คุณสามารถเพิ่มช่องเพิ่มเติมในพรอมต์เพื่อรับข้อมูลเชิงลึก เช่น มีอะไรดีบ้างไหม รู้สึกแย่ไหม คุณรู้จักสถานที่นี้ไหม มีข้อความไหม (OCR ทำได้ง่ายกว่าที่เคย)
goods
: "It looks like yummie food"bads
: "ดูเหมือนอาหารที่ไม่แข็งแรง"OCR
: "Da consumare preferibilmente prima del 10 Novembre 2024"location
: "Pescara, Lungomare"
แม้ว่าโดยทั่วไปแล้วการมีฟังก์ชัน N สำหรับผลลัพธ์ N จะดีกว่า แต่การสร้างฟังก์ชันที่ทํางานได้ 10 อย่างก็ให้ผลลัพธ์ที่ยอดเยี่ยม ดูวิธีได้จากบทความนี้โดย Riccardo
ข้อผิดพลาดที่อาจเกิดขึ้น (ส่วนใหญ่เป็น IAM / สิทธิ์)
เมื่อพัฒนาโซลูชันนี้เป็นครั้งแรก เราพบปัญหาเกี่ยวกับสิทธิ์ IAM เราจะเพิ่มข้อผิดพลาดเหล่านี้ที่นี่เพื่อแสดงความเห็นอกเห็นใจและเพื่อแนะนำวิธีแก้ไข
ข้อผิดพลาด: มีสิทธิ์ไม่เพียงพอสําหรับบัญชีบริการ
- โปรดทราบว่าในการทำให้ฟังก์ชัน GCF ซึ่งคอยฟังที่เก็บข้อมูล GCS ใช้งานได้ คุณต้องตั้งค่าสิทธิ์ที่เหมาะสมให้กับบัญชีบริการที่คุณใช้สำหรับงานดังที่แสดงในภาพต่อไปนี้
คุณอาจต้องเปิดใช้ EventArc API ด้วย ซึ่งอาจใช้เวลา 2-3 นาทีจึงจะพร้อมใช้งานอย่างเต็มรูปแบบ
ข้อผิดพลาด: ไม่มีผู้เรียกใช้ Cloud Run
- ความคิดเห็นอีกรายการจาก UI สําหรับการให้สิทธิ์ GCF คือ ( บทบาทผู้เรียกใช้ Cloud Run)
ข้อผิดพลาดนี้แก้ไขได้ด้วยการเรียกใช้คําสั่งในรูปภาพ ซึ่งคล้ายกับ fix-permissions.sh
ปัญหานี้อธิบายไว้ที่นี่ https://cloud.google.com/functions/docs/securing/authenticating
ข้อผิดพลาด: เกินขีดจำกัดหน่วยความจำ
เมื่อเรียกใช้ครั้งแรก บันทึกของฉันจะแสดงข้อความว่า "ใช้หน่วยความจำเกินขีดจำกัด 244 MiB แล้ว โดยใช้ไป 270 MiB ลองเพิ่มขีดจำกัดหน่วยความจำ โดยดูที่ https://cloud.google.com/functions/docs/configuring/memory" เพิ่ม RAM ลงใน GCF อีกครั้ง ซึ่งทําได้ง่ายๆ ใน UI ปัญหาที่อาจเกิดขึ้นมีดังนี้
หรือจะแก้ไขสคริปต์การทำให้ใช้งานได้จริงของ Cloud Run เพื่อเพิ่ม MEM/CPU ก็ได้ การดำเนินการนี้จะใช้เวลานานกว่าเล็กน้อย
ข้อผิดพลาด: PubSub เผยแพร่แล้ว
การสร้างทริกเกอร์ด้วย GCF v1 ให้ข้อผิดพลาดนี้ 1 ครั้ง
อีกครั้ง ปัญหานี้แก้ไขได้ง่ายโดยไปที่ IAM แล้วให้บทบาท "ผู้เผยแพร่ Pub/Sub" แก่บัญชีบริการ
ข้อผิดพลาด: ไม่ได้ใช้ Vertex AI
หากได้รับข้อผิดพลาดนี้
ถูกปฏิเสธสิทธิ์: 403 ไม่เคยมีการใช้ Vertex AI API ในโปรเจ็กต์ YOUR_PROJECT มาก่อนหรือถูกปิดใช้ เปิดใช้โดยไปที่ https://console.developers.google.com/apis/api/aiplatform.googleapis.com/overview?project=YOR_PROJECT
คุณเพียงแค่ต้องเปิดใช้ Vertex AI API วิธีที่ง่ายที่สุดในการเปิดใช้ API ที่จําเป็นทั้งหมดมีดังนี้
- https://console.cloud.google.com/vertex-ai
- คลิก "เปิดใช้ API ที่แนะนําทั้งหมด"
ข้อผิดพลาด: ไม่พบทริกเกอร์ EventArc
หากได้รับข้อความนี้ โปรดทำให้ฟังก์ชันทํางานอีกครั้ง
ข้อผิดพลาด: กําลังจัดสรรตัวแทนบริการ 400 ราย
กําลังจัดสรรตัวแทนบริการ 400 ราย ( https://cloud.google.com/vertex-ai/docs/general/access-control#service-agents ) ต้องใช้ตัวแทนบริการในการอ่านไฟล์ Cloud Storage ที่ระบุ โปรดลองอีกครั้งในอีกสักครู่
หากเป็นเช่นนี้ โปรดรอสักครู่หรือสอบถามเจ้าหน้าที่ของ Google
10. โมดูล 8: สร้าง SLO ความพร้อมใช้งาน
ในบทนี้ เราพยายามบรรลุเป้าหมายต่อไปนี้
- การสร้าง SLI
- การสร้าง SLO ตาม SLI
- การสร้างการแจ้งเตือนตาม SLO
หัวข้อนี้เป็นหัวข้อที่นักเขียนชื่นชอบมาก เนื่องจาก Riccardo ทํางานด้าน SRE / DevOps ของ Google Cloud
(ไม่จำกัด) สร้าง SLI และ SLO สําหรับแอปนี้
แอปจะดีแค่ไหนหากคุณไม่รู้เลยว่าแอปหยุดทำงานเมื่อใด
SLO คืออะไร
บังเอิญจริงๆ Google เป็นผู้คิดค้น SLO หากต้องการอ่านข้อมูลเพิ่มเติม เราขอแนะนําให้อ่านบทความต่อไปนี้
- SRE Book - บทที่ 2 - การใช้ SLO ( 👉 SREbooks เพิ่มเติม)
- ศิลปะของ SLO ( วิดีโอเจ๋งมาก) การฝึกอบรมนี้ยอดเยี่ยมมากในการดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีสร้าง SLO ที่สมบูรณ์แบบสำหรับบริการของคุณ
- หลักสูตร SRE ใน Coursera ฉันมีส่วนร่วมในเรื่องนี้
ขั้นตอนที่ 1: สร้าง SLI/SLO ความพร้อมใช้งาน
มาเริ่มกันที่ SLO ความพร้อมใช้งาน เนื่องจากเป็นสิ่งที่สำคัญที่สุดและวัดได้ง่ายที่สุด
แต่โชคดีที่ Cloud Run มีการสนับสนุน SLO ที่สร้างขึ้นล่วงหน้าอยู่แล้ว เนื่องด้วย Istio
เมื่อแอปของคุณอยู่ใน Cloud Run การดำเนินการนี้ทำได้ง่ายมาก เราใช้เวลาเพียง 30 วินาที
- ไปที่หน้า Cloud Run
- คลิก/เลือกแอป
- เลือกแท็บ
SLOs
- คลิก "+ สร้าง SLO"
- ความพร้อมจำหน่ายสินค้าตามคำขอ
- ต่อไป
- เดือนตามปฏิทิน / 99%
- คลิก "สร้าง SLO"
ขั้นตอนที่ 2: ตั้งค่าการแจ้งเตือนเกี่ยวกับ SLO นี้
เราขอแนะนำให้สร้างการแจ้งเตือน 2 รายการ ดังนี้
- รายการที่มีอัตราการเผาไหม้ต่ำ ("การเผาไหม้ช้า") เพื่อแจ้งเตือนคุณทางอีเมล (จำลองคำขอแจ้งปัญหาที่มีลําดับความสําคัญต่ำ)
- รายการที่มีอัตราการใช้สูง ("Fastburn") เพื่อแจ้งเตือนคุณทาง SMS (จำลองคำขอแจ้งปัญหาที่มีลำดับความสำคัญสูง / เครื่องส่งข้อความ)
ไปที่ SLO tab
ของคุณจากก่อนหน้านี้
ทำดังนี้ 2 ครั้ง
- คลิก "สร้างการแจ้งเตือน SLO" (ปุ่ม 🔔 ที่มีเครื่องหมายบวกอยู่ด้านในทางด้านขวา)
- ระยะเวลามองย้อนกลับ เกณฑ์อัตราการเผาผลาญ
- [FAST] รายการแรก:
60
นาที /10
x - [ช้า] วินาที:
720
นาที /2
x - ช่องทางการแจ้งเตือน: คลิก "จัดการช่องทางการแจ้งเตือน"
- ก่อนอื่น "อีเมล" -> เพิ่มใหม่ -> ..
- วิธีที่ 2 "SMS" -> เพิ่มใหม่ -> ยืนยันในโทรศัพท์
- เคล็ดลับ: เราชอบใช้อีโมจิในชื่อ เหมาะสำหรับการสาธิต
- เมื่อเสร็จแล้ว ให้คลิก X ขนาดใหญ่ที่ด้านขวาบน
- เลือกโทรศัพท์ก่อน (เร็ว) แล้วเลือกอีเมลถัดไป (ช้า)
- เพิ่มตัวอย่างเอกสารประกอบ เช่น
[PHP Amarcord] Riccardo told me to type sudo reboot or to check documentation in http://example.com/playbooks/1.php but I guess he was joking
บิงโก
ผลลัพธ์สุดท้าย
เราจะถือว่าการฝึกนี้เสร็จสมบูรณ์เมื่อคุณมี SLO ที่ใช้งานได้ 1 รายการ + การแจ้งเตือนความพร้อม 2 ครั้ง และมีการแจ้งเตือนทางอีเมลและโทรศัพท์
หากต้องการ คุณก็เพิ่มเวลาในการตอบสนอง (และเราขอแนะนําอย่างยิ่งให้คุณทําเช่นนั้น) หรือแม้แต่รายการที่ซับซ้อนกว่านั้นได้ สําหรับเวลาในการตอบสนอง ให้เลือกค่าที่คุณคิดว่าเหมาะสม หากไม่แน่ใจ ให้เลือก 200ms
11. ขั้นตอนถัดไป
คุณทำทุกอย่างเสร็จแล้ว แต่ยังมีอะไรขาดหายไป
ข้อมูลบางส่วนที่ควรพิจารณา
เล่นกับ Gemini
คุณใช้ Gemini ได้ 2 แบบดังนี้
- Vertex AI "วิธีแบบองค์กร" ซึ่งเชื่อมโยงกับ GCP ของคุณ ซึ่งเราได้พูดถึงในบทที่ 7 (GCF+Gemini) การตรวจสอบสิทธิ์ทั้งหมดทำงานได้อย่างน่าอัศจรรย์ และบริการต่างๆ เชื่อมต่อกันได้อย่างลงตัว
- AI ของ Google "เส้นทางของผู้บริโภค" คุณรับคีย์ Gemini API ได้จากที่นี่ แล้วเริ่มสร้างสคริปต์เล็กๆ ที่เชื่อมโยงกับเวิร์กโหลดที่คุณมีอยู่แล้วได้ (งานที่เป็นกรรมสิทธิ์, คลาวด์อื่นๆ, localhost ฯลฯ) เพียงแทนที่คีย์ API แล้วโค้ดก็จะเริ่มทำงานอย่างน่าอัศจรรย์
เราขอแนะนำให้คุณลองสำรวจ (2) ด้วยโปรเจ็กต์ที่คุณสนใจ
UI Lifting
ฉันไม่เก่งเรื่อง UI แต่ Gemini ทำได้ คุณใช้หน้า PHP หน้าเดียวและพูดประมาณนี้ก็ได้
I have a VERY old PHP application. I want to touch it as little as possible. Can you help me:
1. add some nice CSS to it, a single static include for tailwind or similar, whatever you prefer
2. Transform the image print with description into cards, which fit 4 per line in the canvas?
Here's the code:
-----------------------------------
[Paste your PHP page, for instance index.php - mind the token limit!]
คุณทําสิ่งเหล่านี้ได้ง่ายๆ ในไม่ถึง 5 นาทีด้วย Cloud Build :)
คำตอบจาก Gemini สมบูรณ์แบบ (หมายความว่าฉันไม่ต้องเปลี่ยนแปลงอะไรเลย)
และนี่คือเลย์เอาต์ใหม่ในแอปส่วนตัวของผู้เขียน
หมายเหตุ: โค้ดจะวางเป็นรูปภาพเนื่องจากเราไม่อยากให้คุณใช้โค้ดนี้ แต่ให้ Gemini เขียนโค้ดให้คุณด้วยข้อจำกัด UI/ส่วนหน้าของครีเอทีฟโฆษณาของคุณเอง เชื่อเถอะว่าหลังจากนั้นคุณจะต้องเปลี่ยนแปลงเล็กน้อยมาก
ความปลอดภัย
การรักษาความปลอดภัยของแอปนี้อย่างเหมาะสมไม่ใช่เป้าหมายของเวิร์กช็อป 4 ชั่วโมงนี้ เนื่องจากจะทำให้ต้องใช้เวลาในเวิร์กช็อปนี้นานขึ้น 1-2 เท่า
แต่หัวข้อนี้สำคัญมาก เราได้รวบรวมไอเดียบางส่วนไว้ใน SECURITY
12. ยินดีด้วย
ขอแสดงความยินดี 🎉🎉🎉 คุณได้ทำให้แอปพลิเคชัน PHP รุ่นเดิมทันสมัยด้วย Google Cloud เรียบร้อยแล้ว
โดยสรุปแล้ว คุณได้เรียนรู้สิ่งต่อไปนี้ใน Codelab นี้
- วิธีทำให้ฐานข้อมูลใช้งานได้ใน Google Cloud SQL และวิธีย้ายข้อมูลฐานข้อมูลที่มีอยู่ไปยัง Google Cloud SQL
- วิธีบรรจุแอปพลิเคชัน PHP ลงในคอนเทนเนอร์ด้วย Docker และ Buildpack และจัดเก็บอิมเมจไปยัง Google Cloud Artifact Registry
- วิธีทำให้แอปที่ใช้คอนเทนเนอร์ใช้งานได้ใน Cloud Run และทําให้แอปทํางานร่วมกับ Cloud SQL
- วิธีจัดเก็บ/ใช้พารามิเตอร์การกําหนดค่าที่มีความละเอียดอ่อน (เช่น รหัสผ่าน DB) อย่างลับๆ โดยใช้ Google Secret Manager
- วิธีตั้งค่าไปป์ไลน์ CI/CD ด้วย Google Cloud Build เพื่อสร้างและทำให้แอป PHP ใช้งานได้โดยอัตโนมัติเมื่อมีการพุชโค้ดไปยังที่เก็บ GitHub
- วิธีใช้ Cloud Storage เพื่อ "ย้ายข้อมูลทรัพยากรแอปไปยังระบบคลาวด์"
- วิธีใช้ประโยชน์จากเทคโนโลยีแบบไร้เซิร์ฟเวอร์เพื่อสร้างเวิร์กโฟลว์ที่ยอดเยี่ยมบน Google Cloud โดยไม่ต้องแตะโค้ดแอป
- ใช้ความสามารถแบบหลายรูปแบบของ Gemini สำหรับกรณีการใช้งานที่เหมาะสม
- ใช้หลักการ SRE ภายใน Google Cloud
นี่เป็นจุดเริ่มต้นที่ดีในเส้นทางการปรับแอปพลิเคชันให้ทันสมัยด้วย Google Cloud
🔁 ความคิดเห็น
หากต้องการบอกเราเกี่ยวกับประสบการณ์ที่คุณได้รับจากเวิร์กช็อปนี้ โปรดกรอกแบบฟอร์มความคิดเห็นนี้
เรายินดีรับฟังความคิดเห็นของคุณ รวมถึงPR สำหรับโค้ดที่คุณภูมิใจเป็นพิเศษ
🙏 ขอขอบคุณ
ผู้เขียนขอขอบคุณ Mirko Gilioli และ Maurizio Ipsale จาก Datatonic ที่ให้ความช่วยเหลือในการเขียนและทดสอบโซลูชัน