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 และทริกเกอร์ได้ทุกครั้งที่มีการพุชไปยัง main เป็นต้น
- โฮสต์รูปภาพแอปพลิเคชันใน Cloud Storage ซึ่งทำได้ผ่านการติดตั้ง และไม่จำเป็นต้องใช้โค้ดเพื่อเปลี่ยนแอป
- เปิดตัวฟังก์ชันการทำงานของ Gen AI ผ่าน Gemini ซึ่งประสานงานผ่าน Cloud Functions (แบบไร้เซิร์ฟเวอร์)
- ทำความคุ้นเคยกับ SLO และการใช้งานแอปที่เพิ่งปรับปรุงใหม่
การทำตามขั้นตอนเหล่านี้จะช่วยให้คุณค่อยๆ ปรับแอปพลิเคชัน PHP ให้ทันสมัยขึ้น ซึ่งจะช่วยปรับปรุงความสามารถในการปรับขนาด ความปลอดภัย และความยืดหยุ่นในการติดตั้งใช้งาน นอกจากนี้ การย้ายข้อมูลไปยัง Google Cloud ยังช่วยให้คุณใช้ประโยชน์จากโครงสร้างพื้นฐานและบริการที่มีประสิทธิภาพของ Google Cloud เพื่อให้มั่นใจว่าแอปพลิเคชันจะทำงานได้อย่างราบรื่นในสภาพแวดล้อมแบบ Cloud-Native
เราเชื่อว่าสิ่งที่คุณจะได้เรียนรู้จากการทำตามขั้นตอนง่ายๆ เหล่านี้สามารถนำไปใช้กับแอปพลิเคชันและองค์กรของคุณเองได้ โดยใช้ภาษา/สแต็กที่แตกต่างกันและมีกรณีการใช้งานที่แตกต่างกัน
เกี่ยวกับแอป
แอปพลิเคชัน ( โค้ดภายใต้สัญญาอนุญาต 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 บางรายการ ดูขั้นตอนถัดไป
- คุณจะใช้ Cloud Shell มาพร้อมกับคำสั่งที่ติดตั้งไว้ล่วงหน้าทั้งหมดที่คุณต้องการและ IDE
- บัญชี GitHub คุณต้องใช้ที่เก็บนี้เพื่อแยกโค้ดต้นฉบับ 🧑🏻💻 gdgpescara/app-mod-workshop ด้วยที่เก็บ Git ของคุณเอง คุณต้องมีสิ่งนี้เพื่อสร้างไปป์ไลน์ CI/CD ของคุณเอง (คอมมิตอัตโนมัติ -> สร้าง -> ติดตั้งใช้งาน)
ดูโซลูชันตัวอย่างได้ที่นี่
- ที่เก็บของผู้เขียน: https://github.com/Friends-of-Ricc/app-mod-workshop
- ที่เก็บเวิร์กช็อปต้นฉบับในโฟลเดอร์
.solutions/ของแต่ละบท
เวิร์กช็อปนี้ออกแบบมาให้ทำใน Cloud Shell (ในเบราว์เซอร์)
แต่ก็สามารถลองทำจากคอมพิวเตอร์ในเครื่องได้เช่นกัน
2. การตั้งค่าเครดิตและการแยก

แลกรับเครดิต GCP และตั้งค่าสภาพแวดล้อม GCP [ไม่บังคับ]
หากต้องการจัดเวิร์กช็อปนี้ คุณต้องมีบัญชีสำหรับการเรียกเก็บเงินที่มีเครดิตอยู่บ้าง หากมีการเรียกเก็บเงินของคุณเองอยู่แล้ว ให้ข้ามขั้นตอนนี้
สร้างบัญชี Google Gmail ใหม่เอี่ยม (*) เพื่อลิงก์กับเครดิต GCP ขอลิงก์จากผู้สอนเพื่อแลกรับเครดิต GCP หรือใช้เครดิตที่ bit.ly/PHP-Amarcord-credits
ลงชื่อเข้าใช้ด้วยบัญชีที่สร้างขึ้นใหม่ แล้วทำตามวิธีการ

(
) ทำไมฉันต้องมีบัญชี Gmail ใหม่*
เราพบว่าผู้ใช้ไม่ผ่านการทำโค้ดแล็บเนื่องจากบัญชีของตน (โดยเฉพาะอีเมลงานหรืออีเมลนักเรียน/นักศึกษา) เคยใช้ GCP มาก่อนและมีนโยบายขององค์กร ที่จำกัดความสามารถในการดำเนินการดังกล่าว เราขอแนะนำให้สร้างบัญชี Gmail ใหม่หรือใช้บัญชี Gmail (gmail.com) ที่มีอยู่ซึ่งไม่เคยใช้ GCP มาก่อน
คลิกปุ่มเพื่อแลกรับเครดิต

กรอกชื่อและนามสกุลของคุณในแบบฟอร์มต่อไปนี้ แล้วยอมรับข้อกำหนดและเงื่อนไข
คุณอาจต้องรอสักครู่ก่อนที่บัญชีสำหรับการเรียกเก็บเงินจะปรากฏที่ https://console.cloud.google.com/billing
เมื่อเสร็จแล้ว ให้เปิด Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่โดยคลิกตัวเลือกโปรเจ็กต์ในเมนูแบบเลื่อนลงด้านซ้ายบนที่แสดง "ไม่มีองค์กร" ดูด้านล่าง

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

อย่าลืมลิงก์โปรเจ็กต์ใหม่กับบัญชีสำหรับการเรียกเก็บเงินของรุ่นทดลองใช้ GCP โดยทำดังนี้

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

ตรวจสอบว่าได้เลือกโปรเจ็กต์ใหม่ที่ด้านซ้ายบนแล้ว
ไม่ได้เลือก (ไม่ดี):

เลือกแล้ว (ดี):

Fork แอปจาก GitHub
- ไปที่แอปตัวอย่าง: https://github.com/gdgpescara/app-mod-workshop
- คลิก 🍴 Fork
- หากไม่มีบัญชี GitHub คุณจะต้องสร้างบัญชีใหม่
- แก้ไขสิ่งต่างๆ ตามที่คุณต้องการ

- โคลนโค้ดแอปโดยใช้คำสั่งต่อไปนี้
git clonehttps://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
- ค่าที่กำหนดล่วงหน้า: development (เราลองใช้ Sandbox แล้วแต่ไม่ได้ผล)
- MySQL เวอร์ชัน: 5.7 (ว้าว นานมากแล้ว)
- รหัสอินสแตนซ์: เลือก
appmod-phpapp(หากเปลี่ยนค่านี้ โปรดอย่าลืมเปลี่ยนสคริปต์และโซลูชันในอนาคตด้วย) - รหัสผ่าน: อะไรก็ได้ที่คุณต้องการ แต่จดไว้เป็น CLOUDSQL_INSTANCE_PASSWORD
- ภูมิภาค: ใช้ภูมิภาคเดียวกับที่เลือกไว้สำหรับส่วนอื่นๆ ของแอป (เช่น มิลาน =
europe-west8) - ความพร้อมใช้งานระดับโซน: โซนเดียว (เราประหยัดเงินสำหรับการสาธิต)
คลิกปุ่มสร้างอินสแตนซ์เพื่อติดตั้งใช้งานฐานข้อมูล Cloud SQL ⌛ การดำเนินการนี้ใช้เวลาประมาณ 10 นาทีจึงจะเสร็จสมบูรณ์⌛ ในระหว่างนี้ โปรดอ่านเอกสารประกอบต่อไป หรือคุณจะเริ่มแก้ปัญหาในโมดูลถัดไป ("Containerize your PHP App") ก็ได้ เนื่องจากไม่มีการขึ้นต่อกันกับโมดูลนี้ในส่วนแรก (จนกว่าคุณจะแก้ไขการเชื่อมต่อ DB)
หมายเหตุ อินสแตนซ์นี้ควรมีค่าใช้จ่ายประมาณ $7/วัน อย่าลืมนำไปใช้ต่อหลังจากเวิร์กช็อป
สร้าง DB และผู้ใช้ 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 ที่รู้จักกันดี
โปรดทราบว่า DB ทั้งหมดใน Cloud SQL จะเกิดมาพร้อมกับ "การแยก" คุณต้องตั้งค่าเครือข่ายอย่างชัดเจนเพื่อให้เข้าถึงได้
- คลิกอินสแตนซ์
- เปิดเมนู "การเชื่อมต่อ"
- คลิกแท็บ "เครือข่าย"
- คลิกในส่วน "เครือข่ายที่ได้รับอนุญาต" ตอนนี้ให้เพิ่มเครือข่าย (เช่น ซับเน็ต)
- ตอนนี้ ให้เลือกการตั้งค่าที่รวดเร็วแต่ไม่ปลอดภัยเพื่อให้แอปทำงานได้ คุณอาจต้องการจำกัดการตั้งค่าในภายหลังให้เฉพาะ IP ที่คุณเชื่อถือ
- ชื่อ: "ทุกคนทั่วโลก - INSECURE"
- เครือข่าย: "
0.0.0.0/0"(หมายเหตุ: นี่คือส่วนที่ไม่ปลอดภัย) - คลิกเสร็จสิ้น
- คลิกบันทึก
คุณควรเห็นข้อความคล้ายกับข้อความต่อไปนี้

หมายเหตุ โซลูชันนี้เป็นทางออกที่ดีในการจบเวิร์กช็อปใน O(ชั่วโมง) อย่างไรก็ตาม โปรดดูเอกสารความปลอดภัยเพื่อช่วยรักษาความปลอดภัยของโซลูชันสำหรับการใช้งานจริง
ได้เวลาทดสอบการเชื่อมต่อ DB แล้ว
มาดูกันว่าimage_catalogผู้ใช้ที่เราสร้างไว้ก่อนหน้านี้ใช้งานได้หรือไม่
เข้าถึง "Cloud SQL Studio" ภายในอินสแตนซ์ แล้วป้อนฐานข้อมูล ผู้ใช้ และรหัสผ่านเพื่อรับการตรวจสอบสิทธิ์ตามที่แสดงด้านล่าง

ตอนนี้คุณสามารถเปิด SQL Editor และไปยังส่วนถัดไปได้แล้ว
นำเข้าฐานข้อมูลจากโค้ดเบส
ใช้ SQL Editor เพื่อนำเข้า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 บางประเภทซึ่งมีข้อมูลทั้งหมดเพื่อเรียกใช้ในระบบคลาวด์
คุณแพ็กเกจได้หลายวิธีดังนี้
- Docker ได้รับความนิยมอย่างมาก แต่ค่อนข้างซับซ้อนในการตั้งค่าให้ถูกต้อง
- Buildpack ไม่ค่อยได้รับความนิยม แต่มีแนวโน้มที่จะ "เดาอัตโนมัติ" ว่าจะสร้างอะไรและจะเรียกใช้สิ่งใด ซึ่งมักจะใช้งานได้เลย
ในบริบทของเวิร์กช็อปนี้ เราจะถือว่าคุณใช้ Docker
หากเลือกใช้ Cloud Shell ตอนนี้เป็นเวลาที่ต้องเปิดอีกครั้ง (คลิกที่ด้านขวาบนของ Cloud Console)

ซึ่งควรจะเปิดเชลล์ที่สะดวกที่ด้านล่างของหน้าเว็บ ซึ่งคุณควรจะแยกโค้ดในขั้นตอนการตั้งค่า

Docker
หากต้องการควบคุมด้วยตนเอง โซลูชันนี้เหมาะสำหรับคุณ ซึ่งจะมีประโยชน์เมื่อคุณต้องกำหนดค่าไลบรารีที่เฉพาะเจาะจง และแทรกพฤติกรรมบางอย่างที่ไม่ชัดเจน (chmod ในการอัปโหลด, ไฟล์ที่เรียกใช้งานได้ที่ไม่เป็นไปตามมาตรฐานในแอป ฯลฯ)
เนื่องจากเราต้องการทำให้แอปพลิเคชันที่อยู่ในคอนเทนเนอร์ใช้งานได้ใน Cloud Run ในท้ายที่สุด โปรดดูเอกสารประกอบต่อไปนี้ คุณจะย้อนพอร์ตจาก PHP 8 ไปยัง PHP 5.7 ได้อย่างไร คุณอาจใช้ Gemini เพื่อทำสิ่งนี้ได้ หรือจะใช้เวอร์ชันที่สร้างไว้ล่วงหน้าก็ได้
# Use the official PHP image: https://hub.docker.com/_/php
FROM php:5.6-apache
# Configure PHP for Cloud Run.
# Precompile PHP code with opcache.
# Install PHP's extension for MySQL
RUN docker-php-ext-install -j "$(nproc)" opcache mysqli pdo pdo_mysql && docker-php-ext-enable pdo_mysql
RUN set -ex; \
{ \
echo "; Cloud Run enforces memory & timeouts"; \
echo "memory_limit = -1"; \
echo "max_execution_time = 0"; \
echo "; File upload at Cloud Run network limit"; \
echo "upload_max_filesize = 32M"; \
echo "post_max_size = 32M"; \
echo "; Configure Opcache for Containers"; \
echo "opcache.enable = On"; \
echo "opcache.validate_timestamps = Off"; \
echo "; Configure Opcache Memory (Application-specific)"; \
echo "opcache.memory_consumption = 32"; \
} > "$PHP_INI_DIR/conf.d/cloud-run.ini"
# Copy in custom code from the host machine.
WORKDIR /var/www/html
COPY . .
# Setup the PORT environment variable in Apache configuration files: https://cloud.google.com/run/docs/reference/container-contract#port
ENV PORT=8080
# Tell Apache to use 8080 instead of 80.
RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf
# Note: This is quite insecure and opens security breaches. See last chapter for hardening ideas.
# Uncomment at your own risk:
#RUN chmod 777 /var/www/html/uploads/
# Configure PHP for development.
# Switch to the production php.ini for production operations.
# RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
# https://github.com/docker-library/docs/blob/master/php/README.md#configuration
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
# Expose the port
EXPOSE 8080
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_catalogDB_USERควรเป็นappmod-phpapp-userDB_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 คุณจะเห็นลักษณะดังนี้

เยี่ยมเลย นอกเหนือจากข้อความภาษาอิตาลีแล้ว ทุกอย่างก็ใช้งานได้ดี 🎉🎉🎉
หากการใช้ Docker ของคุณดี แต่ข้อมูลเข้าสู่ระบบ 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 ปัจจุบัน
- ข้อผิดพลาดที่ได้รับ
- [หากจำเป็น] โค้ด PHP ที่กำลังดำเนินการ
สิทธิ์ในการอัปโหลด นอกจากนี้ ให้ลองใช้ปลายทาง /upload.php และลองอัปโหลดรูปภาพ คุณอาจได้รับข้อผิดพลาดด้านล่าง หากเป็นเช่นนั้น คุณต้องchmod/chownแก้ไขในDockerfile
คำเตือน: move_uploaded_file(uploads/image (3).png): failed to open stream: Permission denied in /var/www/html/upload.php on line 11
PDOException "could not find driver" (หรือ "Errore di connessione: could not find driver") ตรวจสอบว่า 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 ซึ่งช่วยให้คุณเรียกใช้แอปพลิเคชันที่ใช้คอนเทนเนอร์แบบไม่เก็บสถานะในสภาพแวดล้อมแบบไร้เซิร์ฟเวอร์ได้ โดยจะจัดการโครงสร้างพื้นฐานทั้งหมดโดยอัตโนมัติ ซึ่งจะปรับขนาดจาก 0 เพื่อรองรับการเข้าชมที่เข้ามา และลดขนาดลงเมื่อไม่มีการใช้งาน ทำให้ประหยัดต้นทุนและมีประสิทธิภาพ Cloud Run รองรับภาษาหรือไลบรารีใดก็ได้ตราบใดที่บรรจุอยู่ในคอนเทนเนอร์ ซึ่งช่วยให้มีความยืดหยุ่นในการพัฒนาเป็นอย่างมาก โดยจะผสานรวมกับบริการอื่นๆ ของ Google Cloud ได้เป็นอย่างดี และเหมาะสำหรับการสร้าง Microservice, 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ภูมิภาค) - อิมเมจคอนเทนเนอร์ที่ห่อหุ้มแอป
- ตัวแปรสภาพแวดล้อมที่แอปต้องใช้ในระหว่างการดำเนินการ
- Allow-Unauthenticated flag ที่อนุญาตให้ทุกคนเข้าถึงแอปของคุณได้โดยไม่ต้องมีการตรวจสอบสิทธิ์เพิ่มเติม
โปรดดูวิธีใช้ตัวเลือกนี้กับบรรทัดคำสั่งในเอกสารประกอบ (หรือเลื่อนลงเพื่อดูวิธีแก้ปัญหาที่อาจเป็นไปได้)
การติดตั้งใช้งานจะใช้เวลาสักครู่ หากทุกอย่างถูกต้อง คุณควรเห็นข้อความคล้ายกับข้อความนี้ใน Google Cloud Console


คลิก 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] ขอตัวเลือก 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 (ดูโฟลเดอร์โซลูชัน)
นอกจากนี้ โปรดตรวจสอบว่าได้เพิ่ม .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
- คลิกแอป
- คลิก "แก้ไขและทำให้การแก้ไขใหม่ใช้งานได้"
- ในแท็บแรก "คอนเทนเนอร์" ให้คลิกแท็บด้านล่าง "ตัวแปรและความลับ"
- คลิก "+ เพิ่มตัวแปร" แล้วเพิ่มตัวแปรที่จำเป็นทั้งหมด คุณควรได้ผลลัพธ์ดังนี้


วิธีนี้ดีที่สุดไหม ไม่ ผู้ให้บริการส่วนใหญ่ยังคงเห็น PASS ของคุณ ปัญหานี้อาจลดลงได้ด้วย Secret Manager ของ Google Cloud
การทำซ้ำครั้งที่ 2: Secret Manager
รหัสผ่านของคุณหายไปจากโค้ดของคุณเองแล้ว ชนะแล้ว แต่เดี๋ยวก่อน เราปลอดภัยแล้วหรือยัง
รหัสผ่านของคุณจะยังคงแสดงแก่ทุกคนที่มีสิทธิ์เข้าถึง Google Cloud Console ในความเป็นจริงแล้ว หากเข้าถึงไฟล์การติดตั้งใช้งาน YAML ของ Cloud Run คุณจะเรียกข้อมูลดังกล่าวได้ หรือหากคุณพยายามแก้ไขหรือติดตั้งใช้งานรีวิชันใหม่ของ Cloud Run รหัสผ่านจะปรากฏในส่วนตัวแปรและข้อมูลลับดังที่แสดงในภาพหน้าจอด้านล่าง
Secret Manager ของ Google Cloud เป็นบริการที่ปลอดภัยและรวมศูนย์สำหรับการจัดการข้อมูลที่ละเอียดอ่อน เช่น คีย์ API, รหัสผ่าน, ใบรับรอง และข้อมูลลับอื่นๆ
ซึ่งช่วยให้คุณจัดเก็บ จัดการ และเข้าถึงข้อมูลลับได้ด้วยสิทธิ์แบบละเอียดและการเข้ารหัสที่แข็งแกร่ง Secret Manager ทำงานร่วมกับ Identity and Access Management (IAM) ของ Google Cloud เพื่อให้คุณควบคุมผู้ที่เข้าถึงข้อมูลลับที่เฉพาะเจาะจงได้ ซึ่งจะช่วยให้มั่นใจได้ถึงความปลอดภัยของข้อมูลและการปฏิบัติตามกฎระเบียบ
นอกจากนี้ยังรองรับการหมุนเวียนและการควบคุมเวอร์ชันของข้อมูลลับโดยอัตโนมัติ ซึ่งช่วยลดความซับซ้อนในการจัดการวงจรของข้อมูลลับและเพิ่มความปลอดภัยในแอปพลิเคชันในบริการต่างๆ ของ Google Cloud
หากต้องการเข้าถึง Secret Manager ให้ไปที่เมนูแฮมเบอร์เกอร์ แล้วไปที่บริการความปลอดภัย และค้นหาในส่วนการคุ้มครองข้อมูลตามที่แสดงในภาพหน้าจอด้านล่าง

เปิดใช้ Secret Manager API เมื่อคุณไปที่นั่นตามรูปภาพต่อไปนี้

- ตอนนี้ให้คลิก "สร้างข้อมูลลับ" มาตั้งชื่อให้สมเหตุสมผลกัน
- ชื่อ:
php-amarcord-db-pass - ค่าลับ: ‘รหัสผ่าน DB ของคุณ’ (ไม่ต้องสนใจส่วน "อัปโหลดไฟล์")
- ใส่คำอธิบายประกอบลิงก์ลับนี้ ควรมีลักษณะดังนี้
projects/123456789012/secrets/php-amarcord-db-passนี่คือพอยน์เตอร์ที่ไม่ซ้ำกันไปยังข้อมูลลับของคุณ (สำหรับ Terraform, Cloud Run และอื่นๆ) หมายเลขนี้คือหมายเลขโปรเจ็กต์ที่ไม่ซ้ำกันของคุณ
เคล็ดลับ: ลองใช้รูปแบบการตั้งชื่อที่สอดคล้องกันสำหรับข้อมูลลับ โดยเรียงจากซ้ายไปขวา เช่น cloud-devrel-phpamarcord-dbpass
- องค์กร (ที่มีบริษัท)
- ทีม (ภายในองค์กร)
- การใช้งาน (ภายในทีม)
- ชื่อตัวแปร (ภายในแอป)
ซึ่งจะช่วยให้คุณมีนิพจน์ทั่วไปที่ง่ายต่อการค้นหาข้อมูลลับทั้งหมดของแอปเดียว
สร้างการแก้ไข Cloud Run ใหม่
ตอนนี้เรามีข้อมูลลับใหม่แล้ว จึงต้องนำตัวแปรสภาพแวดล้อม DB_PASS ออกและแทนที่ด้วยข้อมูลลับใหม่ ดังนั้น
- สิทธิ์เข้าถึง Cloud Run โดยใช้ Google Cloud Console
- เลือกแอป
- คลิก "แก้ไขและทำให้การแก้ไขใหม่ใช้งานได้"
- ค้นหาแท็บ "ตัวแปรและข้อมูลลับ"
- ใช้ปุ่ม "+ อ้างอิง Secret" เพื่อรีเซ็ตตัวแปรสภาพแวดล้อม DB_PASS
- ใช้ "DB_PASS" เดียวกันสำหรับข้อมูลลับที่อ้างอิงและใช้เวอร์ชันล่าสุด

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

ลองหาวิธีแก้ไข หากต้องการแก้ไขปัญหานี้ คุณต้องเข้าถึงส่วน IAM และผู้ดูแลระบบ แล้วเปลี่ยนสิทธิ์ที่ให้ ขอให้สนุกกับการแก้ไขข้อบกพร่อง
เมื่อทราบแล้ว ให้กลับไปที่ Cloud Run แล้วติดตั้งใช้งานรีวิชันใหม่ ผลลัพธ์ควรมีลักษณะดังรูปต่อไปนี้

เคล็ดลับ: คอนโซลนักพัฒนาแอป (UI) ช่วยชี้ให้เห็นปัญหาเกี่ยวกับสิทธิ์ได้เป็นอย่างดี โปรดใช้เวลาในการไปยังลิงก์ทั้งหมดสำหรับเอนทิตีในระบบคลาวด์
7. โมดูลที่ 5: ตั้งค่า CI/CD ด้วย Cloud Build

ทำไมต้องใช้ไปป์ไลน์ CI/CD
ตอนนี้คุณน่าจะพิมพ์ gcloud run deploy ไปหลายครั้งแล้ว บางทีอาจตอบคำถามเดิมซ้ำไปซ้ำมา
เบื่อกับการทำให้แอปใช้งานได้ด้วยตนเองด้วย gcloud run deploy ไหม จะดีแค่ไหนหากแอปของคุณสามารถติดตั้งใช้งานตัวเองโดยอัตโนมัติทุกครั้งที่คุณพุชการเปลี่ยนแปลงใหม่ไปยังที่เก็บ Git
หากต้องการใช้ไปป์ไลน์ CI/CD คุณจะต้องมี 2 สิ่งต่อไปนี้
- ที่เก็บ Git ส่วนตัว: คุณควรจะ Fork ที่เก็บของเวิร์กช็อปไปยังบัญชี GitHub ในขั้นตอนที่ 2 แล้ว หากยังไม่ได้ทำ ให้กลับไปทำตามขั้นตอนนั้นให้เสร็จสมบูรณ์ ที่เก็บที่แยกควรมีลักษณะดังนี้
https://github.com/<YOUR_GITHUB_USER>/app-mod-workshop - Cloud Build บริการที่ยอดเยี่ยมและราคาถูกนี้ช่วยให้คุณกำหนดค่าการสร้างอัตโนมัติสำหรับแทบทุกอย่างได้ ไม่ว่าจะเป็น Terraform, แอปที่ใช้ Docker และอื่นๆ
ส่วนนี้จะเน้นที่การตั้งค่า Cloud Build
เข้าสู่ Cloud Build
เราจะใช้ Cloud Build เพื่อดำเนินการนี้
- สร้างแหล่งข้อมูล (ด้วย Dockerfile) คิดว่านี่คือ "ไฟล์ .zip ขนาดใหญ่" ซึ่งมีทุกอย่างที่คุณต้องใช้ในการสร้างและเรียกใช้ (ซึ่งก็คือ "อาร์ติแฟกต์บิลด์")
- push อาร์ติแฟกต์นี้ไปยัง 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" (ครั้งแรก)
- "ต่อไป"
- Authenticate จะเปิดหน้าต่างใน GitHub เพื่อตรวจสอบสิทธิ์แบบข้าม ทำตามขั้นตอนและอดทนรอ หากมีที่เก็บข้อมูลจำนวนมาก คุณอาจต้องใช้เวลาสักครู่
- "เลือกที่เก็บ" เลือกบัญชี/ที่เก็บของคุณ แล้วทำเครื่องหมายที่ส่วน "ฉันเข้าใจ..."
- หากได้รับข้อผิดพลาด: แอป GitHub ยังไม่ได้ติดตั้งอยู่บนที่เก็บของคุณ ให้คลิก "ติดตั้ง Google Cloud Build" แล้วทำตามวิธีการ
คลิกเชื่อมต่อ
- บิงโก ตอนนี้ที่เก็บของคุณเชื่อมต่อแล้ว
- กลับไปที่ส่วนทริกเกอร์...
- การกำหนดค่า: ตรวจหาอัตโนมัติ (*)
- ขั้นสูง: เลือกบัญชีบริการ "[PROJECT_NUMBER]- compute@developer.gserviceaccount.com"
- xxxxx คือรหัสโปรเจ็กต์
- บัญชีบริการ Compute เริ่มต้นเหมาะสำหรับแนวทางในห้องทดลอง แต่ไม่ควรใช้ในสภาพแวดล้อมการผลิต ( ดูข้อมูลเพิ่มเติม)
- และปล่อยให้ส่วนอื่นๆ เหมือนเดิม
- คลิกปุ่ม "สร้าง"
(*) วิธีนี้เป็นวิธีที่ง่ายที่สุดเนื่องจากจะตรวจสอบ Dockerfile หรือ cloudbuild.yaml อย่างไรก็ตาม cloudbuild.yamlจะช่วยให้คุณมีอำนาจที่แท้จริงในการตัดสินใจว่าจะทำอะไรในขั้นตอนใด
ฉันมีพลัง!
ตอนนี้ทริกเกอร์จะใช้งานไม่ได้จนกว่าคุณจะให้สิทธิ์บัญชีบริการ Cloud Build (บัญชีบริการคืออะไร อีเมลของ "หุ่นยนต์" ที่ดำเนินการในนามของคุณสำหรับงานหนึ่งๆ ซึ่งในกรณีนี้คือการสร้างสิ่งต่างๆ ในระบบคลาวด์
SA จะสร้างและติดตั้งใช้งานไม่ได้ เว้นแต่คุณจะให้สิทธิ์เขาในการดำเนินการดังกล่าว โชคดีที่ทำได้ง่ายๆ
- ไปที่ "Cloud Build" > "การตั้งค่า"
- บัญชีบริการ "[PROJECT_NUMBER]- compute@developer.gserviceaccount.com"
- เลือกช่องต่อไปนี้
- Cloud Run
- Secret Manager
- บัญชีบริการ
- Cloud Build
- และเลือกช่อง "ตั้งค่าเป็นบัญชีบริการที่ต้องการ" ด้วย

YAML ของ Cloud Build อยู่ที่ไหน
เราขอแนะนำให้คุณสละเวลาสร้าง YAML ของ Cloud Build ด้วยตนเอง
อย่างไรก็ตาม หากไม่มีเวลาหรือไม่อยากเสียเวลา คุณสามารถดูไอเดียได้ในโฟลเดอร์โซลูชันนี้ .solutions
ตอนนี้คุณสามารถพุชการเปลี่ยนแปลงไปยัง GitHub และสังเกต Cloud Build ในส่วนของตัวเองได้แล้ว
การตั้งค่า Cloud Build อาจซับซ้อน คาดว่าจะมีการโต้ตอบไปมาโดย
- การตรวจสอบบันทึกใน https://console.cloud.google.com/cloud-build/builds;region=global
- การค้นหาข้อผิดพลาด
- แก้ไขในโค้ดและออกคำสั่ง git commit / git push อีกครั้ง
- บางครั้งข้อผิดพลาดไม่ได้อยู่ในโค้ด แต่อยู่ในการกำหนดค่าบางอย่าง ในกรณีดังกล่าว คุณสามารถออกบิลด์ใหม่จาก UI (Cloud Build > "ทริกเกอร์" > เรียกใช้)

โปรดทราบว่าหากใช้โซลูชันนี้ คุณยังคงต้องดำเนินการบางอย่าง เช่น ตั้งค่าตัวแปร 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 ใน VS Code ได้ และการดึง/พุชจากที่นั่นจะง่ายขึ้น

อย่าลืมgit add clodubuild.yamlในไฟล์อื่นๆ ด้วย ไม่เช่นนั้นจะใช้งานไม่ได้
"ความเท่าเทียมกันระหว่างสภาพแวดล้อมการพัฒนา/การผลิต" แบบลึกเทียบกับแบบตื้น [ไม่บังคับ]
หากคุณคัดลอกเวอร์ชันโมเดลจากที่นี่ คุณจะมีเวอร์ชัน DEV และ PROD ที่เหมือนกัน 2 เวอร์ชัน ซึ่งเป็นเรื่องดีและสอดคล้องกับกฎข้อที่ 10 ของแอปแบบ 12 ปัจจัย
อย่างไรก็ตาม เราใช้ปลายทางเว็บ 2 รายการที่แตกต่างกันเพื่อให้แอปชี้ไปยังฐานข้อมูลเดียวกัน ซึ่งเพียงพอสำหรับการเวิร์กช็อป แต่ในชีวิตจริง คุณควรใช้เวลาสักพักเพื่อสร้างสภาพแวดล้อมการใช้งานจริงที่เหมาะสม ซึ่งหมายถึงการมีฐานข้อมูล 2 รายการ (1 รายการสำหรับ Dev และ 1 รายการสำหรับ Prod) และการเลือกตำแหน่งที่จะใช้ฐานข้อมูลสำหรับการกู้คืนจากภัยพิบัติ / ความพร้อมใช้งานสูง เรื่องนี้อยู่นอกเหนือขอบเขตของเวิร์กชอปนี้ แต่ก็เป็นเรื่องที่น่าคิด
หากมีเวลาผลิตเวอร์ชัน "ละเอียด" โปรดคำนึงถึงแหล่งข้อมูลทั้งหมดที่คุณต้องทำซ้ำ เช่น
- ฐานข้อมูล Cloud SQL (และอาจเป็นอินสแตนซ์ SQL)
- Bucket ของ GCS
- Cloud Function
- คุณอาจใช้ Gemini 1.5 Flash เป็นโมเดลในการพัฒนา (ราคาถูกกว่า เร็วกว่า) และ Gemini 1.5 Pro (ทรงพลังกว่า)
โดยทั่วไปแล้ว ทุกครั้งที่คุณทำสิ่งใดก็ตามเกี่ยวกับแอป ให้คิดอย่างมีวิจารณญาณว่าเวอร์ชันที่ใช้งานจริงควรมีค่าเดียวกันนี้หรือไม่ หากยังไม่เป็นเช่นนั้น ให้ทำซ้ำ ซึ่งแน่นอนว่าการใช้ Terraform จะช่วยให้ทำได้ง่ายขึ้นมาก โดยคุณสามารถแทรกสภาพแวดล้อม (-dev, -prod) เป็นคำต่อท้ายของทรัพยากรได้
8. โมดูล 6: ย้ายไปยัง Google Cloud Storage

พื้นที่เก็บข้อมูล

ปัจจุบันแอปจัดเก็บสถานะไว้ในคอนเทนเนอร์ Docker หากเครื่องเสีย แอปขัดข้อง หรือเพียงแค่พุชการแก้ไขใหม่ ระบบจะกำหนดเวลาการแก้ไขใหม่พร้อมพื้นที่เก็บข้อมูลว่างเปล่าใหม่ให้ 🙈
เราจะแก้ไขปัญหานี้ได้อย่างไร มีหลายวิธี
- จัดเก็บรูปภาพใน DB นั่นคือสิ่งที่ฉันทำกับแอป 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 Mounts ของ GCS ฟังดูดีมากเลย
🤔 ย้ายข้อมูลพื้นที่เก็บข้อมูล (ปลายเปิด)
[คำถามปลายเปิด] ในแบบฝึกหัดนี้ เราต้องการให้คุณค้นหาวิธีการย้ายรูปภาพในลักษณะที่ยังคงอยู่ต่อไปในรูปแบบใดรูปแบบหนึ่ง
การทดสอบการยอมรับ
ฉันไม่อยากบอกวิธีแก้ปัญหา แต่ฉันอยากให้เกิดสิ่งนี้
- คุณอัปโหลด
newpic.jpgคุณจะเห็นในแอป - คุณอัปเกรดแอปเป็นเวอร์ชันใหม่
newpic.jpgยังคงแสดงอยู่
💡 โซลูชันที่เป็นไปได้ (การติดตั้งโวลุ่ม GCS Cloud Run)
นี่เป็นโซลูชันที่ยอดเยี่ยมมากซึ่งช่วยให้เราอัปโหลดไฟล์แบบมีสถานะได้โดยไม่ต้องแตะต้องโค้ดเลย (นอกเหนือจากการแสดงคำอธิบายรูปภาพ แต่เป็นเรื่องเล็กน้อยและเพียงเพื่อความพึงพอใจ)
ซึ่งจะช่วยให้คุณติดตั้งโฟลเดอร์จาก 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 ให้ติดตั้ง Bucket ในโฟลเดอร์ /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
- ในแท็บ "Volumes" ให้สร้าง Volume Mounts ที่ชี้ไปยัง Bucket ของคุณ โดยมีประเภทเป็น "Cloud Storage bucket" เช่น มีชื่อว่า "php_uploads"
- ในส่วน Container(s) > Volume Mounts ให้เมานต์วอลุ่มที่เพิ่งสร้างขึ้นในจุดวอลุ่มที่แอปของคุณร้องขอ โดยจะขึ้นอยู่กับ Dockerfile แต่ลักษณะอาจเป็นดังนี้
var/www/html/uploads/
ไม่ว่าจะด้วยวิธีใด หากใช้งานได้ การแก้ไขรีวิชันใหม่ของ Cloud Run ควรแสดงผลดังนี้

ตอนนี้ให้ทดสอบการอัปโหลดแอปพลิเคชันใหม่โดยอัปโหลดรูปภาพใหม่ 1 รูปไปยังปลายทาง /upload.php
รูปภาพควรแสดงอย่างราบรื่นใน GCS โดยไม่ต้องเขียนโค้ด PHP แม้แต่บรรทัดเดียว

เกิดอะไรขึ้น
มีสิ่งมหัศจรรย์เกิดขึ้น
แอปพลิเคชันเก่าที่มีโค้ดเก่าจะยังคงทำงานต่อไป สแต็กใหม่ที่ทันสมัยช่วยให้เรามีรูปภาพทั้งหมดในแอปที่จัดเก็บไว้ใน Cloud Bucket แบบมีสถานะได้อย่างสะดวก ตอนนี้คุณสามารถทำได้ทุกอย่าง
- หากต้องการส่งอีเมลทุกครั้งที่มีรูปภาพที่มีคำว่า "อันตราย" หรือ "เปลือย" เข้ามา คุณทำได้โดยไม่ต้องแก้ไขโค้ด PHP
- หากต้องการใช้โมเดลมัลติโมดัลของ Gemini ทุกครั้งที่มีรูปภาพเข้ามาเพื่ออธิบายรูปภาพนั้น และอัปโหลด DB พร้อมคำอธิบาย คุณทำได้โดยไม่ต้องแก้ไขโค้ด PHP คุณไม่เชื่อฉันใช่ไหม โปรดอ่านต่อในบทที่ 7
เราเพิ่งปลดล็อกโอกาสอันยิ่งใหญ่ที่นี่
9. โมดูลที่ 7: เพิ่มศักยภาพให้แอปด้วย Google Gemini

ตอนนี้คุณมีแอป PHP ใหม่ที่ได้รับการปรับปรุงให้ทันสมัยและยอดเยี่ยม (เหมือน Fiat 126 ปี 2024) พร้อมพื้นที่เก็บข้อมูลในระบบคลาวด์แล้ว
คุณใช้ชื่อช่องทำอะไรได้บ้าง
ข้อกำหนดเบื้องต้น
ในบทที่แล้ว โซลูชันโมเดลช่วยให้เราสามารถติดตั้งรูปภาพ /uploads/ ใน GCS โดยพฤตินัย ซึ่งแยกตรรกะของแอปออกจากที่เก็บรูปภาพ
การออกกำลังกายนี้กำหนดให้คุณต้องทำสิ่งต่อไปนี้
- ทำแบบฝึกหัดในบทที่ 6 (ที่เก็บข้อมูล) เสร็จสมบูรณ์แล้ว
- มีที่เก็บข้อมูล GCS ที่มีการอัปโหลดรูปภาพ ซึ่งผู้ใช้จะอัปโหลดรูปภาพในแอปของคุณและรูปภาพจะไหลไปยังที่เก็บข้อมูล
ตั้งค่า Cloud Function (ใน Python)
เคยสงสัยไหมว่าแอปพลิเคชันที่ขับเคลื่อนด้วยเหตุการณ์ทำงานอย่างไร เช่น
- เมื่อเกิด <เหตุการณ์> => ส่งอีเมล
- เมื่อเกิด <event> => หาก <condition> เป็นจริง ให้อัปเดตฐานข้อมูล
เหตุการณ์อาจเป็นอะไรก็ได้ ตั้งแต่เรคคอร์ดใหม่ที่พร้อมใช้งานใน BigQuery, ออบเจ็กต์ใหม่ที่เปลี่ยนแปลงในโฟลเดอร์ใน GCS หรือข้อความใหม่ที่รออยู่ในคิวใน Pub/Sub
Google Cloud รองรับกระบวนทัศน์หลายอย่างเพื่อให้บรรลุเป้าหมายนี้ โดยเฉพาะอย่างยิ่ง
- EventArc ดูวิธีรับเหตุการณ์ GCS เหมาะสำหรับการสร้าง DAG และจัดระเบียบการดำเนินการตาม if-then-else ในระบบคลาวด์
- Cloud Scheduler เหมาะสำหรับงาน Cron ตอนเที่ยงคืนในระบบคลาวด์ เป็นต้น
- เวิร์กโฟลว์ระบบคลาวด์ เช่นเดียวกับ Event Arc ที่ช่วยให้คุณทำสิ่งต่อไปนี้ได้
- ฟังก์ชัน Cloud Run (หรือที่รู้จักกันในชื่อ
lambdas) - Cloud Composer โดยพื้นฐานแล้วเป็น Apache Airflow เวอร์ชัน Google ซึ่งเหมาะสำหรับ DAG ด้วย
ในแบบฝึกหัดนี้ เราจะเจาะลึก Cloud Functions เพื่อให้ได้ผลลัพธ์ที่น่าทึ่ง และเราจะจัดแบบฝึกหัดเพิ่มเติมให้คุณ
โปรดทราบว่าโค้ดตัวอย่างมีให้ในส่วน .solutions/
ตั้งค่า Cloud Function (🐍 Python)
เรากำลังพยายามสร้าง GCF ที่มีความทะเยอทะยานอย่างมาก
- เมื่อสร้างอิมเมจใหม่ใน GCS (อาจเป็นเพราะมีผู้ใช้บางรายอัปโหลดไว้ในแอป แต่ก็ไม่ใช่แค่เหตุผลนี้)
- .. เรียกใช้ Gemini เพื่ออธิบายรูปภาพและรับคำอธิบายที่เป็นข้อความของรูปภาพ .. (ควรตรวจสอบ MIME และตรวจสอบว่าเป็นรูปภาพ ไม่ใช่ PDF, MP3 หรือข้อความ)
- .. และอัปเดต DB ด้วยคำอธิบายนี้ (อาจต้องแก้ไข DB เพื่อเพิ่มคอลัมน์
descriptionลงในตารางimages)
แก้ไข DB เพื่อเพิ่ม description ลงในรูปภาพ
- เปิด Cloud SQL Studio โดยทำดังนี้

- ใส่ผู้ใช้และรหัสผ่านสำหรับฐานข้อมูลรูปภาพ
- แทรก SQL นี้ซึ่งจะเพิ่มคอลัมน์สำหรับคำอธิบายรูปภาพ
ALTER TABLE images ADD COLUMN description TEXT;

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

เขียนฟังก์ชัน f(x) ของ Gemini
หมายเหตุ ฟังก์ชันนี้สร้างขึ้นด้วยความช่วยเหลือจาก Gemini Code Assist
หมายเหตุ การสร้างฟังก์ชันนี้อาจทำให้เกิดข้อผิดพลาดเกี่ยวกับสิทธิ์ 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 อย่างมืออาชีพเพื่อหลีกเลี่ยงการพุชไลบรารีขนาดใหญ่ ( ตัวอย่าง)
#!/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 Functions จะส่งเหตุการณ์ GCS ไปยังเมธอดดังกล่าวพร้อมข้อมูลที่เกี่ยวข้องทั้งหมด (ชื่อ Bucket, ชื่อออบเจ็กต์ ฯลฯ) โปรดใช้เวลาสักครู่ในการแก้ไขข้อบกพร่องของพจนานุกรม Python ของเหตุการณ์นั้น
การทดสอบฟังก์ชัน
การทดสอบหน่วย
ฟังก์ชันนี้มีองค์ประกอบที่เคลื่อนไหวหลายอย่าง คุณอาจต้องการทดสอบทุกรายการ
ตัวอย่างอยู่ใน gcf/test.py
UI ของ Cloud Functions
นอกจากนี้ โปรดสละเวลาสำรวจฟังก์ชันใน UI ด้วย คุณควรสำรวจทุกแท็บ โดยเฉพาะแท็บ Source (รายการโปรดของฉัน), Variables, Trigger และ Logs คุณจะใช้เวลาส่วนใหญ่ในแท็บ Logs เพื่อแก้ปัญหาข้อผิดพลาด (ดูข้อผิดพลาดที่อาจเกิดขึ้นที่ด้านล่างของหน้านี้ด้วย) และอย่าลืมตรวจสอบ Permissions

การทดสอบ E2E
ถึงเวลาทดสอบฟังก์ชันด้วยตนเองแล้ว
- ไปที่แอปและเข้าสู่ระบบ
- อัปโหลดรูปภาพ (อย่าให้มีขนาดใหญ่เกินไป เพราะเราเคยพบปัญหาเกี่ยวกับรูปภาพขนาดใหญ่)
- ตรวจสอบใน 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 Functions อื่นๆ [ปลายเปิด]
เรานึกถึงฟีเจอร์เพิ่มเติมอีก 2-3 อย่าง
📩 ทริกเกอร์อีเมล
ทริกเกอร์อีเมลที่จะส่งอีเมลให้คุณทุกครั้งที่มีคนส่งรูปภาพ
- บ่อยเกินไปไหม เพิ่มข้อจำกัดเพิ่มเติม: รูปภาพขนาดใหญ่ หรือรูปภาพที่มีเนื้อหา Gemini ที่มีคำว่า "เปลือย/ภาพเปลือย/รุนแรง"
- ลองตรวจสอบ
EventArcสำหรับเรื่องนี้
🚫 กลั่นกรองรูปภาพที่ไม่เหมาะสมโดยอัตโนมัติ
ปัจจุบันผู้ดูแลระบบที่เป็นมนุษย์จะติดธงรูปภาพว่า "ไม่เหมาะสม" ลองให้ Gemini ทำงานที่ซับซ้อนและดูแลพื้นที่ทำงานแทนคุณไหม เพิ่มการทดสอบเพื่อแจ้งเนื้อหาทริกเกอร์ที่ไม่เหมาะสมและอัปเดต DB ตามที่เราได้เรียนรู้ในฟังก์ชันก่อนหน้า ซึ่งหมายถึงการใช้ฟังก์ชันก่อนหน้า เปลี่ยนพรอมต์ และอัปเดต DB ตามคำตอบ
ข้อควรระวัง Generative AI มีเอาต์พุตที่คาดเดาไม่ได้ ตรวจสอบว่า "ผลลัพธ์ที่เป็นครีเอทีฟโฆษณา" จาก Gemini อยู่ใน "กรอบ" คุณอาจขอคำตอบที่แน่นอน เช่น คะแนนความเชื่อมั่นจาก 0 ถึง 1, JSON เป็นต้น คุณสามารถทำได้หลายวิธี เช่น * ใช้ไลบรารี Python pydantic, langchain, .. * ใช้เอาต์พุตที่มีโครงสร้างของ Gemini
เคล็ดลับ คุณอาจมีฟังก์ชันหลายรายการหรือมีพรอมต์เดียวที่บังคับให้ตอบเป็น JSON (ใช้ได้ดีกับ "เอาต์พุตที่มีโครงสร้างของ Gemini" ตามที่ไฮไลต์ไว้ด้านบน) เช่น
พรอมต์ที่ใช้สร้างรูปภาพนี้คืออะไร
{
"description": "This is the picture of an arrosticino",
"suitable": TRUE
}
คุณสามารถเพิ่มช่องเพิ่มเติมในพรอมต์เพื่อรับข้อมูลเชิงลึก เช่น มีอะไรดีเกี่ยวกับผลิตภัณฑ์นี้ไหม ไม่ดีตรงไหน คุณรู้จักสถานที่นี้ไหม มีข้อความไหม (OCR ทำได้ง่ายกว่าที่เคย)
goods: "ดูเหมือนอาหารอร่อย"bads: "ดูเหมือนอาหารที่ไม่ดีต่อสุขภาพ"OCR: "Da consumare preferibilmente prima del 10 Novembre 2024"location: "Pescara, Lungomare"
แม้ว่าโดยปกติแล้วการมีฟังก์ชัน N สำหรับผลลัพธ์ N จะดีกว่า แต่การมีฟังก์ชันเดียวที่ทำได้ 10 อย่างก็เป็นเรื่องที่คุ้มค่าอย่างยิ่ง ดูวิธีได้ในบทความนี้ของ Riccardo
ข้อผิดพลาดที่อาจเกิดขึ้น (ส่วนใหญ่เป็น IAM / สิทธิ์)
ตอนที่พัฒนาโซลูชันนี้เป็นครั้งแรก ฉันพบปัญหาเกี่ยวกับสิทธิ์ IAM ฉันจะเพิ่มข้อความเหล่านั้นไว้ที่นี่เพื่อแสดงความเห็นใจและให้แนวคิดเกี่ยวกับวิธีแก้ไข
ข้อผิดพลาด: บัญชีบริการมีสิทธิ์ไม่เพียงพอ
- โปรดทราบว่าหากต้องการทำให้ฟังก์ชัน GCF ที่รับฟัง Bucket ของ 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 ทำให้เกิดข้อผิดพลาดนี้

คุณสามารถแก้ไขปัญหานี้ได้ง่ายๆ โดยไปที่ IAM แล้วมอบบทบาท "ผู้เผยแพร่ Pub/Sub" ให้บัญชีบริการ
ข้อผิดพลาด: ไม่ได้ใช้ Vertex AI
หากได้รับข้อผิดพลาดนี้ ให้ทำดังนี้
Permission Denied: 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 ที่ระบุ โปรดลองอีกครั้งในอีกสักครู่
หากเกิดกรณีนี้ขึ้น โปรดรอสักครู่หรือสอบถามจาก Googler
10. โมดูลที่ 8: สร้าง SLO ความพร้อมใช้งาน
ในบทนี้ เราจะพยายามทำให้ได้ตามนี้
- การสร้าง SLI
- การสร้าง SLO ตาม SLI
- การสร้างการแจ้งเตือนตาม SLO

หัวข้อนี้เป็นหัวข้อที่ผู้เขียนให้ความสำคัญเป็นอย่างมาก เนื่องจาก Riccardo ทำงานในส่วน SRE / DevOps ของ Google Cloud
(ปลายเปิด) สร้าง SLI และ SLO สำหรับแอปนี้
แอปจะดีได้อย่างไรหากคุณไม่รู้ว่าแอปหยุดทำงานเมื่อใด
SLO คืออะไร
บังเอิญจริงๆ Google เป็นผู้คิดค้น SLO หากต้องการอ่านข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ ฉันขอแนะนำให้คุณทำดังนี้
- หนังสือ SRE - บทที่ 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 รายการดังนี้
- อีกอันมีอัตราการใช้งานต่ำ ("Slowburn") เพื่อแจ้งเตือนคุณทางอีเมล (จำลองตั๋วที่มีลำดับความสำคัญต่ำ)
- มีอัตราการใช้งานสูง ("Fastburn") เพื่อแจ้งเตือนคุณผ่าน SMS (จำลองตั๋วที่มีลำดับความสำคัญสูง / เพจเจอร์)
ไปที่ SLO tab จากก่อนหน้านี้
ทำดังนี้ 2 ครั้ง

- คลิก "สร้างการแจ้งเตือน SLO" (ปุ่ม 🔔 ที่มีเครื่องหมายบวกอยู่ด้านในทางขวา)
- ระยะเวลามองย้อนกลับ เกณฑ์อัตราการเผาผลาญ:
- [FAST] ครั้งแรก:
60นาที /10ครั้ง - [ช้า] วินาที:
720นาที /2x - ช่องทางการแจ้งเตือน: คลิกจัดการช่องทางการแจ้งเตือน
- ก่อนอื่น "อีเมล" -> เพิ่มใหม่ -> ..
- จากนั้น "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 รายการสำหรับความพร้อมใช้งาน และมีการแจ้งเตือนไปยังอีเมลและโทรศัพท์ของคุณ
หากต้องการ คุณสามารถเพิ่มเวลาในการตอบสนอง (และเราขอแนะนำให้คุณทำเช่นนั้น) หรือแม้แต่เพิ่มเวลาในการตอบสนองที่ซับซ้อนกว่านั้นก็ได้ สำหรับเวลาในการตอบสนอง ให้เลือกเวลาในการตอบสนองที่คุณเห็นว่าสมเหตุสมผล หากไม่แน่ใจ ให้เลือก 200 มิลลิวินาที
11. ขั้นตอนถัดไป
คุณทำทุกอย่างเสร็จแล้ว แล้วอะไรที่ยังขาดหายไป
ข้อควรพิจารณา
สนุกไปกับ Gemini
คุณใช้ Gemini ได้ 2 รูปแบบ ดังนี้
- Vertex AI "วิธีขององค์กร" ที่เชื่อมโยงกับ GCP ซึ่งเราได้พูดถึงในบทที่ 7 (GCF+Gemini) การตรวจสอบสิทธิ์ทั้งหมดจะทำงานได้อย่างราบรื่น และบริการต่างๆ จะเชื่อมต่อกันได้อย่างสวยงาม
- AI ของ Google "วิถีผู้บริโภค" คุณรับคีย์ Gemini API ได้จากที่นี่และเริ่มสร้างสคริปต์เล็กๆ ที่เชื่อมโยงกับภาระงานที่คุณมีอยู่แล้ว (งานที่เป็นกรรมสิทธิ์ คลาวด์อื่นๆ โลคัลโฮสต์ ฯลฯ) เพียงแทนที่คีย์ API ของคุณ แล้วโค้ดจะเริ่มทำงานอย่างมหัศจรรย์
เราขอแนะนำให้คุณลองสำรวจ (2) ด้วยโปรเจ็กต์ส่วนตัวของคุณเอง
การยกระดับ UI
ฉันไม่เก่งเรื่อง 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 ที่ช่วยเขียนและทดสอบโซลูชัน
