1. บทนำ
อัปเดตล่าสุด: 01-11-2024
เราจะปรับแอปพลิเคชัน PHP เก่าให้เป็น Google Cloud ให้ทันสมัยได้อย่างไร
(📽️ ดูวิดีโอแนะนำความยาว 7 นาที เกี่ยวกับโค้ดแล็บนี้)
เป็นเรื่องปกติที่จะมีแอปพลิเคชันเดิมที่ทำงานในองค์กรซึ่งจำเป็นต้องได้รับการปรับปรุง ซึ่งหมายความว่าต้องปรับขนาดได้ ปลอดภัย และใช้งานได้ในสภาพแวดล้อมต่างๆ
ในเวิร์กช็อปนี้ คุณจะได้ทําสิ่งต่อไปนี้
- คอนเทนเนอร์แอปพลิเคชัน PHP
- ย้ายไปยังบริการฐานข้อมูลที่มีการจัดการ ( Cloud SQL)
- ทำให้ใช้งานได้กับ Cloud Run (เป็นทางเลือกแบบไม่ต้องดำเนินการใดๆ กับ GKE/Kubernetes)
- รักษาความปลอดภัยแอปพลิเคชันด้วย Identity and Access Management (IAM) และ Secret Manager
- กำหนดไปป์ไลน์ CI/CD ผ่าน Cloud Build Cloud Build สามารถเชื่อมต่อกับที่เก็บ Git ที่โฮสต์โดยผู้ให้บริการ Git ยอดนิยม เช่น GitHub หรือ GitLab และทริกเกอร์เมื่อมีการพุชไปยังเมนได้ เป็นต้น
- โฮสต์รูปภาพแอปพลิเคชันบน Cloud Storage ซึ่งทำได้ผ่านการต่อเชื่อม และไม่จำเป็นต้องใช้โค้ดเพื่อเปลี่ยนแอป
- เปิดตัวฟังก์ชันการทำงานของ Gen AI ผ่าน Gemini ซึ่งได้รับการจัดการผ่าน Cloud Functions (แบบ Serverless)
- ทำความคุ้นเคยกับ SLOs และการดําเนินการแอปที่รีเฟรชใหม่
การทำตามขั้นตอนเหล่านี้จะช่วยให้คุณทยอยทำให้แอปพลิเคชัน PHP ทันสมัยขึ้น ซึ่งจะปรับปรุงความสามารถในการปรับขนาด ความปลอดภัย และความยืดหยุ่นในการใช้งาน นอกจากนี้ การเปลี่ยนไปใช้ Google Cloud ยังช่วยให้คุณใช้ประโยชน์จากโครงสร้างพื้นฐานและบริการที่มีประสิทธิภาพเพื่อให้แอปพลิเคชันทำงานได้อย่างราบรื่นในสภาพแวดล้อมแบบคลาวด์เนทีฟ
เราเชื่อว่าสิ่งที่คุณจะได้เรียนรู้จากขั้นตอนง่ายๆ เหล่านี้สามารถนำไปใช้กับแอปพลิเคชันและองค์กรของคุณเองที่มีภาษา/สแต็ก ตลอดจนกรณีการใช้งานที่แตกต่างกันได้
เกี่ยวกับแอป
แอปพลิเคชัน ( โค้ดภายใต้ใบอนุญาต MIT) ที่คุณแยกคือแอปพลิเคชัน PHP 5.7 พื้นฐานที่มีการตรวจสอบสิทธิ์ MySQL แนวคิดหลักของแอปนี้คือการมอบแพลตฟอร์มที่ผู้ใช้สามารถอัปโหลดรูปภาพ และผู้ดูแลระบบสามารถแท็กรูปภาพที่ไม่เหมาะสมได้ แอปพลิเคชันมี 2 ตาราง ได้แก่
- ผู้ใช้ มาพร้อมกับผู้ดูแลระบบที่คอมไพล์ไว้ล่วงหน้า ผู้ใช้ใหม่จะลงทะเบียนได้
- รูปภาพ มีภาพตัวอย่าง 2-3 ภาพ ผู้ใช้ที่ลงชื่อเข้าสู่ระบบจะสามารถอัปโหลดรูปภาพใหม่ได้ เราจะเพิ่มข้อมูลบางอย่างที่นี่
เป้าหมายของคุณ
เราต้องการปรับปรุงแอปพลิเคชันเก่าให้ทันสมัยเพื่อใช้ใน Google Cloud เราจะใช้ประโยชน์จากเครื่องมือและบริการเพื่อปรับปรุงความสามารถในการปรับขนาด เพิ่มประสิทธิภาพความปลอดภัย การจัดการโครงสร้างพื้นฐานแบบอัตโนมัติ และผสานรวมฟีเจอร์ขั้นสูง เช่น การประมวลผลรูปภาพ การตรวจสอบ และการจัดเก็บข้อมูลโดยใช้บริการต่างๆ เช่น Cloud SQL, Cloud Run, Cloud Build, Secret Manager และอื่นๆ
ยิ่งไปกว่านั้น เราต้องการทำทีละขั้นตอนเพื่อให้คุณเรียนรู้กระบวนการคิดเบื้องหลังของทุกขั้นตอน และโดยปกติแล้วแต่ละขั้นตอนจะปลดล็อกโอกาสใหม่ๆ สำหรับขั้นตอนถัดไป (เช่น โมดูล 2 -> 3 และ 6 -> 7)
หากยังไม่แน่ใจ ดูวิดีโอความยาว 7 นาทีนี้บน YouTube
สิ่งที่ต้องมี
- คอมพิวเตอร์ที่มีเบราว์เซอร์และเชื่อมต่ออินเทอร์เน็ต
- เครดิต GCP บางรายการ โปรดสอบถามผู้ชื่นชอบ Google ในพื้นที่ ;)
- คำสั่ง
gcloud
ทำงานได้ - หากทํางานในเครื่อง ให้ดาวน์โหลดที่นี่ คุณจะต้องมีเครื่องมือแก้ไขที่ดีด้วย (เช่น vscode หรือ intellij)
- หากต้องการทำทุกอย่าง "ในระบบคลาวด์" จากนั้น คุณจะใช้ cloud Shell ได้
- ผู้ใช้ GitHub คุณต้องใช้คำสั่งนี้เพื่อแยกสาขาโค้ดต้นฉบับ 🧑🏻💻 gdgpescara/app-mod-workshop กับที่เก็บ Git ของคุณเอง ซึ่งจำเป็นต้องมีเพื่อใช้ไปป์ไลน์ CI/CD ของคุณเอง (การคอมมิตอัตโนมัติ -> บิลด์ -> ติดตั้งใช้งาน)
ดูตัวอย่างโซลูชันได้ที่นี่
- Repo ของผู้เขียน: https://github.com/Friends-of-Ricc/app-mod-workshop
- รีโปเวิร์กช็อปต้นฉบับในโฟลเดอร์
.solutions/
ต่อบท
คุณเข้าร่วมเวิร์กช็อปนี้ได้จากคอมพิวเตอร์เครื่องที่ใช้อยู่ หรือจะเข้าร่วมทั้งหมดในเบราว์เซอร์ก็ได้
2. การตั้งค่าเครดิตและการแยก
แลกรับเครดิต GCP และตั้งค่าสภาพแวดล้อม GCP [ไม่บังคับ]
หากต้องการเข้าร่วมเวิร์กช็อปนี้ คุณต้องมีบัญชีการเรียกเก็บเงินที่มีเครดิตบ้าง หากมีการเรียกเก็บเงินของคุณเองอยู่แล้ว ให้ข้ามขั้นตอนนี้
สร้างบัญชี Google Gmail ใหม่ (*) เพื่อลิงก์กับเครดิต GCP สอบถามลิงก์สำหรับแลกรับเครดิต GCP หรือใช้เครดิตที่นี่ bit.ly/PHP-Amarcord-credits
ลงชื่อเข้าใช้ด้วยบัญชีที่สร้างขึ้นใหม่และทำตามคำแนะนำ
(
) Why do I need a brand new gmail account?*
เราพบว่าผู้ใช้บางคนทำ Codelab ไม่สำเร็จเนื่องจากบัญชี (โดยเฉพาะอีเมลงานหรืออีเมลนักเรียน) เคยมีการใช้งาน GCP มาก่อน และมีนโยบายขององค์กรที่จำกัดไม่ให้ผู้ใช้ทำ Codelab ได้ เราขอแนะนำให้สร้างบัญชี Gmail ใหม่หรือใช้บัญชี Gmail ที่มีอยู่ (gmail.com) ที่ไม่ได้ใช้ GCP มาก่อน
คลิกปุ่มเพื่อแลกสิทธิ์
กรอกแบบฟอร์มต่อไปนี้พร้อมชื่อและนามสกุล แล้วยอมรับข้อกำหนดและเงื่อนไข
คุณอาจต้องรอ 2-3 วินาทีก่อนที่บัญชีการเรียกเก็บเงินจะปรากฏที่นี่ https://console.cloud.google.com/billing
เมื่อเสร็จแล้ว ให้เปิดคอนโซล Google Cloud และสร้างโปรเจ็กต์ใหม่โดยคลิกตัวเลือกโปรเจ็กต์ที่เมนูแบบเลื่อนลงด้านซ้ายบนซึ่งแสดง "ไม่มีองค์กร" ดูด้านล่าง
สร้างโปรเจ็กต์ใหม่หากยังไม่มี ดังที่แสดงในภาพหน้าจอด้านล่าง มีตัวเลือก "โปรเจ็กต์ใหม่" ที่มุมขวาบน
โปรดลิงก์โปรเจ็กต์ใหม่กับบัญชีสำหรับการเรียกเก็บเงินช่วงทดลองใช้ GCP ดังนี้
คุณพร้อมที่จะใช้ Google Cloud Platform แล้ว หากคุณเป็นผู้เริ่มต้นหรือต้องการทําทุกอย่างในสภาพแวดล้อมระบบคลาวด์ คุณสามารถเข้าถึง Cloud Shell และเครื่องมือแก้ไขได้ผ่านปุ่มต่อไปนี้ที่มุมซ้ายบนดังที่แสดงด้านล่าง
ตรวจสอบว่าได้เลือกโปรเจ็กต์ใหม่ทางด้านซ้ายบนแล้ว
ไม่ได้เลือก (ไม่ดี):
เลือก (ดี):
แยกแอปจาก GitHub
- ไปที่แอปเดโม: https://github.com/gdgpescara/app-mod-workshop
- คลิก🍴ส้อม
- หากไม่มีบัญชี คุณต้องสร้างบัญชีใหม่
- แก้ไขสิ่งต่างๆ ได้ตามต้องการ
- โคลนโค้ดแอปโดยใช้ git clone https://github.com/<YOUR-GITHUB-USER>/<YOUR-REPO-NAME>
- เปิดโฟลเดอร์โปรเจ็กต์ที่โคลนด้วยเครื่องมือแก้ไขที่ต้องการ หากเลือก Cloud Shell ให้คลิก "เปิดเครื่องมือแก้ไข" ดังที่แสดงด้านล่าง
คุณมีทุกอย่างที่จำเป็นใน Google Cloud Shell Editor ดังที่แสดงในภาพต่อไปนี้
3. โมดูลที่ 1: สร้างอินสแตนซ์ SQL
สร้างอินสแตนซ์ Google Cloud SQL
แอป PHP จะเชื่อมต่อกับฐานข้อมูล MySQL เราจึงต้องจำลองข้อมูลไปยัง Google Cloud เพื่อให้การย้ายข้อมูลเป็นไปอย่างราบรื่น Cloud SQL เหมาะอย่างยิ่งเนื่องจากช่วยให้คุณเรียกใช้ฐานข้อมูล MySQL ที่มีการจัดการครบวงจรในระบบคลาวด์ได้ ขั้นตอนมีดังนี้
- ไปที่หน้า Cloud SQL: https://console.cloud.google.com/sql/instances
- คลิก "สร้างอินสแตนซ์"
- เปิดใช้ API (หากจำเป็น) การดำเนินการนี้อาจใช้เวลาสักครู่
- เลือก MySQL
- (เราพยายามหาเวอร์ชันที่ถูกที่สุดให้คุณเพื่อให้ใช้งานได้นานขึ้น)
- รุ่น: Enterprise
- ที่กำหนดล่วงหน้า: การพัฒนา (เราลองใช้แซนด์บ็อกซ์แล้ว แต่ใช้ไม่ได้)
- Mysql Ver: 5.7 (ว้าว นึกถึงสมัยก่อนเลย)
- รหัสอินสแตนซ์: เลือก
appmod-phpapp
(หากเปลี่ยนการตั้งค่านี้ อย่าลืมเปลี่ยนสคริปต์และโซลูชันในอนาคตด้วย) - รหัสผ่าน: อะไรก็ได้ แต่ให้จดไว้เป็น CLOUDSQL_INSTANCE_PASSWORD
- ภูมิภาค: ใช้ค่าเดียวกับที่คุณเลือกไว้สำหรับส่วนที่เหลือของแอป (เช่น มิลาน =
europe-west8
) - ความพร้อมระดับโซน: โซนเดียว (เราประหยัดเงินไว้สำหรับเวอร์ชันเดโม)
คลิกปุ่ม "สร้างอินสแตนซ์" เพื่อทำให้ฐานข้อมูล Cloud SQL ใช้งานได้ ⌛การดำเนินการจะใช้เวลาประมาณ 10 นาทีจึงจะเสร็จสมบูรณ์⌛ ในระหว่างนี้ โปรดอ่านเอกสารประกอบต่อ หรือจะเริ่มต้นแก้ปัญหาในโมดูลถัดไป ("จัดคอนเทนเนอร์แอป PHP") ก็ได้ เนื่องจากโมดูลนี้ไม่ได้ขึ้นอยู่กับโมดูลแรก (จนกว่าคุณจะแก้ไขการเชื่อมต่อฐานข้อมูล)
หมายเหตุ อินสแตนซ์นี้น่าจะมีค่าใช้จ่ายประมาณ 7$/วัน อย่าลืมนำผลิตภัณฑ์ไปใช้หลังจบเวิร์กช็อป
สร้างฐานข้อมูล image_catalog และผู้ใช้ใน Cloud SQL
โปรเจ็กต์แอปมาพร้อมกับโฟลเดอร์ db/
ที่มีไฟล์ SQL 2 ไฟล์ ดังนี้
- 01_schema.sql : มีโค้ด SQL เพื่อสร้างตาราง 2 ตารางที่มีข้อมูลผู้ใช้และรูปภาพ
- 02_seed.sql: มีโค้ด SQL เพื่อสร้างข้อมูลในตารางที่สร้างไว้ก่อนหน้านี้
ระบบจะใช้ไฟล์เหล่านี้ในภายหลังเมื่อสร้างฐานข้อมูล image_catalog
โดยทำตามขั้นตอนต่อไปนี้
- เปิดอินสแตนซ์แล้วคลิกแท็บฐานข้อมูล
- คลิก "สร้างฐานข้อมูล"
- ให้ตั้งชื่อว่า
image_catalog
(ตามการกำหนดค่าแอป PHP)
จากนั้นสร้างผู้ใช้ฐานข้อมูล ซึ่งช่วยให้เราตรวจสอบสิทธิ์เข้าสู่ฐานข้อมูล image_catalog ได้
- จากนั้นคลิกแท็บผู้ใช้
- คลิก "เพิ่มบัญชีผู้ใช้"
- ผู้ใช้: มาสร้างกัน
- ชื่อผู้ใช้:
appmod-phpapp-user
- รหัสผ่าน: เลือกสิ่งที่คุณจำได้ หรือคลิก "สร้าง"
- เลือก "อนุญาตทุกโฮสต์ (%)" ไว้
- คลิก "เพิ่ม"
เปิด DB ให้กับ IP ที่รู้จักกันดี
โปรดทราบว่าฐานข้อมูลทั้งหมดใน Cloud SQL ที่เกิดเป็น "แยก" คุณต้องตั้งค่าเครือข่ายให้ชัดเจนเพื่อให้เข้าถึงได้
- คลิกอินสแตนซ์ของคุณ
- เปิดเมนู "การเชื่อมต่อ"
- คลิกแท็บ "เครือข่าย"
- คลิกในส่วนเครือข่ายที่ได้รับอนุญาต จากนั้นเพิ่มซับเน็ต
- สำหรับตอนนี้ เราจะเลือก "ไม่ปลอดภัย" เพื่อให้แอปทำงานได้
- ชื่อ: "ทุกคนในโลก - ไม่ปลอดภัย" (โปรดทราบว่าวิธีแก้ปัญหาราคาถูกนี้ก็ไม่ปลอดภัยเช่นกัน)
- เครือข่าย: "0.0.0.0/0" (หมายเหตุ: ไม่ปลอดภัย)
คลิกบันทึก
คุณควรเห็นข้อมูลในลักษณะนี้
หมายเหตุ โซลูชันนี้เป็นวิธีประนีประนอมที่ดีในการทำให้เวิร์กช็อปเสร็จสิ้นใน O(hours) อย่างไรก็ตาม โปรดตรวจสอบเอกสาร SECURITY เพื่อช่วยให้โซลูชันของคุณปลอดภัยสำหรับเวอร์ชันที่ใช้งานจริง
ถึงเวลาทดสอบการเชื่อมต่อ DB
มาดูกันว่าผู้ใช้ image_catalog
ที่เราสร้างไว้ก่อนหน้านี้ใช้งานได้ไหม สิทธิ์เข้าถึง Cloud SQL Studio ภายในอินสแตนซ์และป้อนฐานข้อมูล ผู้ใช้ และรหัสผ่านเพื่อตรวจสอบสิทธิ์ดังที่แสดงด้านล่าง
เมื่อเข้าสู่ส่วนนี้แล้ว คุณสามารถเปิดเครื่องมือแก้ไข SQL และไปยังส่วนถัดไปได้
นําเข้าฐานข้อมูลจากโค้ดเบส
ใช้เครื่องมือแก้ไข SQL เพื่อนำเข้าตาราง image_catalog พร้อมข้อมูล คัดลอกโค้ด SQL จากไฟล์ sql ในรีโปและเรียกใช้ทีละรายการตามลําดับ 01_schema.sql ตามด้วย 02_seed.sql
หลังจากนี้ คุณควรได้รับตาราง 2 ตารางใน image_catalog ซึ่งได้แก่ users และ images ดังที่แสดงด้านล่าง
คุณสามารถทดสอบได้โดยเรียกใช้ select * from images;
ในเครื่องมือแก้ไข
นอกจากนี้ อย่าลืมจดที่อยู่ IP สาธารณะไว้ด้วย เพราะจะต้องใช้ในภายหลัง
4. โมดูลที่ 2: บรรจุแอป PHP ลงในคอนเทนเนอร์
เราต้องการสร้างแอปนี้สําหรับระบบคลาวด์
ซึ่งหมายถึงการแพ็กโค้ดเป็นไฟล์ ZIP บางประเภทซึ่งมีข้อมูลทั้งหมดที่จะเรียกใช้ในระบบคลาวด์
แพ็กเกจมีด้วยกัน 2-3 วิธีดังนี้
- Docker ได้รับความนิยมมาก แต่ค่อนข้างซับซ้อนในการตั้งค่าอย่างถูกต้อง
- Buildpack ไม่ค่อยได้รับความนิยม แต่มีแนวโน้มที่จะ "คาดเดาอัตโนมัติ" ว่าควรสร้างอะไรและทำอะไร บ่อยครั้งก็แค่ใช้งานได้เลย
ในบริบทของเวิร์กช็อปนี้ เราจะสมมติว่าคุณใช้ Docker
Docker
ถ้าอยากได้การควบคุม โซลูชันนี้เหมาะสำหรับคุณ การดำเนินการนี้เหมาะสมเมื่อคุณต้องกำหนดค่าไลบรารีที่เฉพาะเจาะจงและแทรกลักษณะการทำงานบางอย่างที่ไม่ชัดเจน (chmod ในการอัปโหลด ซึ่งเป็นไฟล์ปฏิบัติการที่ไม่เป็นมาตรฐานในแอปของคุณ)
เนื่องจากเราต้องการทำให้แอปพลิเคชันคอนเทนเนอร์ใช้งานได้ใน Cloud Run ในท้ายที่สุด โปรดดูเอกสารประกอบต่อไปนี้และลองเติมข้อมูลในช่องว่าง เราให้เฉพาะข้อมูลที่จำเป็นเพื่อให้คุณดำเนินการต่างๆ ได้ง่ายในตอนนี้ Dockerfile สุดท้ายจะมีลักษณะคล้ายกับด้านล่างนี้
# Use an official PHP image with Apache
# Pull a suitable php image
FROM __________# Define the env variable for the Apache listening port 8080
ENV __________
# Set working directory inside the container
WORKDIR __________
# Install required PHP extensions: PDO, MySQL, and other dependencies
RUN __________
# Copy all application files into the container
COPY __________
# Configure Apache to listen on port 8080. Use ‘sed' command to change the default listening port.
RUN __________
# When in doubt, always expose to port 8080
EXPOSE __________
# Start Apache in the foreground
CMD __________
นอกจากนี้ ในการทดสอบแอปพลิเคชันในเครื่อง เราจำเป็นต้องเปลี่ยนไฟล์ config.php ในลักษณะที่แอป PHP ของเราจะเชื่อมต่อกับ db ของ MYSQL ที่อยู่ใน Google CloudSQL กรอกข้อมูลในช่องว่างตามที่คุณตั้งค่าไว้ก่อนหน้านี้
- Db_host คือที่อยู่ IP สาธารณะของ Cloud SQL ซึ่งคุณดูได้ในคอนโซล
- ไม่ควรมีการเปลี่ยนแปลง Db_name:
image_catalog
- Db_user ควรเป็น
appmod-phpapp-user
- Db_pass คือสิ่งที่คุณเลือก ตั้งค่าในเครื่องหมายคำพูดเดี่ยวและ Escape ตามต้องการ
<?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();
?>
นอกจากนี้ คุณยังแปลบทความภาษาอิตาลีเป็นภาษาอังกฤษได้ด้วยความช่วยเหลือจาก Gemini
เอาล่ะ เมื่อคุณมี Dockerfile และได้กำหนดค่าแอป PHP ให้เชื่อมต่อกับฐานข้อมูลของคุณแล้ว มาลองกันเลย
ติดตั้ง Docker หากคุณยังไม่มี ( ลิงก์) คุณไม่จําเป็นต้องใช้ขั้นตอนนี้หากใช้ Cloud Shell (เจ๋งไหมล่ะ)
ตอนนี้ให้ลองสร้างและเรียกใช้แอป PHP ที่ใช้คอนเทนเนอร์ด้วยคำสั่ง docker build และ run ที่เหมาะสม
- docker build -t <IMAGE_TAG_NAME> .
- Docker เรียกใช้ -it -p <CONTAINER PORT>:<LOCAL MACHINE PORT> <IMAGE_TAG_NAME>
หากทุกอย่างทำงานได้ตามปกติ คุณควรจะเห็นหน้าเว็บต่อไปนี้เมื่อเชื่อมต่อกับโฮสต์ในระบบ
หากใช้ Cloud Shell อยู่ คุณสามารถส่งออกพอร์ตในเครื่อง (เช่น 8080) ไปยังเบราว์เซอร์ได้ ดังนี้
docker build -t my-php-app-docker app-mod-workshop/ -f Dockerfile
docker run -it -p 8080:8080 my-php-app-docker
เมื่อทราบว่าแอปทำงานบนพอร์ต 8080 แล้ว ให้คลิกไอคอน "ตัวอย่างเว็บ" (เบราว์เซอร์ที่มีรูปตา) แล้วคลิกแสดงตัวอย่างบนพอร์ต 8080 (หรือ "เปลี่ยนพอร์ต" สำหรับพอร์ตอื่นๆ)
การทดสอบผลลัพธ์ในเบราว์เซอร์
ตอนนี้แอปพลิเคชันของคุณควรมีลักษณะดังนี้
และหากคุณเข้าสู่ระบบด้วย Admin/admin123 คุณควรเห็นหน้าจอประมาณนี้
เยี่ยมไปเลย ใช้งานได้ 🎉🎉🎉
หากการบรรจุลงในคอนเทนเนอร์ถูกต้องแต่ข้อมูลเข้าสู่ระบบของ DB ไม่ถูกต้อง คุณอาจเห็นข้อความประมาณนี้
ลองอีกครั้ง คุณใกล้จะถึงแล้ว
Buildpack [ไม่บังคับ]
Buildpack จะทำให้แอปสร้างขึ้นโดยอัตโนมัติได้อย่างน่าอัศจรรย์ ขออภัย คุณไม่มีสิทธิ์ควบคุมอย่างเต็มรูปแบบ จึงอาจได้การกำหนดค่าที่ไม่คาดคิด
- ดู BuildPacks ใน GCP: https://cloud.google.com/docs/buildpacks/build-application และที่นี่
- วิธีติดตั้ง
pack
: https://buildpacks.io/docs/for-platform-operators/how-to/integrate-ci/pack/ - บิลด์แพ็กใน PHP: https://cloud.google.com/docs/buildpacks/php (ซึ่งจะบอกวิธีตั้งค่าเวอร์ชัน PHP)
- ลองใช้คำสั่งต่อไปนี้เพื่อสร้างอิมเมจคอนเทนเนอร์โดยอัตโนมัติ
pack build --builder=gcr.io/buildpacks/builder my-app-with-buildpacks
คุณควรมีอิมเมจ Docker ใหม่ในสภาพแวดล้อมในเครื่อง คุณสามารถลองเรียกใช้คอนเทนเนอร์สำหรับคอนเทนเนอร์ได้ แต่เนื่องจากเราไม่สามารถควบคุมวิธีการสร้างอิมเมจได้อย่างเต็มที่ แอปอาจไม่ทำงาน ไม่ว่าในกรณีใด เราขอเชิญให้คุณลองใช้และแชร์ความคิดเห็นกับเราหากประสบความสําเร็จ ขอขอบคุณ
การบันทึกไปยัง 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 พุช TARGET_IMAGE[:TAG]
ผลลัพธ์ควรมีลักษณะดังภาพหน้าจอต่อไปนี้
เยี่ยมไปเลย 🎉🎉🎉 คุณก็เลื่อนระดับไปอีกขั้นได้
โน้ต นอกจากนี้ให้ลองใช้อุปกรณ์ปลายทาง /upload.php
และลองอัปโหลดรูปภาพ คุณอาจเห็นข้อความ "ปฏิเสธสิทธิ์" หากใช่ คุณจะต้องทำการแก้ไข chmod/chown
ใน Dockerfile
5. โมดูลที่ 3: ติดตั้งใช้งานแอปใน Cloud Run
ทำไมต้องใช้ Cloud Run
เป็นคำถามที่เหมาะสม! เมื่อหลายปีก่อน คุณคงเลือก Google App Engine
กล่าวโดยย่อคือ ตอนนี้ Cloud Run มีแพ็กเกจเทคโนโลยีที่ใหม่กว่า ติดตั้งใช้งานได้ง่ายกว่า ราคาถูกกว่า และปรับขนาดเป็น 0 เมื่อคุณไม่ได้ใช้งาน ความยืดหยุ่นในการใช้งานคอนเทนเนอร์แบบไม่เก็บสถานะและการผสานรวมกับบริการต่างๆ ของ Google Cloud ทำให้เหมาะสําหรับการทําให้ใช้งานได้กับ Microservice และแอปพลิเคชันสมัยใหม่โดยมีค่าใช้จ่ายเพิ่มเติมน้อยที่สุดและมีประสิทธิภาพสูงสุด
กล่าวอย่างเจาะจงคือ Cloud Run เป็นแพลตฟอร์มที่มีการจัดการโดยสมบูรณ์โดย Google Cloud ซึ่งช่วยให้คุณเรียกใช้แอปพลิเคชันคอนเทนเนอร์แบบไม่เก็บสถานะในสภาพแวดล้อมแบบ Serverless ได้ แพลตฟอร์มนี้จะจัดการโครงสร้างพื้นฐานทั้งหมดโดยอัตโนมัติ โดยปรับขนาดจาก 0 เพื่อรองรับการจราจรของข้อมูลขาเข้าและหยุดทำงานเมื่อไม่มีการใช้งาน ทำให้มีความคุ้มค่าและประสิทธิผล Cloud Run รองรับภาษาหรือไลบรารีใดก็ได้ ตราบใดที่แพ็กเกจอยู่ในคอนเทนเนอร์ ซึ่งช่วยให้การพัฒนามีความยืดหยุ่นอย่างมาก แพลตฟอร์มนี้ผสานรวมกับบริการอื่นๆ ของ Google Cloud ได้ดี และเหมาะสำหรับการสร้าง 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
ณ จุดนี้ ทุกอย่างพร้อมจะทำให้ใช้งานได้ใน Cloud Run แล้ว
ทำให้แอปใช้งานได้กับ Cloud Run ผ่าน gcloud
คำสั่งที่ให้คุณทําให้แอปใช้งานได้ใน Cloud Run คือ gcloud run deploy
คุณตั้งค่าได้หลายวิธีเพื่อให้บรรลุเป้าหมาย ชุดค่าต่ำสุดมีดังต่อไปนี้
- ชื่อบริการ Cloud Run ที่ต้องการทำให้ใช้งานได้สําหรับแอป บริการ Cloud Run จะแสดง URL ที่ระบุปลายทางสําหรับแอป
- ภูมิภาค Google Cloud ที่แอปของคุณจะทำงาน
- อิมเมจคอนเทนเนอร์ที่รวมแอปของคุณ
- ตัวแปรสภาพแวดล้อมที่แอปของคุณต้องใช้ในระหว่างการดำเนินการ
- Flag Allow-Unauthenticated ที่อนุญาตให้ทุกคนเข้าถึงแอปของคุณได้โดยไม่ต้องมีการตรวจสอบสิทธิ์เพิ่มเติม
โปรดดูเอกสารประกอบเพื่อดูวิธีใช้ตัวเลือกนี้กับคําสั่ง การทำให้ใช้งานได้จะใช้เวลาไม่กี่นาที หากทุกอย่างถูกต้อง คุณควรเห็นข้อมูลประมาณนี้ในคอนโซล Google Cloud
คลิก URL ที่ Cloud Run ระบุและทดสอบแอปพลิเคชัน เมื่อตรวจสอบสิทธิ์แล้ว คุณควรจะเห็นข้อความแบบนี้
"gcloud run deploy" พร้อม "no questions"
คุณอาจสังเกตเห็นว่า gcloud run deploy
ถามคำถามที่ถูกต้องและเติมข้อมูลในช่องว่างที่คุณเว้นไว้ ยอดเยี่ยมไปเลย
อย่างไรก็ตาม ในโมดูลบางรายการ เราจะเพิ่มคําสั่งนี้ลงในทริกเกอร์ Cloud Build จึงไม่สามารถตอบคําถามได้ เราต้องกรอกทุกตัวเลือกในคำสั่ง คุณจึงต้องการประดิษฐ์ gcloud run deploy --option1 blah --foo bar --region your-fav-region
สีทอง คุณจะใช้วิธีใด
- ทำขั้นตอนที่ 2-3-4 ซ้ำจนกว่า gcloud จะหยุดถามคำถาม
- [LOOP]
gcloud run deploy
ที่มีตัวเลือกจนถึงตอนนี้ - [LOOP] systems ask for option X
- [LOOP] ค้นหาในเอกสารสาธารณะเกี่ยวกับวิธีตั้งค่า X จาก CLI โดยเพิ่มตัวเลือก
--my-option [my-value]
- กลับไปที่ขั้นตอนที่ 2 เว้นแต่ gcloud จะดำเนินการเสร็จสมบูรณ์โดยไม่มีคำถามเพิ่มเติม
- การเรียกใช้ gcloud นี้ทำให้ 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') ?: _______;
$db_name = getenv('DB_NAME') ?: 'image_catalog';
$db_user = getenv('DB_USER') ?: 'appmod-phpapp-user';
$db_pass = getenv('DB_PASS') ?: _______;
// 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 ให้กับแอป ซึ่งทำได้ 2-3 วิธี ดังนี้
- เวลาที่สร้างใน Dockerfile เพิ่มพารามิเตอร์ 4 รายการลงใน Dockerfile ก่อนหน้าโดยใช้ไวยากรณ์ ENV DB_VAR=ENV_VAR_VALUE ซึ่งจะตั้งค่าเริ่มต้นที่ลบล้างได้ในรันไทม์ เช่น คุณตั้งค่า "DB_NAME" และ "DB_USER" ได้ที่นี่และที่อื่นไม่ได้
- ในเวลา run คุณตั้งค่าตัวแปรเหล่านี้สำหรับ Cloud Run ได้ทั้งจาก CLI หรือจาก UI นี่เป็นตำแหน่งที่เหมาะสมในการใส่ตัวแปรทั้ง 4 รายการ (เว้นแต่คุณจะต้องการใช้ค่าเริ่มต้นที่กำหนดไว้ใน Dockerfile ต่อไป)
ใน localhost คุณอาจต้องใส่ตัวแปร ENV ในไฟล์ .env
(ตรวจสอบโฟลเดอร์ solutions)
นอกจากนี้ โปรดตรวจสอบว่าได้เพิ่ม .env ลงใน .gitignore
แล้ว คุณไม่ต้องการพุชข้อมูลลับไปยัง GitHub
echo .env >> .gitignore
หลังจากนั้น คุณสามารถทดสอบอินสแตนซ์ในเครื่องได้โดยทำดังนี้
docker run -it -p 8080:8080 --env-file .env my-php-app-docker
ตอนนี้คุณก็บรรลุเป้าหมายต่อไปนี้แล้ว
- แอปจะอ่านตัวแปรแบบไดนามิกจาก ENV
- คุณเพิ่มความปลอดภัยแล้วเนื่องจากนำรหัสผ่าน DB ออกจากโค้ด)
ตอนนี้คุณทำให้การแก้ไขใหม่ใช้งานได้กับ Cloud Run แล้ว มาลองใช้ UI และตั้งค่าตัวแปรสภาพแวดล้อมด้วยตนเองกัน
- ไปที่ https://console.cloud.google.com/run
- คลิกที่แอป
- คลิก "แก้ไขและทำให้การแก้ไขใหม่ใช้งานได้"
- ในแท็บแรก "คอนเทนเนอร์" ให้คลิกแท็บด้านล่าง "ตัวแปรและข้อมูลลับ"
- คลิก "+ เพิ่มตัวแปร" แล้วเพิ่มตัวแปรที่จําเป็นทั้งหมด ผลลัพธ์ที่ได้ควรมีลักษณะดังนี้
แบบนี้ถูกต้องไหม ไม่ ผู้ให้บริการส่วนใหญ่จะยังคงเห็นบัตรของคุณ ซึ่งลดได้ด้วย Secret Manager ของ Google Cloud
รุ่นที่ 2: Secret Manager
รหัสผ่านของคุณหายไปจากรหัสของคุณเอง: ชัยชนะ! แต่เดี๋ยวก่อน ปัญหาได้รับการแก้ไขแล้วใช่ไหม
รหัสผ่านของคุณจะยังคงแสดงแก่ทุกคนที่มีสิทธิ์เข้าถึง Google Cloud Console คุณสามารถเรียกข้อมูลได้หากเข้าถึงไฟล์การนําส่ง YAML ของ Cloud Run หรือหากคุณพยายามแก้ไขหรือทำให้เวอร์ชัน Cloud Run ใหม่ใช้งานได้ รหัสผ่านจะปรากฏในส่วนตัวแปรและข้อมูลลับตามที่แสดงในภาพหน้าจอด้านล่าง
เครื่องมือจัดการข้อมูลลับของ Google Cloud เป็นบริการที่ปลอดภัยและรวมศูนย์สำหรับจัดการข้อมูลที่ละเอียดอ่อน เช่น คีย์ API, รหัสผ่าน, ใบรับรอง และข้อมูลลับอื่นๆ
ซึ่งช่วยให้คุณจัดเก็บ จัดการ และเข้าถึงข้อมูลลับได้ด้วยสิทธิ์แบบละเอียดและการเข้ารหัสที่มีประสิทธิภาพ ผู้จัดการข้อมูลลับผสานรวมกับ Identity and Access Management (IAM) ของ Google Cloud ซึ่งช่วยให้คุณควบคุมผู้ที่มีสิทธิ์เข้าถึงข้อมูลลับที่เฉพาะเจาะจงได้ เพื่อรักษาความปลอดภัยของข้อมูลและการปฏิบัติตามข้อกำหนด
นอกจากนี้ ยังรองรับการเปลี่ยนความลับและการจัดเวอร์ชันอัตโนมัติ ซึ่งทำให้การจัดการวงจรของข้อมูลลับง่ายขึ้นและช่วยเพิ่มความปลอดภัยในแอปพลิเคชันต่างๆ ในบริการของ Google Cloud
หากต้องการเข้าถึงเครื่องมือจัดการข้อมูลลับ ให้ไปที่เมนูแฮมเบอร์เกอร์เพื่อไปยังบริการความปลอดภัย แล้วค้นหาในส่วนการคุ้มครองข้อมูลตามที่แสดงในภาพหน้าจอด้านล่าง
เปิดใช้ Secret Manager API เมื่อคุณอยู่ที่ส่วนดังกล่าวตามรูปภาพต่อไปนี้
- แล้วคลิก "สร้างข้อมูลลับ" เราจะตั้งชื่ออย่างสมเหตุสมผลว่า
- ชื่อ:
php-amarcord-db-pass
- ค่าลับ: "รหัสผ่าน DB" (ไม่ต้องสนใจส่วน "อัปโหลดไฟล์")
- กำกับเนื้อหาลิงก์ลับนี้ ควรมีลักษณะดังนี้
projects/123456789012/secrets/php-amarcord-db-pass
นี่คือเคอร์เซอร์ที่ไม่ซ้ำกันซึ่งไปยังข้อมูลลับ (สําหรับ Terraform, Cloud Run และอื่นๆ) หมายเลขดังกล่าวคือหมายเลขโปรเจ็กต์ที่ไม่ซ้ำกัน
เคล็ดลับ: พยายามใช้รูปแบบการตั้งชื่อที่สอดคล้องกันสำหรับข้อมูลลับ โดยจัดเรียงจากซ้ายไปขวา เช่น cloud-devrel-phpamarcord-dbpass
- องค์กร (มีบริษัท)
- ทีม (ภายในองค์กร)
- การสมัคร (ภายในทีม)
- ชื่อตัวแปร (ภายในแอป)
ซึ่งจะช่วยให้คุณมีนิพจน์ทั่วไปที่ค้นหาข้อมูลลับทั้งหมดสำหรับแอปเดียวได้อย่างง่ายดาย
สร้างการแก้ไข Cloud Run ใหม่
ตอนนี้เรามีข้อมูลลับใหม่แล้ว เราต้องลบตัวแปร DB_PASS ENV และแทนที่ด้วยข้อมูลลับใหม่ ดังนั้น
- การเข้าถึง Cloud Run โดยใช้คอนโซล Google Cloud
- เลือกแอป
- คลิก "แก้ไขและใช้การแก้ไขใหม่"
- ค้นหาแท็บ "ตัวแปรและข้อมูลลับ"
- ใช้ปุ่ม "+ อ้างอิงข้อมูลลับ" เพื่อรีเซ็ตตัวแปร DB_PASS ENV
- ใช้ "DB_PASS" เดียวกันสำหรับข้อมูลลับที่อ้างอิงและใช้เวอร์ชันล่าสุด
เมื่อดำเนินการเสร็จแล้ว คุณควรได้รับข้อผิดพลาดต่อไปนี้
ลองหาวิธีแก้ไขดู ในการแก้ปัญหานี้ คุณต้องไปที่ส่วน IAM และผู้ดูแลระบบ แล้วเปลี่ยนสิทธิ์การให้ ขอให้สนุกกับการแก้ไขข้อบกพร่อง!
เมื่อทราบแล้ว ให้กลับไปที่ Cloud Run แล้วทำให้การแก้ไขใหม่ใช้งานได้อีกครั้ง ผลลัพธ์ควรมีลักษณะดังรูปต่อไปนี้
เคล็ดลับ: คอนโซลของนักพัฒนาแอป (UI) ชี้ให้เห็นปัญหาเกี่ยวกับสิทธิ์ได้ดีมาก ใช้เวลาสำรวจลิงก์ทั้งหมดสำหรับเอนทิตีในระบบคลาวด์ของคุณ
7. โมดูลที่ 5: ตั้งค่า CI/CD ด้วย Cloud Build
เหตุผลที่ควรใช้ไปป์ไลน์ CI/CD
ตอนนี้คุณควรพิมพ์ gcloud run deploy
ไปแล้ว 2-3 ครั้ง ซึ่งอาจเป็นการตอบคำถามเดิมซ้ำๆ
หากเบื่อหน่ายกับการติดตั้งใช้งานแอปด้วยตนเองด้วย gcloud run deploy คงจะดีไม่น้อยใช่ไหมหากแอปของคุณสามารถทำให้แอปใช้งานได้โดยอัตโนมัติในทุกครั้งที่คุณพุชการเปลี่ยนแปลงใหม่ๆ ไปยังที่เก็บ Git
หากต้องการใช้ไปป์ไลน์ CI/CD คุณจะต้องมี 2 สิ่งต่อไปนี้
- ที่เก็บ Git ส่วนตัว: คุณควรแยกที่เก็บเวิร์กช็อปไปยังบัญชี GitHub ของคุณแล้วในขั้นตอนที่ 2 หากยัง ให้กลับไปทำตามขั้นตอนนั้นให้เสร็จ ที่เก็บที่แยกควรมีลักษณะดังนี้
https://github.com/<YOUR_GITHUB_USER>/app-mod-workshop
- Cloud Build บริการที่ยอดเยี่ยมและราคาถูกนี้ช่วยให้คุณกำหนดค่าการทำงานอัตโนมัติของบิลด์ได้เกือบทุกอย่าง เช่น Terraform, แอปที่ทำงานแบบ Docker ฯลฯ
ส่วนนี้จะเน้นที่การตั้งค่า Cloud Build
เข้าสู่ Cloud Build
เราจะใช้ Cloud Build เพื่อดำเนินการต่อไปนี้
- บิลด์แหล่งที่มา (ด้วย Dockerfile) โปรดทราบว่าไฟล์นี้เปรียบเสมือน "ไฟล์ .zip ขนาดใหญ่" ที่มีทุกอย่างที่จำเป็นต่อการสร้างและเรียกใช้แอป ("อาร์ติแฟกต์การสร้าง")
- พุชอาร์ติแฟกต์นี้ไปยัง Artifact Registry (AR)
- จากนั้นทําการทําให้ใช้งานได้จาก AR ไปยัง Cloud Run สําหรับแอป "php-amarcord"
- ซึ่งจะเป็นการสร้างเวอร์ชันใหม่ ("การแก้ไข") ของแอปที่มีอยู่ (ลองนึกถึงเลเยอร์ที่มีโค้ดใหม่) และเราจะกำหนดค่าเพื่อถ่ายโอนการเข้าชมไปยังเวอร์ชันใหม่หากการพุชสำเร็จ
ตัวอย่างบิลด์บางส่วนสำหรับแอป php-amarcord
ของฉันมีดังนี้
เราจะทำสิ่งเหล่านี้ได้อย่างไร
- การสร้างไฟล์ YAML ที่สมบูรณ์แบบไฟล์เดียว
cloudbuild.yaml
- การสร้างทริกเกอร์ Cloud Build
- โดยการเชื่อมต่อกับที่เก็บ GitHub ผ่าน Cloud Build UI
สร้างทริกเกอร์ (และเชื่อมต่อที่เก็บ)
- ไปที่ https://console.cloud.google.com/cloud-build/triggers
- คลิก "สร้างทริกเกอร์"
- คอมไพล์:
- ชื่อ: ตั้งชื่อที่สื่อความหมาย เช่น
on-git-commit-build-php-app
- เหตุการณ์: พุชไปยัง Branch
- แหล่งที่มา: "เชื่อมต่อที่เก็บใหม่"
- ซึ่งจะเป็นการเปิดหน้าต่าง "เชื่อมต่อที่เก็บ" ทางด้านขวา
- ผู้ให้บริการแหล่งที่มา: "GitHub" (รายการแรก)
- "ดำเนินการต่อ"
- การตรวจสอบสิทธิ์จะเปิดหน้าต่างใน GitHub เพื่อตรวจสอบสิทธิ์ข้าม โปรดทำตามขั้นตอนและอดทนรอ หากมีรีพอสิทหลายรายการ การดำเนินการนี้อาจใช้เวลาสักครู่
- "เลือกที่เก็บ" เลือกบัญชี/ที่เก็บ และเลือกส่วน "ฉันเข้าใจ..."
- หากได้รับข้อผิดพลาด: แอป GitHub ยังไม่ได้ติดตั้งอยู่บนที่เก็บของคุณ ให้คลิก "ติดตั้ง Google Cloud Build" แล้วทําตามวิธีการ
- คลิกเชื่อมต่อ
- บิงโก! เชื่อมต่อที่เก็บแล้ว
- กลับไปที่ส่วนทริกเกอร์
- การกำหนดค่า: ตรวจพบโดยอัตโนมัติ (*)
- ขั้นสูง: เลือกบัญชีบริการ "[PROJECT_NUMBER]- compute@developer.gserviceaccount.com"
- xxxxx คือรหัสโปรเจ็กต์
- บัญชีบริการ Compute เริ่มต้นเหมาะสำหรับแนวทางแบบห้องทดลอง แต่อย่านำไปใช้ในระบบจริง ( ดูข้อมูลเพิ่มเติม)
- ปล่อยทุกอย่างไว้เหมือนเดิม
- คลิกปุ่ม "สร้าง"
(*) วิธีนี้เป็นวิธีที่ง่ายที่สุดเนื่องจากจะตรวจสอบหา Dockerfile หรือ cloudbuild.yaml อย่างไรก็ตาม cloudbuild.yaml
ช่วยให้คุณตัดสินใจได้อย่างแท้จริงว่าควรทําอะไรในขั้นตอนใด
ฉันมีสิทธิ์เข้าถึงแล้ว
ตอนนี้ทริกเกอร์จะไม่ทำงานเว้นแต่คุณจะให้สิทธิ์บัญชีบริการ Cloud Build (บัญชีบริการคืออะไร อีเมลของ "หุ่นยนต์" ที่ดําเนินการในนามของคุณสําหรับงานหนึ่งๆ ซึ่งในกรณีนี้คือการสร้างสิ่งต่างๆ ในระบบคลาวด์
SA จะสร้างและทำให้ใช้งานได้ไม่สำเร็จ เว้นแต่คุณจะให้สิทธิ์ SA ดำเนินการ แต่โชคดีที่การแก้ไขนั้นง่ายมาก
- ไปที่ "Cloud Build" > "Settings"
- บัญชีบริการ "[PROJECT_NUMBER]- compute@developer.gserviceaccount.com"
- เลือกช่องต่อไปนี้
- Cloud Run
- Secret Manager
- บัญชีบริการ
- Cloud Build
- เลือก "ตั้งค่าเป็นบัญชีบริการที่ต้องการ" ด้วย
ไฟล์ YAML ของ Cloud Build อยู่ที่ไหน
เราขอแนะนําอย่างยิ่งให้คุณใช้เวลาสร้าง YAML การสร้างในระบบคลาวด์ของคุณเอง
อย่างไรก็ตาม หากไม่มีเวลาหรือไม่อยากหาเวลา คุณก็ดูแรงบันดาลใจในโฟลเดอร์โซลูชัน .solutions นี้ได้
ตอนนี้คุณสามารถพุชการเปลี่ยนแปลงไปยัง GitHub และตรวจสอบ Cloud Build ในส่วนนั้นได้แล้ว
การตั้งค่า Cloud Build อาจเป็นเรื่องยาก โปรดรอการติดต่อกลับภายใน
- ตรวจสอบบันทึกใน https://console.cloud.google.com/cloud-build/builds;region=global
- การค้นหาข้อผิดพลาด
- แก้ไขโค้ดและออก git commit / git push อีกครั้ง
- บางครั้งข้อผิดพลาดไม่ได้อยู่ในโค้ด แต่อยู่ในการกำหนดค่าบางอย่าง ในกรณีนี้ คุณสามารถออกบิลด์ใหม่จาก UI (บิลด์ในระบบคลาวด์ > "ทริกเกอร์" > เรียกใช้)
โปรดทราบว่าหากใช้โซลูชันนี้ คุณยังคงต้องทํางานบางอย่าง เช่น คุณต้องตั้งค่าตัวแปร ENV สําหรับปลายทาง dev/prod ที่สร้างขึ้นใหม่ ดังนี้
โดยสามารถทำได้สองวิธี:
- ผ่าน UI - โดยการตั้งค่าตัวแปร ENV อีกครั้ง
- ผ่าน CLI โดยใช้สคริปต์ที่ "สมบูรณ์แบบ" สำหรับคุณ ดูตัวอย่างได้ที่ gcloud-run-deploy.sh คุณต้องปรับแต่งบางอย่าง เช่น ปลายทางและหมายเลขโปรเจ็กต์ ซึ่งดูหมายเลขโปรเจ็กต์ได้ในภาพรวมระบบคลาวด์
ฉันจะคอมมิตโค้ดไปยัง GitHub ได้อย่างไร
การสอนวิธีที่ดีที่สุดในการgit push
ไปยัง GitHub อยู่นอกเหนือขอบเขตของเวิร์กช็อปนี้ อย่างไรก็ตาม ในกรณีที่ระบบติดขัดและอยู่ใน Cloud Shell จะมี 2 วิธีดังนี้
- CLI เพิ่มคีย์ SSH ในเครื่องและเพิ่มรีโมตด้วย git@github.com:YOUR_USER/app-mod-workshop.git (แทนที่จะเป็น http)
- VSCode หากใช้เครื่องมือแก้ไข Cloud Shell คุณสามารถใช้แท็บการควบคุมแหล่งที่มา (Ctrl-Shift-G) คลิก "ซิงค์การเปลี่ยนแปลง" แล้วทําตามวิธีการ คุณควรตรวจสอบสิทธิ์บัญชี GitHub กับ vscode ได้ และดึง/พุชจากตรงนั้นได้อย่างง่ายดาย
อย่าลืม git add clodubuild.yaml
รวมกับไฟล์อื่นๆ มิฉะนั้นไฟล์จะไม่ทำงาน
"ความเท่าเทียมกันของการพัฒนา/ผลิตภัณฑ์" ในระดับลึกเทียบกับระดับตื้น [ไม่บังคับ]
หากคุณคัดลอกเวอร์ชันโมเดลจากที่นี่ คุณจะมีเวอร์ชัน DEV และ PROD ที่เหมือนกัน 2 เวอร์ชัน วิธีนี้เจ๋งมากและสอดคล้องกับกฎข้อ 10 ของแอป 12 ข้อ
อย่างไรก็ตาม เราใช้ปลายทางเว็บ 2 รายการที่แตกต่างกันเพื่อให้แอปชี้ไปยังฐานข้อมูลเดียวกัน การดำเนินการนี้เหมาะสำหรับเวิร์กช็อป แต่ในชีวิตจริง คุณควรใช้เวลาสร้างสภาพแวดล้อมเวอร์ชันที่ใช้งานจริงที่เหมาะสม ซึ่งหมายความว่าคุณจะมีฐานข้อมูล 2 ฐาน (1 ฐานสําหรับนักพัฒนาซอฟต์แวร์และ 1 ฐานสําหรับเวอร์ชันที่ใช้งานจริง) และเลือกตําแหน่งที่จะจัดเก็บฐานข้อมูลสําหรับการกู้คืนภัยพิบัติ / ความพร้อมใช้งานสูง งานนี้อยู่นอกเหนือขอบเขตของเวิร์กช็อปนี้ แต่นี่เป็นอาหารที่รอให้คุณคิดนะ
หากมีเวลาทำเวอร์ชัน "ขั้นสูง" ของเวอร์ชันที่ใช้งานจริง โปรดคำนึงถึงทรัพยากรทั้งหมดที่ต้องทำสำเนา เช่น
- ฐานข้อมูล Cloud SQL (และอาจเป็นอินสแตนซ์ SQL)
- ที่เก็บข้อมูล GCS
- Cloud Function
- คุณอาจใช้ Gemini 1.5 Flash เป็นรุ่นที่กำลังพัฒนา (ถูกลงและเร็วขึ้น) และ Gemini 1.5 Pro (มีประสิทธิภาพมากกว่า)
โดยทั่วไปแล้ว ทุกครั้งที่คุณทําสิ่งใดกับแอป ให้คิดอย่างถี่ถ้วนว่าเวอร์ชันที่ใช้งานจริงควรมีค่าเดียวกันนี้หรือไม่ หากไม่ ให้ทำซ้ำ แน่นอนว่าเรื่องนี้จะง่ายขึ้นมากด้วย Terraform ซึ่งคุณสามารถแทรกสภาพแวดล้อม (-dev, -prod) เป็นส่วนต่อท้ายทรัพยากรได้
8. โมดูล 6: ย้ายไปยัง Google Cloud Storage
พื้นที่เก็บข้อมูล
ปัจจุบันแอปจัดเก็บสถานะไว้ในคอนเทนเนอร์ Docker หากเครื่องขัดข้อง แอประเบิด หรือเพียงแค่คุณพุชการแก้ไขใหม่ ระบบจะกำหนดเวลาให้ไฟล์ใหม่พร้อมพื้นที่เก็บข้อมูลรีเซ็ต (=>ว่างเปล่า) 🙈
วิธีแก้ไขมีด้วยกันหลายวิธี
- จัดเก็บรูปภาพในฐานข้อมูล เราใช้วิธีนี้กับแอป PHP ก่อนหน้านี้ ซึ่งเป็นวิธีแก้ปัญหาที่ง่ายที่สุดเนื่องจากไม่เพิ่มความซับซ้อน แต่วิธีนี้จะทำให้เวลาในการตอบสนองและภาระงานของฐานข้อมูลเพิ่มขึ้น
- ย้ายข้อมูลแอป Cloud Run ไปยังโซลูชันที่ประหยัดพื้นที่เก็บข้อมูล: GCE + ดิสก์ถาวร อาจเป็น GKE + Storage ใช่ไหม
- ย้ายไปที่ GCS Google Cloud Storage มีพื้นที่เก็บข้อมูลที่ดีที่สุดสำหรับทั้ง Google Cloud และเป็นโซลูชันที่เหมาะกับระบบคลาวด์มากที่สุด แต่วิธีนี้ทำให้เราต้องยุ่งเกี่ยวกับไลบรารี PHP เรามีไลบรารี PHP 5.7 สำหรับ GCS ไหม
PHP 5.7
รองรับComposer
ไหม (ดูเหมือนว่า PHP 5.3.2 เป็นเวอร์ชันต่ำสุดที่ Composer รองรับ) - อาจจะใช้ docker sidecar ไหม
- หรืออาจใช้ การต่อเชื่อม Cloud Run Volume ของ GCS ฟังดูเยี่ยมไปเลย
🤔 ย้ายข้อมูลพื้นที่เก็บข้อมูล (ปลายเปิด)
[คำถามปลายเปิด] ในแบบฝึกหัดนี้ เราอยากให้คุณหาทางแก้ไขในการย้ายรูปภาพด้วยวิธีการใดวิธีการหนึ่ง
การทดสอบการยอมรับ
เราไม่ได้ต้องการบอกวิธีแก้ปัญหาให้คุณทราบ แต่เราต้องการให้คุณดำเนินการดังนี้
- คุณอัปโหลด
newpic.jpg
คุณจะเห็นข้อมูลนี้ในแอป - คุณอัปเกรดแอปเป็นเวอร์ชันใหม่
newpic.jpg
ยังคงแสดงอยู่
💡 แนวทางแก้ปัญหาที่เป็นไปได้ (การต่อเชื่อมวอลุ่ม Cloud Run ของ GCS)
วิธีนี้เป็นโซลูชันที่สวยงามซึ่งช่วยให้เราอัปโหลดไฟล์แบบเก็บสถานะโดยไม่ต้องแตะโค้ดเลย (นอกเหนือจากการแสดงคำอธิบายรูปภาพแล้ว แต่ก็เป็นเรื่องเล็กน้อยและแค่ทำให้สายตาพอใจ)
ซึ่งจะช่วยให้คุณมาสก์โฟลเดอร์จาก Cloud Run ไปยัง GCS ได้ ดังนี้
- การอัปโหลดทั้งหมดไปยัง GCS จะปรากฏในแอปของคุณ
- การอัปโหลดทั้งหมดไปยังแอปของคุณจะอัปโหลดไปยัง GCS
- ความมหัศจรรย์จะเกิดขึ้นกับออบเจ็กต์ที่อัปโหลดใน GCS (บทที่ 7)
หมายเหตุ โปรดอ่านข้อกำหนดในการให้บริการของ FUSE โปรดทราบว่าวิธีนี้ "ใช้ไม่ได้" หากเป็นปัญหาเรื่องประสิทธิภาพ
สร้างที่เก็บข้อมูล GCS
GCS คือบริการพื้นที่เก็บข้อมูลที่มีให้บริการในทุกที่ของ Google Cloud บริการนี้ผ่านการทดสอบการใช้งานจริง และบริการ GCP ทุกบริการที่ต้องใช้พื้นที่เก็บข้อมูลก็นำมาใช้
โปรดทราบว่า Cloud Shell จะส่งออก PROJECT_ID เป็น GOOGLE_CLOUD_PROJECT
$ export PROJECT_ID=$GOOGLE_CLOUD_PROJECT
#!/bin/bash
set -euo pipefail
# Your Cloud Run Service Name, eg php-amarcord-dev
SERVICE_NAME='php-amarcord-dev'
BUCKET="${PROJECT_ID}-public-images"
GS_BUCKET="gs://${BUCKET}"
# Create bucket
gsutil mb -l "$GCP_REGION" -p "$PROJECT_ID" "$GS_BUCKET/"
# Copy original pictures there - better if you add an image of YOURS before.
gsutil cp ./uploads/*.png "$GS_BUCKET/"
กำหนดค่า Cloud Run เพื่อต่อเชื่อมที่เก็บข้อมูลใน /uploads/ โฟลเดอร์
ทีนี้มาพูดถึงส่วนที่น่าสนใจกัน เราสร้างวอลุ่ม php_uploads
และสั่งให้ Cloud Run ทำการต่อเชื่อม FUSE ใน MOUNT_PATH
(เช่น /var/www/html/uploads/
)
#!/bin/bash
set -euo pipefail
# .. keep variables from previous script..
# Uploads folder within your docker container.
# Tweak it for your app code.
MOUNT_PATH='/var/www/html/uploads/'
# Inject a volume mount to your GCS bucket in the right folder.
gcloud --project "$PROJECT_ID" beta run services update "$SERVICE_NAME" \
--region $GCP_REGION \
--execution-environment gen2 \
--add-volume=name=php_uploads,type=cloud-storage,bucket="$BUCKET" \
--add-volume-mount=volume=php_uploads,mount-path="$MOUNT_PATH"
จากนั้นทำซ้ำขั้นตอนนี้กับปลายทางทั้งหมดที่ต้องการชี้ไปยัง Cloud Storage
คุณยังดำเนินการเดียวกันนี้จาก UI ได้อีกด้วย
- ในแท็บ "วอลุ่ม" ให้สร้างการต่อเชื่อมวอลุ่มที่ชี้ไปยังที่เก็บข้อมูลประเภท "ที่เก็บข้อมูล Cloud Storage" เช่น ใช้ชื่อ "php_uploads"
- ในส่วนคอนเทนเนอร์ > การต่อเชื่อมวอลุ่ม ให้ต่อเชื่อมวอลุ่มที่คุณเพิ่งสร้างขึ้นในจุดวอลุ่มที่แอปขอ โดยการดำเนินการนี้ขึ้นอยู่กับไฟล์ Dockerfile แต่อาจมีลักษณะดังนี้
var/www/html/uploads/
ไม่ว่าจะด้วยวิธีใดก็ตาม หากการแก้ไขใช้งานได้ การแก้ไขการแก้ไข Cloud Run ใหม่ควรแสดงข้อมูลต่อไปนี้
ตอนนี้ให้ทดสอบแอปพลิเคชันใหม่โดยอัปโหลดรูปภาพใหม่ 1 รูปไปยังปลายทาง /upload.php
รูปภาพควรทำงานได้อย่างราบรื่นใน GCS โดยไม่ต้องเขียน PHP แม้แต่บรรทัดเดียว
เกิดอะไรขึ้น
เกิดสิ่งมหัศจรรย์ขึ้น
แอปพลิเคชันเก่าที่มีโค้ดเก่ายังคงดำเนินการอยู่ สแต็กใหม่ที่ทันสมัยช่วยให้เรามีรูปภาพทั้งหมดในแอปของเราอยู่ในที่เก็บข้อมูล Cloud แบบมีสถานะได้อย่างสะดวกสบาย ตอนนี้ไร้ขีดจำกัด
- หากต้องการส่งอีเมลทุกครั้งที่มีรูปภาพ "อันตราย" หรือ "ภาพเปลือย" เข้ามา ซึ่งทำได้โดยไม่ต้องแตะโค้ด PHP
- หากต้องการใช้โมเดลมัลติโมดัลของ Gemini ทุกครั้งที่มีรูปภาพเข้ามาเพื่ออธิบายรูปภาพนั้น และอัปโหลด DB พร้อมคำอธิบาย ซึ่งคุณทําได้โดยไม่ต้องแตะโค้ด PHP ไม่เชื่อฉันใช่ไหม อ่านต่อในบทที่ 7
เราเพิ่งเปิดโอกาสใหม่ๆ มากมาย
9. โมดูลที่ 7: เพิ่มประสิทธิภาพแอปด้วย Google Gemini
ตอนนี้คุณมีแอป PHP ใหม่ที่ทันสมัยและยอดเยี่ยม (เหมือน Fiat 126
ปี 2024) พร้อมพื้นที่เก็บข้อมูลระบบคลาวด์
คุณใช้ชื่อช่องทำอะไรได้บ้าง
ข้อกำหนดเบื้องต้น
ในบทก่อนหน้า โซลูชันโมเดลช่วยให้เราต่อเชื่อมรูปภาพ /uploads/
ใน GCS ได้ ซึ่งโดยพฤตินัยแล้วเป็นการแยกตรรกะของแอปออกจากพื้นที่เก็บข้อมูลรูปภาพ
การออกกำลังกายนี้กำหนดให้คุณต้องดำเนินการต่อไปนี้
- ทําแบบฝึกหัดในบทที่ 6 (พื้นที่เก็บข้อมูล) จนเสร็จสมบูรณ์
- มีที่เก็บข้อมูล GCS ที่มีรูปภาพการอัปโหลด ซึ่งผู้ใช้จะอัปโหลดรูปภาพในแอปของคุณและรูปภาพจะส่งไปยังที่เก็บข้อมูล
ตั้งค่าฟังก์ชันระบบคลาวด์ (ใน Python)
เคยสงสัยไหมว่าจะติดตั้งใช้งานแอปพลิเคชันแบบขับเคลื่อนด้วยเหตุการณ์ได้อย่างไร ประมาณนี้
- เมื่อ <event> เกิดขึ้น => ส่งอีเมล
- เมื่อ <event> เกิดขึ้น => หาก <condition> เป็นจริง ให้อัปเดตฐานข้อมูล
เหตุการณ์อาจเป็นอะไรก็ได้ ตั้งแต่ระเบียนใหม่ที่มีอยู่ใน BigQuery, ออบเจ็กต์ใหม่ที่เปลี่ยนแปลงในโฟลเดอร์ใน GCS หรือข้อความใหม่ที่รออยู่ในคิวใน Pub/Sub
Google Cloud รองรับแพลตฟอร์มหลายรูปแบบเพื่อให้บรรลุเป้าหมายนี้ สิ่งที่เห็นได้ชัดที่สุดคือ
- EventArc ดูวิธีรับเหตุการณ์ GCS เหมาะสําหรับการสร้าง DAG และประสานงานการดำเนินการตามเงื่อนไข if-then-else ในระบบคลาวด์
- Cloud Scheduler เหมาะสําหรับงาน cron ในเวลาเที่ยงคืนในระบบคลาวด์ เป็นต้น
- Cloud Workflows เช่นเดียวกับ Event Arc
- ฟังก์ชัน Cloud Run (เป็นที่รู้จักในชื่อ
lambdas
) - Cloud Composer โดยทั่วไปแล้วคือ Apache Airflow เวอร์ชัน Google ซึ่งเหมาะสําหรับ DAG ด้วย
ในการฝึกนี้ เราจะเจาะลึก Cloud Function เพื่อให้ได้ผลลัพธ์ที่น่าทึ่ง และเราจะมีแบบฝึกหัดที่ไม่บังคับให้คุณ
โปรดทราบว่าโค้ดตัวอย่างมีอยู่ใน .solutions/
ตั้งค่า Cloud Function (🐍 python)
เราพยายามสร้าง GCF ที่มุ่งมั่นมาก
- เมื่อสร้างรูปภาพใหม่บน GCS (อาจเป็นเพราะมีคนอัปโหลดลงในแอป แต่ไม่ใช่แค่นั้น)
- .. call Gemini to describe it and get a textual description of the image .. (would be nice to check the MIME and ensure its an image and not a PDF, MP3, or Text)
- .. และอัปเดต DB ด้วยคําอธิบายนี้ (ซึ่งอาจต้องมีการแก้ไข DB เพื่อเพิ่มคอลัมน์
description
ลงในตารางimages
)
แพตช์ DB เพื่อเพิ่ม description
ลงในรูปภาพ
- เปิด Cloud SQL Studio ด้วยคำสั่งต่อไปนี้
- ป้อนชื่อผู้ใช้และรหัสผ่านสําหรับฐานข้อมูลรูปภาพ
- แทรก SQL นี้ ซึ่งจะเพิ่มคอลัมน์สำหรับคำอธิบายรูปภาพ
ALTER TABLE images ADD COLUMN description TEXT;
และ bingo ลองตรวจสอบว่าได้ผลหรือไม่
SELECT * FROM images;
คุณควรเห็นคอลัมน์คำอธิบายใหม่ดังนี้
เขียน Gemini f(x)
หมายเหตุ ฟังก์ชันนี้สร้างขึ้นด้วยความช่วยเหลือจากฟีเจอร์ช่วยเขียนโค้ดของ Gemini
หมายเหตุ การสร้างฟังก์ชันนี้อาจทำให้เกิดข้อผิดพลาดเกี่ยวกับสิทธิ์ IAM บางส่วนแสดงไว้เป็นเอกสารที่ด้านล่างในย่อหน้า "ข้อผิดพลาดที่เป็นไปได้"
- เปิดใช้ API
- ไปที่ https://console.cloud.google.com/functions/list
- คลิก "สร้างฟังก์ชัน"
- เปิดใช้ API จากวิซาร์ด API
คุณสร้าง GCF จาก UI หรือจากบรรทัดคำสั่งก็ได้ โดยเราจะใช้บรรทัดคำสั่ง
ดูรหัสที่เป็นไปได้ได้ที่ .solutions/
- สร้างโฟลเดอร์เพื่อโฮสต์โค้ด เช่น "gcf/" เข้าสู่โฟลเดอร์
- สร้างไฟล์
requirements.txt
google-cloud-storage
google-cloud-aiplatform
pymysql
- สร้างฟังก์ชัน Python โค้ดตัวอย่างที่นี่: gcf/main.py
#!/usr/bin/env python
"""Complete this"""
from google.cloud import storage
from google.cloud import aiplatform
import vertexai
from vertexai.generative_models import GenerativeModel, Part
import os
import pymysql
import pymysql.cursors
# Replace with your project ID
PROJECT_ID = "your-project-id"
GEMINI_MODEL = "gemini-1.5-pro-002"
DEFAULT_PROMPT = "Generate a caption for this image: "
def gemini_describe_image_from_gcs(gcs_url, image_prompt=DEFAULT_PROMPT):
pass
def update_db_with_description(image_filename, caption, db_user, db_pass, db_host, db_name):
pass
def generate_caption(event, context):
"""
Cloud Function triggered by a GCS event.
Args:
event (dict): The dictionary with data specific to this type of event.
context (google.cloud.functions.Context): The context parameter contains
event metadata such as event ID
and timestamp.
"""
pass
- พุชฟังก์ชัน คุณสามารถใช้สคริปต์ที่มีลักษณะดังนี้ gcf/push-to-gcf.sh
หมายเหตุ 1 ตรวจสอบว่าได้ระบุ ENV ด้วยค่าที่ถูกต้องหรือเพิ่มค่าไว้ด้านบน (GS_BUCKET=blah
, ..) ดังนี้
หมายเหตุ 2 ซึ่งจะพุชโค้ดทั้งหมดในเครื่อง (.
) ดังนั้นโปรดตรวจสอบว่าได้ใส่โค้ดไว้ในโฟลเดอร์ที่เฉพาะเจาะจงและใช้ .gcloudignore
อย่างมือโปรเพื่อหลีกเลี่ยงการพุชไลบรารีขนาดใหญ่ ( ตัวอย่าง)
#!/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
ด้วย
การทดสอบ 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 ซึ่งสามารถใส่คำอธิบายประกอบเนื้อหาของรูปภาพอย่างที่มนุษย์ทำได้ และอัปเดตฐานข้อมูลโดยอัตโนมัติ ว้าว
ขั้นตอนถัดไปคือ คุณใช้เหตุผลเดียวกันนี้เพื่อให้ได้ฟังก์ชันการทำงานที่ยอดเยี่ยม 2 อย่างได้
[ไม่บังคับ] เพิ่ม Cloud Functions เพิ่มเติม [คำถามปลายเปิด]
ฟีเจอร์เพิ่มเติมที่นึกออกมีดังนี้
📩 ทริกเกอร์อีเมล
ทริกเกอร์อีเมลที่จะส่งอีเมลถึงคุณทุกครั้งที่มีคนส่งรูปภาพ
- หากบ่อยเกินไป เพิ่มข้อจำกัดเพิ่มเติม: รูปภาพขนาดใหญ่ หรือรูปภาพที่มีเนื้อหา Gemini ซึ่งมีคำว่า "เปลือย/ภาพเปลือย/รุนแรง"
- ลองตรวจสอบ
EventArc
สำหรับเรื่องนี้
🚫 ดูแลรูปภาพไม่เหมาะสมโดยอัตโนมัติ
ปัจจุบันผู้ดูแลระบบจะแจ้งว่ารูปภาพ "ไม่เหมาะสม" ให้คุณ Gemini จัดการภาระหนักและดูแลพื้นที่ทำงานแทนดีไหม เพิ่มการทดสอบเพื่อแจ้งเนื้อหาทริกเกอร์ที่ไม่เหมาะสมและอัปเดตฐานข้อมูลตามที่เราได้เรียนรู้ในฟังก์ชันก่อนหน้า ซึ่งหมายความว่าโดยพื้นฐานแล้ว จะใช้ฟังก์ชันก่อนหน้า เปลี่ยนพรอมต์ และอัปเดตฐานข้อมูลตามคำตอบ
ข้อควรระวัง Generative AI มีผลลัพธ์ที่คาดเดาไม่ได้ ตรวจสอบว่า "เอาต์พุตครีเอทีฟโฆษณา" จาก Gemini ทำงานได้อย่างถูกต้อง คุณอาจถามคําตอบเชิงกำหนด เช่น คะแนนความเชื่อมั่นตั้งแต่ 0 ถึง 1, JSON, .. คุณสามารถถามได้หลายวิธี เช่น * การใช้ไลบรารี Python pydantic
, langchain
, .. * ใช้เอาต์พุตที่มีโครงสร้างของ Gemini
เคล็ดลับ คุณอาจมีฟังก์ชันหลายรายการหรือพรอมต์เดียวที่บังคับใช้คำตอบ JSON (ทำงานได้ดีกับ "Structured Output ของ 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 ซึ่งคอยฟังที่เก็บข้อมูล GCS ใช้งานได้ คุณต้องตั้งค่าสิทธิ์ที่เหมาะสมให้กับบัญชีบริการที่คุณใช้สำหรับงานดังที่แสดงในรูปภาพ
คุณอาจต้องเปิดใช้ EventArc API ด้วย ซึ่งอาจใช้เวลา 2-3 นาทีจึงจะพร้อมใช้งานอย่างเต็มรูปแบบ
ข้อผิดพลาด: ไม่มีผู้เรียกใช้ Cloud Run
- ความคิดเห็นอีกรายการจาก UI สําหรับการให้สิทธิ์ GCF คือ ( บทบาทผู้เรียกใช้ Cloud Run)
ข้อผิดพลาดนี้แก้ไขได้ด้วยการเรียกใช้คําสั่งในรูปภาพ ซึ่งคล้ายกับ fix-permissions.sh
ปัญหานี้อธิบายไว้ที่นี่ https://cloud.google.com/functions/docs/securing/authenticating
ข้อผิดพลาด: ใช้งานหน่วยความจำเกินขีดจำกัดแล้ว
ครั้งแรกที่เรียกใช้ บันทึกแจ้งว่า "ใช้หน่วยความจำได้เกินขีดจำกัด 244 MiB เมื่อใช้ไปแล้ว 270 MiB ลองเพิ่มขีดจำกัดหน่วยความจำ โปรดดู https://cloud.google.com/functions/docs/configuring/memory'" เพิ่ม RAM ลงใน GCF อีกครั้ง ขั้นตอนนี้ทำได้ง่ายมากใน UI กราฟที่ยกตัวขึ้นที่เป็นไปได้มีดังนี้
หรือจะแก้ไขสคริปต์การทำให้ใช้งานได้จริงของ Cloud Run เพื่อเพิ่ม MEM/CPU ก็ได้ การดำเนินการนี้จะใช้เวลานานกว่า
ข้อผิดพลาด: PubSub เผยแพร่แล้ว
การสร้างทริกเกอร์ด้วย GCF v1 ให้ข้อผิดพลาดนี้ 1 ครั้ง
ปัญหานี้แก้ไขได้ง่ายๆ โดยไปที่ IAM แล้วให้บทบาท "ผู้เผยแพร่ Pub/Sub" แก่บัญชีบริการ
ข้อผิดพลาด: ไม่ได้ใช้ Vertex AI
หากได้รับข้อผิดพลาดนี้
สิทธิ์ถูกปฏิเสธ: 403 Vertex AI API ไม่เคยใช้ในโปรเจ็กต์ YOUR_PROJECT มาก่อนหรือถูกปิดใช้ เปิดใช้โดยไปที่ https://console.developers.google.com/apis/api/aiplatform.googleapis.com/overview?project=YOR_PROJECT
เพียงเปิดใช้ Vertex AI APis วิธีที่ง่ายที่สุดในการเปิดใช้ API ที่จําเป็นทั้งหมดมีดังนี้
- https://console.cloud.google.com/vertex-ai
- คลิก "เปิดใช้ API ที่แนะนำทั้งหมด"
ข้อผิดพลาด: ไม่พบทริกเกอร์ EventArc
หากได้รับข้อความนี้ โปรดทำให้ฟังก์ชันใช้งานได้อีกครั้ง
ข้อผิดพลาด: กำลังจัดสรร Agent บริการ 400 รายการ
กำลังจัดสรร Agent บริการ 400 รายการ ( https://cloud.google.com/vertex-ai/docs/general/access-control#service-agents ) ต้องใช้ Agent บริการเพื่ออ่านไฟล์ Cloud Storage ที่ให้ไว้ โปรดลองอีกครั้งในอีกสักครู่
หากเป็นเช่นนี้ โปรดรอสักครู่หรือสอบถามเจ้าหน้าที่ของ Google
10. โมดูล 8: สร้าง SLO ความพร้อมใช้งาน
ในบทนี้ เราพยายามบรรลุเป้าหมายต่อไปนี้
- การสร้าง SLI
- การสร้าง SLO ตาม SLI
- การสร้างการแจ้งเตือนตาม SLO
หัวข้อนี้เป็นหัวข้อที่นักเขียนชื่นชอบมาก เนื่องจาก Riccardo ทํางานด้าน SRE / DevOps ของ Google Cloud
(ไม่จำกัด) สร้าง SLI และ SLO สําหรับแอปนี้
แอปจะดีแค่ไหนหากคุณไม่รู้เลยว่าแอปหยุดทำงานเมื่อใด
SLO คืออะไร
บังเอิญจริงๆ Google เป็นผู้คิดค้น SLO หากต้องการอ่านเพิ่มเติม เราขอแนะนำดังนี้
- SRE Book - บทที่ 2 - การใช้ SLO ( 👉 SREbooks เพิ่มเติม)
- ศิลปะของ SLO ( วิดีโอเจ๋งมาก) การฝึกอบรมนี้ยอดเยี่ยมมากในการดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีสร้าง SLO ที่สมบูรณ์แบบสำหรับบริการของคุณ
- หลักสูตร SRE ใน Coursera ฉันมีส่วนร่วมในเรื่องนี้
ขั้นตอนที่ 1: สร้าง SLI/SLO ความพร้อมใช้งาน
มาเริ่มกันที่ SLO ความพร้อมใช้งาน เนื่องจากเป็นสิ่งที่สำคัญที่สุดและวัดได้ง่ายที่สุด
แต่โชคดีที่ Cloud Run มีการสนับสนุน SLO ที่สร้างขึ้นล่วงหน้าด้วย Istio
เมื่อแอปอยู่ใน Cloud Run แล้ว การดำเนินการนี้ทำได้ง่ายมาก เราใช้เวลาเพียง 30 วินาที
- ไปที่หน้า Cloud Run
- คลิก/เลือกแอป
- เลือกแท็บ
SLOs
- คลิก "+ สร้าง SLO"
- ความพร้อมจำหน่ายสินค้าตามคำขอ
- ต่อไป
- เดือนตามปฏิทิน / 99%
- คลิก "สร้าง SLO"
ขั้นตอนที่ 2: ตั้งค่าการแจ้งเตือนเกี่ยวกับ SLO นี้
ฉันขอแนะนำให้สร้างการแจ้งเตือน 2 รายการ ได้แก่
- รายการที่มีอัตราการเผาไหม้ต่ำ ("การเผาไหม้ช้า") เพื่อแจ้งเตือนคุณทางอีเมล (จำลองตั๋วที่มีลําดับความสําคัญต่ำ)
- รายการที่มีอัตราการใช้สูง ("Fastburn") เพื่อแจ้งเตือนคุณทาง SMS (จำลองคำขอแจ้งปัญหาที่มีลำดับความสำคัญสูง/เครื่องส่งข้อความ)
ไปที่ SLO tab
จากก่อนหน้า
ทำดังนี้ 2 ครั้ง
- คลิก "สร้างการแจ้งเตือน SLO" (ปุ่ม 🔔 ที่มีเครื่องหมายบวกอยู่ด้านในทางด้านขวา)
- ระยะเวลามองย้อนกลับ เกณฑ์อัตราการเผาผลาญ
- [FAST] ครั้งแรก:
60
นาที /10
x - [ช้า] วินาที:
720
นาที /2
x - ช่องทางการแจ้งเตือน: คลิก "จัดการช่องทางการแจ้งเตือน"
- ก่อนอื่น "อีเมล" -> เพิ่มใหม่ -> ..
- จากนั้น "SMS" -> เพิ่มใหม่ -> ยืนยันทางโทรศัพท์
- เคล็ดลับ: เราชอบใช้อีโมจิในชื่อ ใช้การสาธิตได้อย่างสนุกสนาน
- เมื่อเสร็จแล้ว ให้คลิก X ขนาดใหญ่ที่ด้านขวาบน
- เลือกโทรศัพท์ก่อน (เร็ว) แล้วเลือกอีเมลถัดไป (ช้า)
- เพิ่มเอกสารตัวอย่าง เช่น
[PHP Amarcord] Riccardo told me to type sudo reboot or to check documentation in http://example.com/playbooks/1.php but I guess he was joking
บิงโก
ผลลัพธ์สุดท้าย
เราจะถือว่าการฝึกนี้เสร็จสมบูรณ์เมื่อคุณมี SLO ที่ใช้งานได้ 1 รายการ + การแจ้งเตือนความพร้อม 2 ครั้ง และการแจ้งเตือนดังกล่าวส่งไปยังอีเมลและโทรศัพท์ของคุณ
หากต้องการ คุณก็เพิ่มเวลาในการตอบสนอง (และเราขอแนะนําอย่างยิ่งให้คุณทําเช่นนั้น) หรือแม้แต่รายการที่ซับซ้อนกว่านั้นก็ได้ สําหรับเวลาในการตอบสนอง ให้เลือกค่าที่คุณคิดว่าเหมาะสม หากไม่แน่ใจ ให้เลือก 200ms
11. ขั้นตอนถัดไป
คุณทำทุกอย่างเสร็จแล้ว มีอะไรขาดหายไป
ข้อมูลบางส่วนที่ควรพิจารณามีดังนี้
เล่นกับ Gemini
คุณใช้ Gemini ได้ 2 แบบดังนี้
- Vertex AI "วิถีระดับองค์กร" ผสมผสานกับ GCP ของคุณซึ่งเราได้ศึกษาในบทที่ 7 (GCF+Gemini) การตรวจสอบสิทธิ์ทั้งหมดทำงานได้อย่างน่าอัศจรรย์ และบริการต่างๆ เชื่อมต่อกันได้อย่างลงตัว
- AI ของ Google "เส้นทางของผู้บริโภค" คุณได้รับคีย์ Gemini API จากที่นี่และเริ่มสร้างสคริปต์เล็กๆ ที่สามารถนำไปผูกไว้กับภาระงานที่คุณมีอยู่แล้ว (งานที่เป็นกรรมสิทธิ์, ระบบคลาวด์อื่นๆ, localhost, ..) เพียงแทนที่คีย์ API โค้ดก็เริ่มทำงานได้อย่างน่าอัศจรรย์แล้ว
เราขอแนะนำให้คุณลองสำรวจ (2) ด้วยโปรเจ็กต์ที่คุณสนใจ
UI Lifting
ฉันไม่เก่งเรื่อง UI แต่ Gemini ทำได้ คุณอาจใช้หน้า PHP หน้าเดียวและพูดประมาณนี้
I have a VERY old PHP application. I want to touch it as little as possible. Can you help me:
1. add some nice CSS to it, a single static include for tailwind or similar, whatever you prefer
2. Transform the image print with description into cards, which fit 4 per line in the canvas?
Here's the code:
-----------------------------------
[Paste your PHP page, for instance index.php - mind the token limit!]
คุณทําสิ่งเหล่านี้ได้ง่ายๆ ในไม่ถึง 5 นาทีด้วย Cloud Build :)
คำตอบจาก Gemini ยอดเยี่ยมมาก (หมายความว่าฉันไม่ต้องเปลี่ยนแปลงอะไรเลย)
และนี่คือเลย์เอาต์ใหม่ในแอปส่วนตัวของผู้เขียน
หมายเหตุ: โค้ดจะวางเป็นรูปภาพเนื่องจากเราไม่อยากให้คุณใช้โค้ดนี้ แต่ให้ Gemini เขียนโค้ดให้คุณด้วยข้อจำกัด UI/ส่วนหน้าของครีเอทีฟโฆษณาของคุณเอง เชื่อเถอะว่าหลังจากนั้นคุณจะต้องเปลี่ยนแปลงเล็กน้อยมาก
ความปลอดภัย
การรักษาความปลอดภัยของแอปนี้อย่างเหมาะสมไม่ใช่เป้าหมายของเวิร์กช็อป 4 ชั่วโมงนี้
ลองดู SECURITY
doc
เพื่อหาไอเดีย
12. ยินดีด้วย
ขอแสดงความยินดี 🎉🎉🎉 คุณได้ทำให้แอปพลิเคชัน PHP รุ่นเดิมทันสมัยด้วย Google Cloud เรียบร้อยแล้ว
โดยสรุปแล้ว คุณได้เรียนรู้เกี่ยวกับ Codelab นี้ดังนี้
- วิธีทำให้ฐานข้อมูล MYSQL ใช้งานได้ใน 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 สำหรับกรณีการใช้งานที่เหมาะสม
นี่เป็นจุดเริ่มต้นที่ดีในเส้นทางการปรับแอปพลิเคชันให้ทันสมัยด้วย Google Cloud
🔁 ความคิดเห็น
หากต้องการบอกเล่าประสบการณ์ที่คุณได้รับจากเวิร์กช็อปนี้ โปรดส่งแบบฟอร์มความคิดเห็นนี้
เรายินดีรับฟังความคิดเห็นจากคุณ รวมทั้งการประชาสัมพันธ์เกี่ยวกับโค้ดที่คุณภาคภูมิใจเป็นพิเศษ
🙏 ขอขอบคุณ
ผู้เขียนต้องขอขอบคุณ Mirko Gilioli และ Maurizio Ipsale จาก Datatonic ที่ให้ความช่วยเหลือในการเขียนและทดสอบโซลูชัน