เวิร์กช็อปการโมดิฟายแอป

1. บทนำ

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

เราจะปรับแอปพลิเคชัน PHP เก่าให้ทันสมัยใน Google Cloud ได้อย่างไร

(📽️ ดูวิดีโอแนะนำความยาว 7 นาที เกี่ยวกับโค้ดแล็บนี้)

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

ในเวิร์กช็อปนี้ คุณจะได้ทําสิ่งต่อไปนี้

  1. สร้างคอนเทนเนอร์แอปพลิเคชัน PHP
  2. เปลี่ยนไปใช้บริการฐานข้อมูลที่มีการจัดการ ( Cloud SQL)
  3. ทำให้ใช้งานได้กับ Cloud Run (เป็นทางเลือกแบบไม่ต้องดำเนินการใดๆ กับ GKE/Kubernetes)
  4. รักษาความปลอดภัยแอปพลิเคชันด้วย Identity and Access Management (IAM) และ Secret Manager
  5. กำหนดไปป์ไลน์ CI/CD ผ่าน Cloud Build Cloud Build สามารถเชื่อมต่อกับที่เก็บ Git ที่โฮสต์โดยผู้ให้บริการ Git ยอดนิยม เช่น GitHub หรือ GitLab และทริกเกอร์เมื่อมีการพุชไปยังเมนได้ เป็นต้น
  6. โฮสต์รูปภาพแอปพลิเคชันใน Cloud Storage ซึ่งทำได้ผ่านการต่อเชื่อม และไม่จำเป็นต้องใช้โค้ดเพื่อเปลี่ยนแอป
  7. เปิดตัวฟังก์ชันการทำงานของ Gen AI ผ่าน Gemini ซึ่งจัดการผ่าน Cloud Functions (แบบไม่ใช้เซิร์ฟเวอร์)
  8. ทำความคุ้นเคยกับ SLOs และการดําเนินการแอปที่รีเฟรชใหม่

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

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

เกี่ยวกับแอป

แอปพลิเคชัน ( โค้ดภายใต้ใบอนุญาต MIT) ที่คุณแยกคือแอปพลิเคชัน PHP 5.7 พื้นฐานที่มีการตรวจสอบสิทธิ์ MySQL แนวคิดหลักของแอปนี้คือการสร้างแพลตฟอร์มที่ผู้ใช้อัปโหลดรูปภาพได้ และผู้ดูแลระบบสามารถติดแท็กรูปภาพที่ไม่เหมาะสมได้ แอปพลิเคชันมี 2 ตาราง ได้แก่

  • ผู้ใช้ มาพร้อมกับผู้ดูแลระบบที่คอมไพล์ไว้ล่วงหน้า ผู้ใช้ใหม่จะลงทะเบียนได้
  • รูปภาพ มีภาพตัวอย่าง 2-3 ภาพ ผู้ใช้ที่เข้าสู่ระบบจะอัปโหลดรูปภาพใหม่ได้ เราจะเพิ่มข้อมูลบางอย่างที่นี่

เป้าหมายของคุณ

เราต้องการปรับปรุงแอปพลิเคชันเก่าให้ทันสมัยเพื่อใช้ใน Google Cloud เราจะใช้ประโยชน์จากเครื่องมือและบริการต่างๆ เพื่อปรับปรุงความสามารถในการปรับขนาด เพิ่มความปลอดภัย จัดการโครงสร้างพื้นฐานแบบอัตโนมัติ และผสานรวมฟีเจอร์ขั้นสูง เช่น การจัดการรูปภาพ การตรวจสอบ และพื้นที่เก็บข้อมูล โดยใช้บริการต่างๆ เช่น Cloud SQL, Cloud Run, Cloud Build, Secret Manager และอื่นๆ

445f7a9ae37e9b4d.png

และที่สำคัญกว่านั้น เราต้องการอธิบายทีละขั้นตอนเพื่อให้คุณเรียนรู้กระบวนการคิดเบื้องหลังแต่ละขั้นตอน และโดยปกติแล้วแต่ละขั้นตอนจะเปิดโอกาสใหม่ๆ ให้กับขั้นตอนถัดไป (เช่น โมดูลที่ 2 -> 3 และ 6 -> 7)

หากยังไม่แน่ใจ ดูวิดีโอความยาว 7 นาทีนี้บน YouTube

สิ่งที่ต้องมี

  • คอมพิวเตอร์ที่มีเบราว์เซอร์ที่เชื่อมต่ออินเทอร์เน็ต
  • เครดิต GCP บางรายการ โปรดสอบถามผู้ชื่นชอบ Google ในพื้นที่ ;)
  • คำสั่ง gcloud ทำงานได้
  • หากทํางานในเครื่อง ให้ดาวน์โหลดที่นี่ คุณจะต้องมีเครื่องมือแก้ไขที่ดีด้วย (เช่น vscode หรือ intellij)
  • หากต้องการทําทุกอย่าง "ในระบบคลาวด์" จากนั้นคุณจะใช้ Cloud Shell ได้
  • ผู้ใช้ GitHub คุณต้องใช้คำสั่งนี้เพื่อแยกสาขาโค้ดต้นฉบับ 🧑🏻‍💻 gdgpescara/app-mod-workshop กับที่เก็บ Git ของคุณเอง ซึ่งจำเป็นต้องมีเพื่อใช้ไปป์ไลน์ CI/CD ของคุณเอง (การคอมมิตอัตโนมัติ -> บิลด์ -> ติดตั้งใช้งาน)

ดูตัวอย่างโซลูชันได้ที่นี่

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

2. การตั้งค่าเครดิตและการแยก

6dafc658860c0ce5.png

แลกรับเครดิต GCP และตั้งค่าสภาพแวดล้อม GCP [ไม่บังคับ]

หากต้องการเข้าร่วมเวิร์กช็อปนี้ คุณต้องมีบัญชีการเรียกเก็บเงินที่มีเครดิตบ้าง หากมีการเรียกเก็บเงินของคุณเองอยู่แล้ว ให้ข้ามขั้นตอนนี้

สร้างบัญชี Google Gmail ใหม่ (*) เพื่อลิงก์กับเครดิต GCP สอบถามลิงก์สำหรับแลกรับเครดิต GCP หรือใช้เครดิตที่นี่ bit.ly/PHP-Amarcord-credits

ลงชื่อเข้าใช้ด้วยบัญชีที่สร้างใหม่ แล้วทำตามวิธีการ

ff739240dbd84a30.png

(

) Why do I need a brand new gmail account?*

เราพบว่าผู้ใช้ทำ Codelab ไม่สำเร็จเนื่องจากบัญชี (โดยเฉพาะอีเมลงานหรืออีเมลนักเรียน) เคยมีการใช้งาน GCP มาก่อน และมีนโยบายขององค์กร ที่จำกัดไม่ให้ผู้ใช้ทำ Codelab เราขอแนะนำให้สร้างบัญชี Gmail ใหม่หรือใช้บัญชี Gmail ที่มีอยู่ (gmail.com) ที่ไม่ได้ใช้ GCP มาก่อน

คลิกปุ่มเพื่อแลกสิทธิ์

331658dc50213403.png

กรอกแบบฟอร์มต่อไปนี้พร้อมชื่อและนามสกุล แล้วยอมรับข้อกำหนดและเงื่อนไข

คุณอาจต้องรอ 2-3 วินาทีก่อนที่บัญชีการเรียกเก็บเงินจะปรากฏที่นี่ https://console.cloud.google.com/billing

เมื่อเสร็จแล้ว ให้เปิดคอนโซล Google Cloud และสร้างโปรเจ็กต์ใหม่โดยคลิกตัวเลือกโปรเจ็กต์ที่เมนูแบบเลื่อนลงด้านซ้ายบนซึ่งแสดง "ไม่มีองค์กร" ดูด้านล่าง

bd7548f78689db0b.png

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

6c82aebcb9f5cd47.png

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

f202527d254893fb.png

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

7d732d7bf0deb12e.png

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

ไม่ได้เลือก (ไม่ดี):

c2ffd36a781b276a.png

เลือก (ดี):

594563c158f4f590.png

แยกแอปจาก GitHub

  1. ไปที่แอปเดโม: https://github.com/gdgpescara/app-mod-workshop
  2. คลิก🍴ส้อม
  3. หากไม่มีบัญชี คุณต้องสร้างบัญชีใหม่
  4. แก้ไขสิ่งต่างๆ ได้ตามต้องการ

734e51bfc29ee5df.png

  1. โคลนโค้ดแอปโดยใช้
  2. git clone https://github.com/YOUR-GITHUB-USER/YOUR-REPO-NAME
  1. เปิดโฟลเดอร์โปรเจ็กต์ที่โคลนด้วยเครื่องมือแก้ไขที่ต้องการ หากเลือก Cloud Shell ให้คลิก "เปิดเครื่องมือแก้ไข" ดังที่แสดงด้านล่าง

40f5977ea4c1d1cb.png

คุณมีทุกอย่างที่จำเป็นใน Google Cloud Shell Editor ดังที่แสดงในรูปภาพต่อไปนี้

a4e5ffb3e9a35e84.png

ซึ่งทำได้โดยคลิก "เปิดโฟลเดอร์" แล้วเลือกโฟลเดอร์ อาจเป็น app-mod-workshop ในโฟลเดอร์หน้าแรก

3. โมดูลที่ 1: สร้างอินสแตนซ์ SQL

645902e511a432a6.png

สร้างอินสแตนซ์ Google Cloud SQL

แอป PHP จะเชื่อมต่อกับฐานข้อมูล MySQL เราจึงต้องจำลองข้อมูลไปยัง Google Cloud เพื่อให้การย้ายข้อมูลเป็นไปอย่างราบรื่น Cloud SQL เหมาะอย่างยิ่งเนื่องจากช่วยให้คุณเรียกใช้ฐานข้อมูล MySQL ที่มีการจัดการครบวงจรในระบบคลาวด์ได้ ขั้นตอนมีดังนี้

  1. ไปที่หน้า Cloud SQL: https://console.cloud.google.com/sql/instances
  2. คลิก "สร้างอินสแตนซ์"
  3. เปิดใช้ API (หากจำเป็น) การดำเนินการนี้อาจใช้เวลาสักครู่
  4. เลือก MySQL
  5. (เราพยายามหาเวอร์ชันที่ถูกที่สุดให้คุณเพื่อให้ใช้งานได้นานขึ้น)
  • รุ่น: Enterprise
  • ที่กำหนดล่วงหน้า: การพัฒนา (เราลองใช้แซนด์บ็อกซ์แล้ว แต่ใช้ไม่ได้)
  • Mysql Ver: 5.7 (ว้าว นึกถึงอดีตเลย)
  1. รหัสอินสแตนซ์: เลือก appmod-phpapp (หากเปลี่ยนรหัสนี้ อย่าลืมเปลี่ยนสคริปต์และโซลูชันในอนาคตด้วย)
  2. รหัสผ่าน: อะไรก็ได้ แต่ให้จดไว้เป็น CLOUDSQL_INSTANCE_PASSWORD
  3. ภูมิภาค: ใช้ค่าเดียวกับที่คุณเลือกไว้สำหรับส่วนที่เหลือของแอป (เช่น มิลาน = europe-west8)
  4. ความพร้อมระดับโซน: โซนเดียว (เราประหยัดเงินไว้สำหรับเวอร์ชันเดโม)

คลิกปุ่ม "สร้างอินสแตนซ์" เพื่อทำให้ฐานข้อมูล Cloud SQL ใช้งานได้ ⌛การดำเนินการจะใช้เวลาประมาณ 10 นาทีจึงจะเสร็จสมบูรณ์⌛ ในระหว่างนี้ โปรดอ่านเอกสารประกอบต่อ หรือจะเริ่มต้นแก้ปัญหาในโมดูลถัดไป ("จัดคอนเทนเนอร์แอป PHP") ก็ได้ เนื่องจากโมดูลนี้ไม่ได้ขึ้นอยู่กับโมดูลแรก (จนกว่าคุณจะแก้ไขการเชื่อมต่อฐานข้อมูล)

หมายเหตุ อินสแตนซ์นี้ควรมีค่าใช้จ่ายประมาณ 7$/วัน อย่าลืมนำไปใช้หลังจากเวิร์กช็อป

สร้างฐานข้อมูล image_catalog และผู้ใช้ใน Cloud SQL

โปรเจ็กต์แอปมาพร้อมกับโฟลเดอร์ db/ ที่มีไฟล์ SQL 2 ไฟล์ ดังนี้

  1. 01_schema.sql : มีโค้ด SQL เพื่อสร้างตาราง 2 ตารางที่มีข้อมูลผู้ใช้และรูปภาพ
  2. 02_seed.sql: มีโค้ด SQL เพื่อสร้างข้อมูลในตารางที่สร้างไว้ก่อนหน้านี้

ระบบจะใช้ไฟล์เหล่านี้ในภายหลังเมื่อสร้างฐานข้อมูล image_catalog ซึ่งทำได้โดยทำตามขั้นตอนต่อไปนี้

  1. เปิดอินสแตนซ์แล้วคลิกแท็บฐานข้อมูล
  2. คลิก "สร้างฐานข้อมูล"
  3. ตั้งชื่อว่า image_catalog (เช่น ในการกำหนดค่าแอป PHP)

997ef853e5ebd857.png

จากนั้นสร้างผู้ใช้ฐานข้อมูล ซึ่งช่วยให้เราตรวจสอบสิทธิ์เข้าสู่ฐานข้อมูล image_catalog ได้

  1. ตอนนี้คลิกแท็บผู้ใช้
  2. คลิก "เพิ่มบัญชีผู้ใช้"
  3. ผู้ใช้: มาสร้างกัน
  • ชื่อผู้ใช้: appmod-phpapp-user
  • รหัสผ่าน: เลือกรหัสผ่านที่จำได้ หรือคลิก "สร้าง"
  • เลือก "อนุญาตทุกโฮสต์ (%)" ไว้
  1. คลิก "เพิ่ม"

เปิด DB ให้กับ IP ที่รู้จักกันดี

โปรดทราบว่าฐานข้อมูลทั้งหมดใน Cloud SQL จะเป็น "แบบแยกส่วน" คุณต้องตั้งค่าเครือข่ายอย่างชัดเจนเพื่อให้เข้าถึงได้

  1. คลิกอินสแตนซ์
  2. เปิดเมนู "การเชื่อมต่อ"
  3. คลิกแท็บ "การทํางานร่วมกัน"
  4. คลิกในส่วน "เครือข่ายที่ได้รับอนุญาต" จากนั้นเพิ่มเครือข่าย (เช่น ซับเน็ต)
  • ในระหว่างนี้ ให้เลือกการตั้งค่าที่รวดเร็วแต่ไม่ปลอดภัยเพื่อให้แอปทำงานได้ คุณอาจต้องจำกัดการตั้งค่านี้ในภายหลังให้เข้าถึงได้เฉพาะ IP ที่คุณเชื่อถือเท่านั้น
  • ชื่อ: "Everyone in the world - INSECURE"
  • เครือข่าย: "0.0.0.0/0" (หมายเหตุ: นี่เป็นส่วนที่ไม่ปลอดภัย)
  • คลิก "เสร็จสิ้น"
  1. คลิกบันทึก

คุณควรเห็นข้อมูลในลักษณะนี้

5ccb9062a7071964.png

หมายเหตุ โซลูชันนี้เป็นวิธีประนีประนอมที่ดีในการทำให้เวิร์กช็อปเสร็จสิ้นใน O(hours) อย่างไรก็ตาม โปรดอ่านเอกสารความปลอดภัยเพื่อช่วยรักษาความปลอดภัยให้กับโซลูชันสำหรับเวอร์ชันที่ใช้งานจริง

ถึงเวลาทดสอบการเชื่อมต่อ DB แล้ว

มาดูกันว่าผู้ใช้ image_catalog ที่เราสร้างไว้ก่อนหน้านี้ใช้งานได้ไหม

เข้าถึง "Cloud SQL Studio" ภายในอินสแตนซ์ แล้วป้อนฐานข้อมูล ผู้ใช้ และรหัสผ่านเพื่อตรวจสอบสิทธิ์ดังที่แสดงด้านล่าง

d56765c6154c11a4.png

เมื่อเข้าสู่ส่วนนี้แล้ว คุณสามารถเปิดเครื่องมือแก้ไข SQL และไปยังส่วนถัดไปได้

นําเข้าฐานข้อมูลจากโค้ดเบส

ใช้เครื่องมือแก้ไข SQL เพื่อนําเข้าตาราง image_catalog พร้อมข้อมูล คัดลอกโค้ด SQL จากไฟล์ในรีโป ( 01_schema.sql แล้วตามด้วย 02_seed.sql) แล้วเรียกใช้ทีละรายการตามลำดับ

หลังจากนี้ คุณควรเห็นตาราง 2 ตารางใน image_catalog ซึ่งได้แก่ users และ images ดังที่แสดงด้านล่าง

65ba01e4c6c2dac0.png

คุณสามารถทดสอบได้โดยเรียกใช้ select * from images; ในเครื่องมือแก้ไข

นอกจากนี้ อย่าลืมจดที่อยู่ IP สาธารณะของอินสแตนซ์ Cloud SQL ไว้ด้วย เนื่องจากคุณจะต้องใช้ในภายหลัง หากต้องการดู IP ให้ไปที่หน้าหลักของอินสแตนซ์ Cloud SQL ในส่วนหน้าภาพรวม (ภาพรวม > เชื่อมต่อกับอินสแตนซ์นี้ > ที่อยู่ IP สาธารณะ)

4. โมดูลที่ 2: บรรจุแอป PHP ลงในคอนเทนเนอร์

e7f0e9979d8805f5.png

เราต้องการสร้างแอปนี้สำหรับระบบคลาวด์

ซึ่งหมายถึงการแพ็กโค้ดเป็นไฟล์ ZIP บางประเภทซึ่งมีข้อมูลทั้งหมดที่จะเรียกใช้ในระบบคลาวด์

แพ็กเกจมีด้วยกัน 2-3 วิธีดังนี้

  • Docker ได้รับความนิยมอย่างมาก แต่การตั้งค่าให้ถูกต้องค่อนข้างซับซ้อน
  • Buildpack ไม่ค่อยได้รับความนิยม แต่มักจะ "เดาอัตโนมัติ" ว่าควรสร้างและเรียกใช้อะไร บ่อยครั้งก็แค่ใช้งานได้เลย

ในบริบทของเวิร์กช็อปนี้ เราจะสมมติว่าคุณใช้ Docker

หากเลือกใช้ Cloud Shell ขณะนี้เป็นเวลาที่ควรเปิด Cloud Shell อีกครั้ง (คลิกที่ด้านขวาบนของคอนโซลระบบคลาวด์)

ec6a6b90b39e03e.png

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

6999b906c0dedeb7.png

Docker

หากต้องการควบคุม โซลูชันนี้เหมาะกับคุณ ซึ่งจะมีประโยชน์เมื่อคุณต้องกำหนดค่าไลบรารีที่เฉพาะเจาะจง และแทรกลักษณะการทำงานบางอย่างที่ไม่ชัดเจน (chmod ในการอัปโหลด ไฟล์ปฏิบัติการที่ไม่ใช่มาตรฐานในแอป ฯลฯ)

เนื่องจากเราต้องการทำให้แอปพลิเคชันที่ใช้คอนเทนเนอร์ใช้งานได้ใน Cloud Run ในท้ายที่สุด โปรดดูเอกสารประกอบต่อไปนี้ คุณจะพอร์ตจาก PHP 8 กลับไปเป็น PHP 5.7 ได้อย่างไร คุณอาจใช้ Gemini กับปัญหานี้ได้ หรือจะใช้เวอร์ชันที่คอมไพล์ไว้ล่วงหน้านี้ก็ได้

fbd8c2ace2faa70b.png

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

bd27071bf450a8d0.png

  • 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 (หรือ "เปลี่ยนพอร์ต" สำหรับพอร์ตอื่น)

33a24673f4550454.png

การทดสอบผลลัพธ์ในเบราว์เซอร์

ตอนนี้แอปพลิเคชันของคุณควรมีลักษณะดังนี้

2718ece96b1f18b6.png

และหากคุณเข้าสู่ระบบด้วย Admin/admin123 คุณควรเห็นข้อมูลต่อไปนี้

68b62048c2e86aea.png

เยี่ยมไปเลย ใช้งานได้แล้ว ยกเว้นข้อความภาษาอิตาลี 🎉🎉🎉

หากการบรรจุลงในคอนเทนเนอร์ถูกต้องแต่ข้อมูลเข้าสู่ระบบของ DB ไม่ถูกต้อง คุณอาจเห็นข้อความประมาณนี้

e22f45b79bab86e1.png

ลองอีกครั้ง คุณใกล้จะถึงแล้ว

การบันทึกไปยัง Artifact Registry [ไม่บังคับ]

ตอนนี้คุณควรมีแอปพลิเคชัน PHP ในคอนเทนเนอร์ที่ใช้งานได้พร้อมที่จะนำไปใช้งานในระบบคลาวด์แล้ว ถัดไป เราต้องมีพื้นที่ในระบบคลาวด์สำหรับจัดเก็บอิมเมจ Docker และทำให้เข้าถึงได้เพื่อนำไปใช้งานในบริการ Google Cloud เช่น Cloud Run โซลูชันพื้นที่เก็บข้อมูลนี้เรียกว่า Artifact Registry ซึ่งเป็นบริการ Google Cloud ที่มีการจัดการอย่างเต็มรูปแบบซึ่งออกแบบมาเพื่อจัดเก็บอาร์ติแฟกต์แอปพลิเคชัน ซึ่งรวมถึงอิมเมจคอนเทนเนอร์ Docker, แพ็กเกจ Maven, โมดูล npm และอื่นๆ

มาสร้างที่เก็บถาวรใน Google Cloud Artifact Registry โดยใช้ปุ่มที่เหมาะสมกัน

e1123f0c924022e6.png

เลือกชื่อ รูปแบบ และภูมิภาคที่ถูกต้องซึ่งเหมาะสำหรับจัดเก็บรายการต่างๆ

4e516ed209c470ee.png

กลับไปที่แท็กสภาพแวดล้อมการพัฒนาในเครื่อง แล้วพุชอิมเมจคอนเทนเนอร์ของแอปไปยังที่เก็บ Artifact Registry ที่เพิ่งสร้างขึ้น โดยให้ทำตามคำสั่งต่อไปนี้

  • docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • docker push TARGET_IMAGE[:TAG]

ผลลัพธ์ควรมีลักษณะดังภาพหน้าจอต่อไปนี้

1e498feb4e88be9f.png

เยี่ยมไปเลย 🎉🎉🎉 คุณก็เลื่อนระดับไปอีกขั้นได้ ในระหว่างนี้ ให้ลองใช้เวลา 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

9ffca42774f6c5d1.png

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

  1. ชื่อบริการ Cloud Run ที่ต้องการทำให้ใช้งานได้สําหรับแอป บริการ Cloud Run จะแสดง URL ที่ระบุปลายทางสําหรับแอป
  2. ภูมิภาค Google Cloud ที่แอปจะทํางาน (--region ภูมิภาค)
  3. อิมเมจคอนเทนเนอร์ที่รวมแอปของคุณ
  4. ตัวแปรสภาพแวดล้อมที่แอปของคุณต้องใช้ในระหว่างการดำเนินการ
  5. Flag Allow-Unauthenticated ที่อนุญาตให้ทุกคนเข้าถึงแอปของคุณได้โดยไม่ต้องมีการตรวจสอบสิทธิ์เพิ่มเติม

โปรดดูวิธีใช้ตัวเลือกนี้กับบรรทัดคำสั่งในเอกสารประกอบ (หรือเลื่อนลงเพื่อดูวิธีแก้ปัญหาที่เป็นไปได้)

การทำให้ใช้งานได้จะใช้เวลา 2-3 นาที หากทุกอย่างถูกต้อง คุณควรเห็นข้อมูลประมาณนี้ในคอนโซล Google Cloud

ef1029fb62f8de81.png

f7191d579c21ca3e.png

คลิก URL ที่ Cloud Run ระบุและทดสอบแอปพลิเคชัน เมื่อตรวจสอบสิทธิ์แล้ว คุณควรเห็นข้อมูลประมาณนี้

d571a90cd5a373f9.png

"gcloud run deploy" ที่ไม่มีอาร์กิวเมนต์

คุณอาจสังเกตเห็นว่า gcloud run deploy ถามคำถามที่ถูกต้องและเติมข้อมูลในช่องว่างที่คุณเว้นไว้ ยอดเยี่ยมไปเลย

อย่างไรก็ตาม ในบางโมดูล เราจะเพิ่มคําสั่งนี้ลงในทริกเกอร์ Cloud Build จึงใช้คําถามแบบอินเทอร์แอกทีฟไม่ได้ เราต้องกรอกทุกตัวเลือกในคำสั่ง คุณจึงต้องการคราฟ gcloud run deploy --option1 blah --foo bar --region your-fav-region สีทอง คุณจะใช้วิธีใด

  1. ทำซ้ำขั้นตอนที่ 2-3-4 จนกว่า gcloud จะหยุดถามคำถาม
  2. [LOOP] gcloud run deploy พร้อมตัวเลือกที่พบจนถึงตอนนี้
  3. [LOOP] systems ask for option X
  4. [LOOP] ค้นหาในเอกสารสาธารณะเกี่ยวกับวิธีตั้งค่า X จาก CLI โดยเพิ่มตัวเลือก --my-option [my-value]
  5. กลับไปที่ขั้นตอนที่ 2 เว้นแต่ gcloud จะดำเนินการเสร็จสมบูรณ์โดยไม่มีคำถามเพิ่มเติม
  6. gcloud run deploy BLAH BLAH BLAH นี้เจ๋งสุดๆ บันทึกคำสั่งไว้ เนื่องจากจะต้องใช้ในขั้นตอน Cloud Build ในภายหลัง

โปรดดูวิธีแก้ปัญหาที่เป็นไปได้ที่นี่ ดูเอกสารได้ที่นี่

เยี่ยมไปเลย 🎉🎉🎉 คุณได้ติดตั้งใช้งานแอปใน Google Cloud เรียบร้อยแล้ว ซึ่งเป็นขั้นตอนแรกในการทำให้ทันสมัย

6. โมดูล 4: ล้างรหัสผ่านด้วย Secret Manager

95cd57b03b4e3c73.png

ในขั้นตอนก่อนหน้า เราได้ทำให้แอปใช้งานได้ใน 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

ตอนนี้คุณก็บรรลุเป้าหมายต่อไปนี้แล้ว

  1. แอปจะอ่านตัวแปรแบบไดนามิกจาก ENV
  2. คุณเพิ่มความปลอดภัยแล้วเนื่องจากนำรหัสผ่าน DB ออกจากโค้ดแล้ว)

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

  • ไปที่ https://console.cloud.google.com/run
  • คลิกที่แอป
  • คลิก "แก้ไขและทำให้การแก้ไขใหม่ใช้งานได้"
  • ในแท็บแรก "คอนเทนเนอร์" ให้คลิกแท็บด้านล่าง "ตัวแปรและข้อมูลลับ"
  • คลิก "+ เพิ่มตัวแปร" แล้วเพิ่มตัวแปรที่จําเป็นทั้งหมด ผลลัพธ์ที่ได้ควรมีลักษณะดังนี้

7a5fbfa448544d3.png

f2780c35585388ca.png

แบบนี้ถูกต้องไหม ไม่ได้ ผู้ให้บริการส่วนใหญ่จะยังคงเห็นบัตรของคุณ ปัญหานี้อาจลดลงเมื่อมีการใช้ Secret Manager ของ Google Cloud

รุ่นที่ 2: ตัวจัดการข้อมูลลับ

รหัสผ่านหายไปจากรหัสของคุณเอง แสดงว่าคุณชนะแล้ว แต่เดี๋ยวก่อน ปัญหาได้รับการแก้ไขแล้วใช่ไหม

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

เครื่องมือจัดการข้อมูลลับของ Google Cloud เป็นบริการที่ปลอดภัยและรวมศูนย์สำหรับจัดการข้อมูลที่ละเอียดอ่อน เช่น คีย์ API, รหัสผ่าน, ใบรับรอง และข้อมูลลับอื่นๆ

ซึ่งช่วยให้คุณจัดเก็บ จัดการ และเข้าถึงข้อมูลลับได้ด้วยสิทธิ์แบบละเอียดและการเข้ารหัสที่มีประสิทธิภาพ ผู้จัดการข้อมูลลับผสานรวมกับ Identity and Access Management (IAM) ของ Google Cloud ซึ่งช่วยให้คุณควบคุมผู้ที่มีสิทธิ์เข้าถึงข้อมูลลับที่เฉพาะเจาะจงได้ เพื่อรักษาความปลอดภัยของข้อมูลและการปฏิบัติตามข้อกำหนด

นอกจากนี้ยังรองรับการเปลี่ยนความลับและการจัดเวอร์ชันอัตโนมัติ ซึ่งทำให้การจัดการวงจรของข้อมูลลับง่ายขึ้นและช่วยเพิ่มความปลอดภัยในแอปพลิเคชันต่างๆ ในบริการของ Google Cloud

หากต้องการเข้าถึงเครื่องมือจัดการข้อมูลลับ ให้ไปที่เมนูแฮมเบอร์เกอร์เพื่อไปยังบริการความปลอดภัย แล้วค้นหาในส่วนการคุ้มครองข้อมูลตามที่แสดงในภาพหน้าจอด้านล่าง

6df83a1c3cb757f6.png

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

a96c312e2c098db1.png

  • ตอนนี้คลิก "สร้างข้อมูลลับ":
  • ชื่อ: 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" เดียวกันสำหรับข้อมูลลับที่อ้างอิงและใช้เวอร์ชันล่าสุด

9ed4e35be7654dcb.png

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

da0ccd7af39b04ed.png

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

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

e89f9ca780169b6b.png

เคล็ดลับ: คอนโซลของนักพัฒนาแอป (UI) ชี้ให้เห็นปัญหาเกี่ยวกับสิทธิ์ได้ดีมาก โปรดสละเวลาเพื่อไปยังลิงก์ทั้งหมดสำหรับเอนทิตีในระบบคลาวด์

7. โมดูลที่ 5: ตั้งค่า CI/CD ด้วย Cloud Build

ba49b033c11be94c.png

เหตุผลที่ควรใช้ไปป์ไลน์ CI/CD

ตอนนี้คุณควรพิมพ์ gcloud run deploy ไปแล้ว 2-3 ครั้ง ซึ่งอาจเป็นการตอบคำถามเดิมซ้ำๆ

หากเบื่อหน่ายกับการติดตั้งใช้งานแอปด้วยตนเองด้วย gcloud run deploy คงจะดีไม่น้อยหากแอปของคุณสามารถทําให้การเผยแพร่เป็นไปโดยอัตโนมัติทุกครั้งที่คุณพุชการเปลี่ยนแปลงใหม่ไปยังที่เก็บ Git

หากต้องการใช้ไปป์ไลน์ CI/CD คุณจะต้องมี 2 อย่างต่อไปนี้

  1. ที่เก็บ Git ส่วนตัว: คุณควรแยกที่เก็บเวิร์กช็อปไปยังบัญชี GitHub ของคุณแล้วในขั้นตอนที่ 2 หากไม่ ให้กลับไปทำขั้นตอนนั้นให้เสร็จสมบูรณ์ ที่เก็บที่แยกควรมีลักษณะดังนี้ https://github.com/<YOUR_GITHUB_USER>/app-mod-workshop
  2. Cloud Build บริการที่ยอดเยี่ยมและราคาถูกนี้ช่วยให้คุณกำหนดค่าการทำงานอัตโนมัติของบิลด์ได้เกือบทุกอย่าง เช่น Terraform, แอปที่ทำงานใน Docker ฯลฯ

ส่วนนี้จะเน้นที่การตั้งค่า Cloud Build

เข้าสู่ Cloud Build

เราจะใช้ Cloud Build เพื่อทำดังนี้

  • บิลด์แหล่งที่มา (ด้วย Dockerfile) โปรดคิดว่าไฟล์นี้เป็น "ไฟล์ .zip ขนาดใหญ่" ที่มีทุกอย่างที่จำเป็นต่อการสร้างและเรียกใช้ ("อาร์ติแฟกต์การสร้าง")
  • พุชอาร์ติแฟกต์นี้ไปยัง Artifact Registry (AR)
  • จากนั้นทําการทําให้ใช้งานได้จาก AR ไปยัง Cloud Run สําหรับแอป "php-amarcord"
  • ซึ่งจะสร้างเวอร์ชัน ("การแก้ไข") ใหม่ของแอปที่มีอยู่ (ให้นึกถึงเลเยอร์ที่มีโค้ดใหม่) และเราจะกําหนดค่าแอปเพื่อเปลี่ยนเส้นทางการเข้าชมไปยังเวอร์ชันใหม่หากการพุชสําเร็จ

ตัวอย่างบิลด์บางส่วนสำหรับแอป php-amarcord ของฉันมีดังนี้

f30f42d4571ad5e2.png

เราจะทำสิ่งเหล่านี้ได้อย่างไร

  1. การสร้างไฟล์ YAML ที่สมบูรณ์แบบไฟล์เดียว cloudbuild.yaml
  2. การสร้างทริกเกอร์ Cloud Build
  3. โดยเชื่อมต่อกับที่เก็บ 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" แล้วทําตามวิธีการ
  • 23e0e0f1219afea3.pngคลิกเชื่อมต่อ
  • bafd904ec07122d2.png
  • บิงโก เชื่อมต่อที่เก็บแล้ว
  • กลับไปที่ส่วนทริกเกอร์
  • การกำหนดค่า: ตรวจพบโดยอัตโนมัติ (*)
  • ขั้นสูง: เลือกบัญชีบริการ "[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
  • เลือก "ตั้งค่าเป็นบัญชีบริการที่ต้องการ" ด้วย

8715acca72286a46.png

ไฟล์ 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 (บิลด์ในระบบคลาวด์ > "ทริกเกอร์" > เรียกใช้)

97acd16980a144ab.png

โปรดทราบว่าหากใช้โซลูชันนี้ คุณยังคงต้องดําเนินการบางอย่าง เช่น คุณต้องตั้งค่าตัวแปร ENV สําหรับปลายทาง dev/prod ที่สร้างขึ้นใหม่ ดังนี้

3da8723e4ff80c0a.png

โดยสามารถทำได้สองวิธี:

  • ผ่าน UI - โดยการตั้งค่าตัวแปร ENV อีกครั้ง
  • ผ่าน CLI โดยใช้สคริปต์ที่ "สมบูรณ์แบบ" สำหรับคุณ ดูตัวอย่างได้ที่ gcloud-run-deploy.sh คุณต้องปรับแต่งบางอย่าง เช่น ปลายทางและหมายเลขโปรเจ็กต์ ซึ่งดูหมายเลขโปรเจ็กต์ได้ในภาพรวมระบบคลาวด์

ฉันจะคอมมิตโค้ดไปยัง GitHub ได้อย่างไร

การสอนวิธีที่ดีที่สุดในการgit pushไปยัง GitHub อยู่นอกเหนือขอบเขตของเวิร์กช็อปนี้ อย่างไรก็ตาม ในกรณีที่คุณติดขัดและอยู่ใน Cloud Shell คุณมี 2 วิธีในการดำเนินการดังนี้

  1. CLI เพิ่มคีย์ SSH ในเครื่องและเพิ่มรีโมตด้วย git@github.com:YOUR_USER/app-mod-workshop.git (แทนที่จะเป็น http)
  2. VSCode หากใช้เครื่องมือแก้ไข Cloud Shell คุณสามารถใช้แท็บการควบคุมแหล่งที่มา (ctrl-shift-G) คลิก "ซิงค์การเปลี่ยนแปลง" แล้วทําตามวิธีการ คุณควรตรวจสอบสิทธิ์บัญชี GitHub กับ vscode ได้ และดึง/พุชจากตรงนั้นได้อย่างง่ายดาย

f0d53f839c7fa3b6.png

อย่าลืม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

a680e0f287dd2dfb.png

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

dc3a4b8ea92aaef6.png

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

วิธีแก้ไขปัญหานี้มีหลายวิธี

  1. จัดเก็บรูปภาพในฐานข้อมูล เราใช้วิธีนี้กับแอป PHP ก่อนหน้านี้ ซึ่งเป็นวิธีแก้ปัญหาที่ง่ายที่สุดเนื่องจากไม่เพิ่มความซับซ้อน แต่วิธีนี้จะทำให้เวลาในการตอบสนองและภาระงานของ DB เพิ่มขึ้นอย่างแน่นอน
  2. ย้ายข้อมูลแอป Cloud Run ไปยังโซลูชันที่ประหยัดพื้นที่เก็บข้อมูล: GCE + ดิสก์ถาวร อาจเป็น GKE + Storage ใช่ไหม หมายเหตุ: การควบคุมที่มากขึ้นจะทําให้เกิดความยืดหยุ่นน้อยลง
  3. ย้ายไปที่ GCS Google Cloud Storage มีพื้นที่เก็บข้อมูลที่ดีที่สุดสำหรับทั้ง Google Cloud และเป็นโซลูชันที่เหมาะกับระบบคลาวด์มากที่สุด แต่วิธีนี้ทำให้เราต้องยุ่งเกี่ยวกับไลบรารี PHP เรามีไลบรารี PHP 5.7 สำหรับ GCS ไหม PHP 5.7 รองรับ Composer ไหม (ดูเหมือนว่า PHP 5.3.2 เป็นเวอร์ชันต่ำสุดที่ Composer รองรับ)
  4. อาจจะใช้ docker sidecar ไหม
  5. หรืออาจใช้ การต่อเชื่อม Cloud Run Volume ของ GCS ฟังดูดีมาก

🤔 ย้ายข้อมูลพื้นที่เก็บข้อมูล (ปลายเปิด)

[แบบปลายเปิด] ในแบบฝึกหัดนี้ เราต้องการให้คุณหาวิธีย้ายรูปภาพในลักษณะที่คงอยู่

การทดสอบการยอมรับ

เราไม่ได้ต้องการบอกวิธีแก้ปัญหาให้คุณทราบ แต่เราต้องการให้คุณดำเนินการดังนี้

  1. คุณอัปโหลด newpic.jpg คุณจะเห็นข้อมูลนี้ในแอป
  2. คุณอัปเกรดแอปเป็นเวอร์ชันใหม่
  3. newpic.jpg ยังคงแสดงอยู่

💡 แนวทางแก้ปัญหาที่เป็นไปได้ (การต่อเชื่อมวอลุ่ม Cloud Run ของ GCS)

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

ซึ่งจะช่วยให้คุณมาสก์โฟลเดอร์จาก Cloud Run ไปยัง GCS ได้ ดังนี้

  1. การอัปโหลดทั้งหมดไปยัง GCS จะปรากฏในแอปของคุณ
  2. การอัปโหลดทั้งหมดไปยังแอปของคุณจะอัปโหลดไปยัง GCS
  3. ความมหัศจรรย์จะเกิดขึ้นกับออบเจ็กต์ที่อัปโหลดใน 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 ได้ด้วย

  1. ในแท็บ "วอลุ่ม" ให้สร้างการต่อเชื่อมวอลุ่มที่ชี้ไปยังที่เก็บข้อมูลประเภท "ที่เก็บข้อมูล Cloud Storage" เช่น ใช้ชื่อ "php_uploads"
  2. ในส่วนคอนเทนเนอร์ > การต่อเชื่อมวอลุ่ม ให้ต่อเชื่อมวอลุ่มที่คุณเพิ่งสร้างขึ้นในจุดวอลุ่มที่แอปขอ โดยการดำเนินการนี้ขึ้นอยู่กับไฟล์ Dockerfile แต่อาจมีลักษณะดังนี้ var/www/html/uploads/

ไม่ว่าจะด้วยวิธีใด หากการแก้ไขใช้งานได้ การแก้ไขการแก้ไข Cloud Run ใหม่ควรแสดงข้อมูลต่อไปนี้

6c2bb98fc1b0e077.png

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

รูปภาพควรทำงานได้อย่างราบรื่นใน GCS โดยไม่ต้องเขียน PHP แม้แต่บรรทัดเดียว

70032b216afee2d7.png

เกิดอะไรขึ้น

เกิดสิ่งมหัศจรรย์ขึ้น

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

  • หากต้องการส่งอีเมลทุกครั้งที่มีรูปภาพ "อันตราย" หรือ "ภาพเปลือย" เข้ามา ซึ่งคุณทําได้โดยไม่ต้องแตะโค้ด PHP
  • หากต้องการใช้โมเดลมัลติโมดัลของ Gemini ทุกครั้งที่มีรูปภาพเข้ามาเพื่ออธิบายรูปภาพนั้น และอัปโหลด DB พร้อมคำอธิบาย ซึ่งคุณทําได้โดยไม่ต้องแตะโค้ด PHP คุณไม่เชื่อฉันใช่ไหม อ่านต่อในบทที่ 7

เราเพิ่งเปิดโอกาสใหม่ๆ มากมาย

9. โมดูลที่ 7: เพิ่มประสิทธิภาพแอปด้วย Google Gemini

c00425f0ad83b32c.png

ตอนนี้คุณมีแอป 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 ที่มุ่งมั่นมาก

  1. เมื่อสร้างรูปภาพใหม่ใน GCS (อาจเป็นเพราะมีคนอัปโหลดลงในแอป แต่ไม่ใช่แค่นั้น)
  2. .. 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)
  3. .. และอัปเดต DB ด้วยคําอธิบายนี้ (ซึ่งอาจต้องมีการแก้ไขข้อบกพร่องของฐานข้อมูลเพื่อเพิ่มคอลัมน์ description ลงในตาราง images)

แพตช์ DB เพื่อเพิ่ม description ลงในรูปภาพ

  1. เปิด Cloud SQL Studio โดยทำดังนี้

b92b07c4cba658ef.png

  1. ป้อนชื่อผู้ใช้และรหัสผ่านสําหรับฐานข้อมูลรูปภาพ
  2. แทรก SQL นี้ซึ่งจะเพิ่มคอลัมน์สําหรับคําอธิบายรูปภาพ

ALTER TABLE images ADD COLUMN description TEXT;

3691aced78a6389.png

และ bingo ลองตรวจสอบว่าได้ผลหรือไม่

SELECT * FROM images;

คุณควรเห็นคอลัมน์คำอธิบายใหม่ดังนี้

bed69d6ad0263114.png

เขียน f(x) ของ Gemini

หมายเหตุ ฟังก์ชันนี้สร้างขึ้นด้วยความช่วยเหลือจากฟีเจอร์ช่วยเขียนโค้ดของ Gemini

หมายเหตุ การสร้างฟังก์ชันนี้อาจทำให้เกิดข้อผิดพลาดเกี่ยวกับสิทธิ์ IAM บางส่วนจะแสดงอยู่ในย่อหน้า "ข้อผิดพลาดที่เป็นไปได้" ด้านล่าง

  1. เปิดใช้ API
  2. ไปที่ https://console.cloud.google.com/functions/list
  3. คลิก "สร้างฟังก์ชัน"
  4. เปิดใช้ API จากวิซาร์ด API

d22b82658cfd4c48.png

คุณสร้าง GCF จาก UI หรือจากบรรทัดคำสั่งก็ได้ เราจะใช้บรรทัดคำสั่ง

รหัสที่เป็นไปได้จะอยู่ในส่วน .solutions/

  1. สร้างโฟลเดอร์เพื่อโฮสต์โค้ด เช่น "gcf/" เข้าสู่โฟลเดอร์
  2. วิธีสร้างไฟล์ requirements.txt
google-cloud-storage
google-cloud-aiplatform
pymysql
  1. สร้างฟังก์ชัน 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
  1. พุชฟังก์ชัน คุณใช้สคริปต์ที่คล้ายกับ 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 ด้วย

cf3ded30d532a2c7.png

การทดสอบจากต้นทางถึงปลายทาง

ถึงเวลาทดสอบฟังก์ชันด้วยตนเอง

  1. ไปที่แอปและเข้าสู่ระบบ
  2. อัปโหลดรูปภาพ (อย่ามีขนาดใหญ่เกินไป เนื่องจากเราพบปัญหาเกี่ยวกับรูปภาพขนาดใหญ่)
  3. ตรวจสอบใน UI ว่ารูปภาพอัปโหลดแล้ว
  4. ตรวจสอบใน Cloud SQL Studio ว่าคำอธิบายได้รับการอัปเดตแล้ว เข้าสู่ระบบและเรียกใช้คําค้นหานี้ SELECT * FROM images

43a680b12dbbdda0.png

ซึ่งก็ใช้ได้ผล เราอาจต้องอัปเดตส่วนหน้าเว็บเพื่อแสดงคำอธิบายดังกล่าวด้วย

อัปเดต 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 เวอร์ชันที่แสดงผลอาจมีลักษณะดังนี้

fdc12de0c88c4464.png

สรุป

คุณมี 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 เราจะเพิ่มข้อผิดพลาดเหล่านี้ที่นี่เพื่อแสดงความเห็นอกเห็นใจและเพื่อแนะนำวิธีแก้ไข

ข้อผิดพลาด: มีสิทธิ์ไม่เพียงพอสําหรับบัญชีบริการ

  1. โปรดทราบว่าในการทำให้ฟังก์ชัน GCF ซึ่งคอยฟังที่เก็บข้อมูล GCS ใช้งานได้ คุณต้องตั้งค่าสิทธิ์ที่เหมาะสมให้กับบัญชีบริการที่คุณใช้สำหรับงานดังที่แสดงในภาพต่อไปนี้

22f51012fa6b4a24.png

คุณอาจต้องเปิดใช้ EventArc API ด้วย ซึ่งอาจใช้เวลา 2-3 นาทีจึงจะพร้อมใช้งานอย่างเต็มรูปแบบ

ข้อผิดพลาด: ไม่มีผู้เรียกใช้ Cloud Run

  1. ความคิดเห็นอีกรายการจาก UI สําหรับการให้สิทธิ์ GCF คือ ( บทบาทผู้เรียกใช้ Cloud Run)

be72e17294f2d3f3.png

ข้อผิดพลาดนี้แก้ไขได้ด้วยการเรียกใช้คําสั่งในรูปภาพ ซึ่งคล้ายกับ 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 ปัญหาที่อาจเกิดขึ้นมีดังนี้

bed69d6ad0263114.png

หรือจะแก้ไขสคริปต์การทำให้ใช้งานได้จริงของ Cloud Run เพื่อเพิ่ม MEM/CPU ก็ได้ การดำเนินการนี้จะใช้เวลานานกว่าเล็กน้อย

ข้อผิดพลาด: PubSub เผยแพร่แล้ว

การสร้างทริกเกอร์ด้วย GCF v1 ให้ข้อผิดพลาดนี้ 1 ครั้ง

e5c338ee35ad4c24.png

อีกครั้ง ปัญหานี้แก้ไขได้ง่ายโดยไปที่ 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 ที่จําเป็นทั้งหมดมีดังนี้

  1. https://console.cloud.google.com/vertex-ai
  2. คลิก "เปิดใช้ API ที่แนะนําทั้งหมด"

492f05ac377f3630.png

ข้อผิดพลาด: ไม่พบทริกเกอร์ EventArc

หากได้รับข้อความนี้ โปรดทำให้ฟังก์ชันทํางานอีกครั้ง

8ec4fc11833d7420.png

ข้อผิดพลาด: กําลังจัดสรรตัวแทนบริการ 400 ราย

กําลังจัดสรรตัวแทนบริการ 400 ราย ( https://cloud.google.com/vertex-ai/docs/general/access-control#service-agents ) ต้องใช้ตัวแทนบริการในการอ่านไฟล์ Cloud Storage ที่ระบุ โปรดลองอีกครั้งในอีกสักครู่

หากเป็นเช่นนี้ โปรดรอสักครู่หรือสอบถามเจ้าหน้าที่ของ Google

10. โมดูล 8: สร้าง SLO ความพร้อมใช้งาน

ในบทนี้ เราพยายามบรรลุเป้าหมายต่อไปนี้

  1. การสร้าง SLI
  2. การสร้าง SLO ตาม SLI
  3. การสร้างการแจ้งเตือนตาม SLO

f63426182c052123.png

หัวข้อนี้เป็นหัวข้อที่นักเขียนชื่นชอบมาก เนื่องจาก Riccardo ทํางานด้าน SRE / DevOps ของ Google Cloud

(ไม่จำกัด) สร้าง SLI และ SLO สําหรับแอปนี้

แอปจะดีแค่ไหนหากคุณไม่รู้เลยว่าแอปหยุดทำงานเมื่อใด

SLO คืออะไร

บังเอิญจริงๆ Google เป็นผู้คิดค้น SLO หากต้องการอ่านข้อมูลเพิ่มเติม เราขอแนะนําให้อ่านบทความต่อไปนี้

ขั้นตอนที่ 1: สร้าง SLI/SLO ความพร้อมใช้งาน

มาเริ่มกันที่ SLO ความพร้อมใช้งาน เนื่องจากเป็นสิ่งที่สำคัญที่สุดและวัดได้ง่ายที่สุด

แต่โชคดีที่ Cloud Run มีการสนับสนุน SLO ที่สร้างขึ้นล่วงหน้าอยู่แล้ว เนื่องด้วย Istio

เมื่อแอปของคุณอยู่ใน Cloud Run การดำเนินการนี้ทำได้ง่ายมาก เราใช้เวลาเพียง 30 วินาที

  • ไปที่หน้า Cloud Run
  • คลิก/เลือกแอป
  • เลือกแท็บ SLOs
  • คลิก "+ สร้าง SLO"
  • ความพร้อมจำหน่ายสินค้าตามคำขอ
  • ต่อไป
  • เดือนตามปฏิทิน / 99%
  • คลิก "สร้าง SLO"

e471c7ebdc56cdf6.png

ขั้นตอนที่ 2: ตั้งค่าการแจ้งเตือนเกี่ยวกับ SLO นี้

เราขอแนะนำให้สร้างการแจ้งเตือน 2 รายการ ดังนี้

  1. รายการที่มีอัตราการเผาไหม้ต่ำ ("การเผาไหม้ช้า") เพื่อแจ้งเตือนคุณทางอีเมล (จำลองคำขอแจ้งปัญหาที่มีลําดับความสําคัญต่ำ)
  2. รายการที่มีอัตราการใช้สูง ("Fastburn") เพื่อแจ้งเตือนคุณทาง SMS (จำลองคำขอแจ้งปัญหาที่มีลำดับความสำคัญสูง / เครื่องส่งข้อความ)

ไปที่ SLO tab ของคุณจากก่อนหน้านี้

ทำดังนี้ 2 ครั้ง

314bfd6b9ef0a260.png

  • คลิก "สร้างการแจ้งเตือน 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 แบบดังนี้

  1. Vertex AI "วิธีแบบองค์กร" ซึ่งเชื่อมโยงกับ GCP ของคุณ ซึ่งเราได้พูดถึงในบทที่ 7 (GCF+Gemini) การตรวจสอบสิทธิ์ทั้งหมดทำงานได้อย่างน่าอัศจรรย์ และบริการต่างๆ เชื่อมต่อกันได้อย่างลงตัว
  2. 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 สมบูรณ์แบบ (หมายความว่าฉันไม่ต้องเปลี่ยนแปลงอะไรเลย)

8a3d5fe37ec40bf8.png

และนี่คือเลย์เอาต์ใหม่ในแอปส่วนตัวของผู้เขียน

81620eb90ae3229a.png

หมายเหตุ: โค้ดจะวางเป็นรูปภาพเนื่องจากเราไม่อยากให้คุณใช้โค้ดนี้ แต่ให้ Gemini เขียนโค้ดให้คุณด้วยข้อจำกัด UI/ส่วนหน้าของครีเอทีฟโฆษณาของคุณเอง เชื่อเถอะว่าหลังจากนั้นคุณจะต้องเปลี่ยนแปลงเล็กน้อยมาก

ความปลอดภัย

การรักษาความปลอดภัยของแอปนี้อย่างเหมาะสมไม่ใช่เป้าหมายของเวิร์กช็อป 4 ชั่วโมงนี้ เนื่องจากจะทำให้ต้องใช้เวลาในเวิร์กช็อปนี้นานขึ้น 1-2 เท่า

แต่หัวข้อนี้สำคัญมาก เราได้รวบรวมไอเดียบางส่วนไว้ใน SECURITY

12. ยินดีด้วย

ขอแสดงความยินดี 🎉🎉🎉 คุณได้ทำให้แอปพลิเคชัน PHP รุ่นเดิมทันสมัยด้วย Google Cloud เรียบร้อยแล้ว

24cb9a39b1841fbd.png

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