Hội thảo về cách sửa đổi ứng dụng

1. Giới thiệu

Lần cập nhật gần đây nhất: 1/11/2024

Làm cách nào để hiện đại hoá một ứng dụng PHP cũ lên Google Cloud?

(📽️ xem video giới thiệu 7 phút về lớp học lập trình này)

Thông thường, các ứng dụng cũ chạy trên máy chủ cục bộ cần được hiện đại hoá. Điều này có nghĩa là các ứng dụng đó phải có khả năng mở rộng, an toàn và có thể triển khai trong nhiều môi trường.

Trong hội thảo này, bạn sẽ:

  1. Đóng gói Ứng dụng PHP.
  2. Di chuyển sang dịch vụ cơ sở dữ liệu được quản lý ( Cloud SQL).
  3. Triển khai lên Cloud Run (một giải pháp thay thế không cần vận hành cho GKE/Kubernetes).
  4. Bảo mật Ứng dụng bằng tính năng Quản lý danh tính và quyền truy cập (IAM) và Trình quản lý bí mật.
  5. Xác định quy trình CI/CD thông qua Cloud Build. Bạn có thể kết nối Cloud Build với kho lưu trữ Git được lưu trữ trên các nhà cung cấp Git phổ biến như GitHub hoặc GitLab và kích hoạt bất kỳ lần đẩy nào vào chính.
  6. Lưu trữ hình ảnh ứng dụng trên Cloud Storage. Điều này được thực hiện thông qua việc gắn và bạn không cần mã để thay đổi ứng dụng.
  7. Giới thiệu chức năng AI tạo sinh thông qua Gemini, được điều phối thông qua Cloud Functions (không có máy chủ).
  8. Làm quen với SLOvận hành ứng dụng mới làm mới.

Bằng cách làm theo các bước này, bạn có thể từng bước hiện đại hoá ứng dụng PHP, cải thiện khả năng mở rộng, bảo mật và tính linh hoạt trong việc triển khai. Hơn nữa, việc chuyển sang Google Cloud cho phép bạn tận dụng cơ sở hạ tầng và dịch vụ mạnh mẽ của Google để đảm bảo ứng dụng của bạn chạy trơn tru trong môi trường gốc trên đám mây.

Chúng tôi tin rằng những gì bạn sẽ tìm hiểu sau các bước đơn giản này có thể được áp dụng cho ứng dụng và tổ chức của riêng bạn với ngôn ngữ/ngăn xếp và các trường hợp sử dụng khác nhau.

Giới thiệu về ứng dụng

Ứng dụng ( , theo giấy phép MIT) mà bạn sẽ tạo nhánh là một ứng dụng PHP 5.7 cơ bản có xác thực MySQL. Ý tưởng chính của Ứng dụng là cung cấp một nền tảng để người dùng có thể tải ảnh lên và quản trị viên có thể gắn thẻ hình ảnh không phù hợp. Ứng dụng có hai bảng:

  • Người dùng. Được biên dịch trước do quản trị viên tạo. Những người mới có thể đăng ký.
  • Hình ảnh. Đi kèm với một vài hình ảnh mẫu. Người dùng đã đăng nhập có thể tải ảnh mới lên. Chúng ta sẽ thêm một số hiệu ứng ở đây.

Mục tiêu của bạn

Chúng tôi muốn hiện đại hoá ứng dụng cũ để đưa ứng dụng đó vào Google Cloud. Chúng tôi sẽ khai thác các công cụ và dịch vụ của mình để cải thiện khả năng có thể mở rộng, tăng cường khả năng bảo mật, tự động hoá việc quản lý cơ sở hạ tầng, cũng như tích hợp các tính năng nâng cao như xử lý hình ảnh, giám sát và lưu trữ dữ liệu thông qua các dịch vụ như Cloud SQL, Cloud Run, Cloud Build, Secret Manager, v.v.

445f7a9ae37e9b4d.png.

Quan trọng hơn, chúng tôi muốn thực hiện từng bước để bạn có thể tìm hiểu quá trình suy nghĩ đằng sau mỗi bước và thông thường mỗi bước mở ra những khả năng mới cho những bước tiếp theo (ví dụ: mô-đun 2 -> 3 và 6 -> 7).

Chưa thuyết phục? Hãy xem video dài 7 phút này trên YouTube.

Bạn cần có

  • Máy tính có trình duyệt, kết nối với Internet.
  • Một số tín dụng GCP. Hỏi những người đam mê Google tại địa phương của bạn một số ;)
  • Lệnh gcloud đang hoạt động.
  • Bạn đang làm việc trên máy? Hãy tải xuống tại đây. Bạn cũng cần có một số trình chỉnh sửa tốt (ví dụ: vscode hoặc intellij).
  • Bạn muốn làm mọi việc "trên đám mây"? Sau đó, bạn có thể sử dụng Cloud Shell.
  • Người dùng GitHub. Bạn cần mã này để phân nhánh mã gốc 🧑🏻 💻 gdgpescara/app-mod-workshop bằng kho lưu trữ git của riêng bạn. Điều này là cần thiết để có quy trình CI/CD của riêng bạn (tự động cam kết -> tạo -> triển khai)

Bạn có thể xem các giải pháp mẫu tại đây:

Bạn có thể tham gia hội thảo này trên máy tính hoặc hoàn toàn trên trình duyệt.

2. Thiết lập khoản tín dụng và phân nhánh

6dafc658860c0ce5.png

Sử dụng khoản tín dụng GCP và thiết lập môi trường GCP [không bắt buộc]

Để tham gia hội thảo này, bạn cần có một Tài khoản thanh toán có một số khoản tín dụng. Nếu đã có thông tin thanh toán của riêng mình, bạn có thể bỏ qua bước này.

Tạo một tài khoản Gmail mới của Google (*) để liên kết với khoản tín dụng GCP của bạn. Hãy hỏi người hướng dẫn của bạn về đường liên kết để sử dụng khoản tín dụng GCP hoặc sử dụng khoản tín dụng tại đây: bit.ly/PHP-Amarcord-credits .

Đăng nhập bằng tài khoản mới tạo rồi làm theo hướng dẫn.

ff739240dbd84a30.png

()

) Tại sao tôi cần một tài khoản Gmail hoàn toàn mới?*

Chúng tôi nhận thấy một số người không hoàn thành lớp học lập trình vì tài khoản của họ (đặc biệt là email công việc hoặc email của học viên) từng tiếp xúc với GCP và có Chính sách của tổ chức hạn chế họ tham gia lớp học lập trình. Bạn nên tạo một tài khoản Gmail mới hoặc sử dụng một tài khoản Gmail hiện có (gmail.com) chưa từng sử dụng GCP.

Nhấp vào nút để sử dụng khoản tín dụng này.

331658dc50213403.png

Điền Tên và Họ của bạn vào biểu mẫu sau, đồng thời đồng ý với Điều khoản và điều kiện.

Bạn có thể phải đợi vài giây trước khi Tài khoản thanh toán xuất hiện tại đây: https://console.cloud.google.com/billing

Sau khi hoàn tất, hãy mở Google Cloud Console và tạo một dự án mới bằng cách nhấp vào Bộ chọn dự án ở trình đơn thả xuống trên cùng bên trái, nơi có mục "Không có tổ chức". Xem bên dưới

bd7548f78689db0b.png

Tạo một dự án mới nếu bạn chưa có dự án như trong ảnh chụp màn hình dưới đây. Có mục "Dự án MỚI" ở góc trên cùng bên phải.

6c82aebcb9f5cd47.png

Hãy nhớ liên kết dự án mới với tài khoản thanh toán dùng thử GCP như sau.

f202527d254893fb.png

Bạn đã sẵn sàng sử dụng Google Cloud Platform. Nếu là người mới bắt đầu hoặc chỉ muốn làm mọi việc trong môi trường trên đám mây, bạn có thể truy cập vào Cloud Shell và trình chỉnh sửa của Cloud Shell thông qua nút sau ở góc trên cùng bên trái như minh hoạ bên dưới.

7d732d7bf0deb12e.png

Đảm bảo dự án mới của bạn được chọn ở trên cùng bên trái:

Chưa chọn (không tốt):

c2ffd36a781b276a.png

Đã chọn (tốt):

594563c158f4f590.pngS

Tạo nhánh ứng dụng từ GitHub

  1. Truy cập vào ứng dụng minh hoạ: https://github.com/gdgpescara/app-mod-workshop
  2. Nhấp vào biểu tượng 🍴 nĩa.
  3. Nếu chưa có tài khoản github, bạn cần tạo một tài khoản mới.
  4. Chỉnh sửa nội dung theo ý bạn.

734e51bfc29ee5df.png.

  1. Sao chép mã nguồn của Ứng dụng bằng cách sử dụng git clone https://github.com/<YOUR-GITHUB-USER>/<YOUR-REPO-NAME>
  1. Mở thư mục dự án đã sao chép bằng trình chỉnh sửa bạn yêu thích. Nếu chọn Cloud Shell, bạn có thể thực hiện việc này bằng cách nhấp vào "Open Editor" (Mở trình chỉnh sửa) như minh hoạ dưới đây.

40f5977ea4c1d1cb.png

Bạn có mọi thứ cần thiết với Trình chỉnh sửa Google Cloud Shell như hình sau

a4e5ffb3e9a35e84.png

3. Mô-đun 1: Tạo thực thể SQL

645902e511a432a6.png

Tạo phiên bản Google Cloud SQL

Ứng dụng PHP của chúng ta sẽ kết nối với cơ sở dữ liệu MySQL, do đó, chúng ta cần sao chép cơ sở dữ liệu đó sang Google Cloud để di chuyển mà không gặp bất kỳ trở ngại nào. Cloud SQL là lựa chọn phù hợp nhất vì cho phép bạn chạy một cơ sở dữ liệu MySQL được quản lý hoàn toàn trong đám mây. Sau đây là các bước cần thực hiện:

  1. Truy cập vào trang Cloud SQL: https://console.cloud.google.com/sql/instances
  2. Nhấp vào "Tạo thực thể"
  3. Bật API (nếu cần). Quá trình này có thể mất vài giây.
  4. Chọn MySQL.
  5. (Chúng tôi đang cố gắng cung cấp cho bạn phiên bản rẻ nhất để có thời hạn sử dụng lâu hơn):
  • Phiên bản: Doanh nghiệp
  • Giá trị đặt trước: phát triển (chúng tôi đã thử Hộp cát nhưng không hiệu quả)
  • Mysql Phiên bản: 5.7 (wow, a blast from the past!)
  1. Mã nhận dạng thực thể: chọn appmod-phpapp (nếu bạn thay đổi giá trị này, hãy nhớ thay đổi các tập lệnh và giải pháp trong tương lai cho phù hợp).
  2. Mật khẩu: bất cứ thông tin nào bạn muốn nhưng ghi lại là CLOUDSQL_INSTANCE_ MẬT
  3. Khu vực: giữ nguyên như bạn đã chọn cho phần còn lại của ứng dụng (ví dụ: Milan = europe-west8)
  4. Lịch phát sóng theo vùng: Một vùng (chúng tôi đang tiết kiệm tiền cho bản minh hoạ)

Nhấp vào nút Tạo phiên bản để triển khai cơ sở dữ liệu Cloud SQL; ⌛ quá trình này sẽ mất khoảng 10 phút⌛. Trong thời gian chờ đợi, hãy tiếp tục đọc tài liệu; bạn cũng có thể bắt đầu giải quyết mô-đun tiếp theo ("Đóng gói ứng dụng PHP") vì mô-đun này không có phần phụ thuộc nào trên mô-đun này trong phần đầu tiên (cho đến khi bạn khắc phục kết nối DB).

Lưu ý. Bạn sẽ phải trả khoảng 7 USD/ngày cho phiên bản này. Hãy nhớ phát hành ứng dụng sau hội thảo.

Tạo DB image_catalog và Người dùng trong Cloud SQL

Dự án Ứng dụng có một thư mục db/ chứa hai tệp sql:

  1. 01_schema.sql : Chứa mã SQL để tạo hai bảng chứa dữ liệu về Người dùng và Hình ảnh.
  2. 02_seed.sql: Chứa mã SQL để khởi tạo dữ liệu trong các bảng đã tạo trước đó.

Các tệp này sẽ được sử dụng sau khi cơ sở dữ liệu image_catalog được tạo. Bạn có thể thực hiện việc này bằng cách làm theo các bước sau:

  1. Mở thực thể của bạn rồi nhấp vào thẻ Cơ sở dữ liệu:
  2. nhấp vào "Tạo cơ sở dữ liệu"
  3. gọi là image_catalog (như trong cấu hình ứng dụng PHP).

997ef853e5ebd857.png

Sau đó, chúng ta tạo người dùng cơ sở dữ liệu. Với thông tin này, chúng ta có thể xác thực vào cơ sở dữ liệu image_catalog.

  1. Bây giờ, hãy nhấp vào thẻ Người dùng
  2. Nhấp vào "Thêm tài khoản người dùng".
  3. Người dùng: hãy tạo một lớp:
  • Tên người dùng: appmod-phpapp-user
  • Mật khẩu: Chọn một mật khẩu mà bạn có thể nhớ hoặc nhấp vào "tạo"
  • Giữ nguyên chế độ "Cho phép mọi máy chủ lưu trữ (%)".
  1. hãy nhấp vào THÊM.

Mở DB cho các IP nổi tiếng.

Xin lưu ý rằng tất cả các cơ sở dữ liệu trong Cloud SQL đều được sinh ra là "được tách biệt". Bạn cần thiết lập rõ ràng một mạng để có thể truy cập.

  1. Nhấp vào thực thể của bạn
  2. Mở trình đơn "Kết nối"
  3. Nhấp vào thẻ "Networking" (Mạng).
  4. Nhấp vào phần Mạng được uỷ quyền. Bây giờ, hãy thêm một mạng con.
  • Hiện tại, hãy chuyển sang chế độ KHÔNG AN TOÀN để cho phép Ứng dụng hoạt động:
  • Tên: "Mọi người trên thế giới – KHÔNG AN TOÀN" (hãy tự nhắc mình rằng giải pháp rẻ tiền này cũng không an toàn).
  • Mạng: "0.0.0.0/0" (Lưu ý: đây là MẠNG KHÔNG AN TOÀN!)

Nhấp vào lưu.

Bạn sẽ thấy như sau:

5ccb9062a7071964.png

Lưu ý. Giải pháp này là một giải pháp thỏa hiệp hiệu quả để kết thúc hội thảo trong O(giờ). Tuy nhiên, hãy kiểm tra tài liệu BẢO MẬT để giúp bảo mật giải pháp của bạn cho việc phát hành công khai!

Đã đến lúc kiểm tra kết nối DB!

Hãy xem người dùng image_catalog mà chúng ta đã tạo trước đó có hoạt động hay không. Truy cập vào Cloud SQL Studio bên trong phiên bản và nhập Cơ sở dữ liệu, Người dùng và Mật khẩu để xác thực như minh hoạ bên dưới:

d56765c6154c11a4.png

Giờ đây, bạn có thể mở Trình chỉnh sửa SQL và chuyển sang phần tiếp theo.

Nhập Cơ sở dữ liệu từ cơ sở mã

Sử dụng Trình chỉnh sửa SQL để nhập các bảng image_catalog cùng với dữ liệu của các bảng đó. Lấy mã SQL từ các tệp sql trong kho lưu trữ và thực thi các tệp đó theo thứ tự tuần tự. 01_schema.sql rồi đến 02_seed.sql.

Sau đó, bạn sẽ nhận được hai bảng trong image_catalog, đó là người dùnghình ảnh như được hiển thị bên dưới:

65ba01e4c6c2dac0.png

Bạn có thể kiểm thử bằng cách chạy lệnh sau trong trình chỉnh sửa: select * from images;

Ngoài ra, hãy nhớ ghi lại địa chỉ IP công khai vì bạn sẽ cần địa chỉ này sau.

4. Mô-đun 2: Đóng gói ứng dụng PHP

e7f0e9979d8805f5.png

Chúng ta muốn xây dựng ứng dụng này cho đám mây.

Điều này có nghĩa là đóng gói mã trong một loại tệp ZIP chứa tất cả thông tin để chạy mã đó trên đám mây.

Có một số cách để đóng gói:

  • Docker. Rất phổ biến, nhưng khá phức tạp để thiết lập đúng cách.
  • Gói xây dựng. Ít phổ biến hơn, nhưng có xu hướng "tự đoán" những gì cần tạo và những gì cần chạy. Thường thì cách này sẽ hiệu quả!

Trong phạm vi của hội thảo này, chúng tôi giả định rằng bạn sử dụng Docker.

Docker

Nếu bạn muốn có quyền kiểm soát, thì đây là giải pháp phù hợp với bạn. Điều này có ý nghĩa khi bạn cần định cấu hình các thư viện cụ thể và chèn một số hành vi không rõ ràng (chmod trong nội dung tải lên, tệp thực thi không chuẩn trong ứng dụng, v.v.)

Nếu chúng ta muốn triển khai ứng dụng trong vùng chứa lên Cloud Run, hãy xem tài liệu sau và cố gắng điền thông tin vào chỗ trống. Hiện tại, chúng tôi chỉ cung cấp những thông tin cần thiết để giúp bạn dễ dàng làm quen. Dockerfile cuối cùng của bạn sẽ có dạng như sau:

# 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 __________

Ngoài ra, để kiểm thử cục bộ ứng dụng, chúng ta cần thay đổi tệp config.php để Ứng dụng PHP có thể kết nối với cơ sở dữ liệu MYSQL có sẵn trên Google CloudSQL. Dựa trên những gì bạn đã thiết lập trước đó, hãy điền vào chỗ trống.

  • Db_host là địa chỉ IP công khai của Cloud SQL. Bạn có thể tìm thấy địa chỉ này trong bảng điều khiển:

bd27071bf450a8d0.png

  • Db_name không được thay đổi: image_catalog
  • Db_user phải là appmod-phpapp-user
  • Db_pass là mật khẩu bạn đã chọn. Thiết lập thuộc tính này trong dấu nháy đơn và thoát khi cần.
<?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();
?>

Ngoài ra, bạn có thể dịch một số bài viết bằng tiếng Ý sang tiếng Anh nhờ Gemini!

Ok, giờ đây bạn đã có Dockerfile và đã định cấu hình Ứng dụng PHP để kết nối với cơ sở dữ liệu, hãy thử làm điều này!

Cài đặt docker nếu bạn chưa cài đặt ( đường liên kết). Bạn không cần điều này nếu bạn đang sử dụng Cloud Shell (điều này thật tuyệt vời?).

Bây giờ, hãy thử tạo và chạy Ứng dụng PHP trong vùng chứa bằng các lệnh tạo và chạy docker thích hợp.

  • bản dựng docker -t <IMAGE_TAG_NAME> .
  • docker run -it -p <CONTAINER PORT>:<LOCAL MACHINE PORT> <IMAGE_TAG_NAME>

Nếu mọi thứ đều hoạt động, bạn sẽ thấy trang web sau đây khi kết nối với máy chủ cục bộ.

Nếu đang sử dụng Cloud Shell, bạn cũng có thể xuất cổng cục bộ (ví dụ: 8080) sang trình duyệt như sau:

docker build -t my-php-app-docker app-mod-workshop/ -f Dockerfile

docker run -it -p 8080:8080 my-php-app-docker

Bây giờ, bạn đã biết ứng dụng của mình đang chạy trên cổng 8080, hãy nhấp vào biểu tượng "Xem trước trên web" (trình duyệt có hình mắt) rồi nhấp vào Xem trước trên cổng 8080 (hoặc "Thay đổi cổng" cho bất kỳ cổng nào khác)

33a24673f4550454.png

Kiểm thử kết quả trên trình duyệt

Bây giờ, ứng dụng của bạn sẽ có dạng như sau:

2718ece96b1f18b6.png

Và nếu đăng nhập bằng Quản trị viên/admin123, bạn sẽ thấy nội dung như sau.

68b62048c2e86aea.png

Tuyệt vời!!! Đang hoạt động 🎉🎉🎉

Nếu quá trình đóng gói bằng Docker của bạn đã hoàn tất nhưng thông tin xác thực DB không chính xác, bạn có thể nhận được thông báo như sau:

e22f45b79bab86e1.png

Hãy thử lại, bạn sắp tìm được rồi!

Gói xây dựng [không bắt buộc]

Với Buildpacks, ứng dụng sẽ được tạo tự động. Rất tiếc, bạn không có toàn quyền kiểm soát nên có thể sẽ gặp phải cấu hình không mong muốn.

Bạn sẽ có một hình ảnh docker mới trong môi trường cục bộ. Bạn có thể thử chạy một vùng chứa cho ứng dụng này, nhưng vì chúng tôi không có toàn quyền kiểm soát cách hình ảnh được tạo nên ứng dụng có thể không hoạt động. Trong mọi trường hợp, bạn đều có thể thử nghiệm và chia sẻ ý kiến của mình nếu thành công. Cảm ơn bạn!

Lưu vào Cấu phần phần mềm [không bắt buộc]

Đến đây, bạn đã có một ứng dụng PHP được đóng gói trong vùng chứa đang hoạt động và sẵn sàng để triển khai lên đám mây. Tiếp theo, chúng ta cần một nơi trên đám mây để lưu trữ hình ảnh Docker và truy cập hình ảnh đó để triển khai cho các dịch vụ của Google Cloud như Cloud Run. Giải pháp lưu trữ này có tên Artifact Registry, một dịch vụ Google Cloud được quản lý toàn diện, được thiết kế để lưu trữ các cấu phần phần mềm của ứng dụng, bao gồm cả hình ảnh vùng chứa Docker, gói Maven, mô-đun npm và nhiều cấu phần phần mềm khác.

Hãy tạo một kho lưu trữ trong Google Cloud Artifact Registry bằng nút thích hợp.

e1123f0c924022e6.png

Chọn tên hợp lệ, định dạng và khu vực phù hợp để lưu trữ cấu phần phần mềm.

4e516ed209c470ee.png

Quay lại thẻ môi trường phát triển cục bộ và đẩy hình ảnh vùng chứa ứng dụng vào kho lưu trữ Cấu phần phần mềm vừa tạo. Hãy hoàn thành các lệnh sau để thực hiện việc này.

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

Kết quả sẽ có dạng như ảnh chụp màn hình sau.

1e498feb4e88be9f.png

Hoan hô 🎉🎉🎉 bạn có thể chuyển sang cấp độ tiếp theo.

Ghi chú. Ngoài ra, hãy thử điểm cuối /upload.php và thử tải một bức ảnh lên. Bạn có thể nhận được thông báo "Quyền bị từ chối". Nếu có, bạn cần khắc phục một số chmod/chown trong Dockerfile.

5. Học phần 3: Triển khai ứng dụng trên Cloud Run

9ffca42774f6c5d1.png

Tại sao nên dùng Cloud Run?

Đây là một câu hỏi hay! Vài năm trước, chắc chắn bạn sẽ chọn Google App Engine.

Nói một cách đơn giản, hiện tại, Cloud Run có một ngăn xếp công nghệ mới hơn, dễ triển khai hơn, rẻ hơn và có thể mở rộng quy mô xuống 0 khi bạn không sử dụng. Với khả năng linh hoạt để chạy mọi vùng chứa không có trạng thái và tích hợp với nhiều dịch vụ của Google Cloud, đây là giải pháp lý tưởng để triển khai các dịch vụ vi mô và ứng dụng hiện đại với mức hao tổn tối thiểu và hiệu quả tối đa.

Cụ thể hơn, Cloud Run là một nền tảng được Google Cloud quản lý toàn diện, cho phép bạn chạy các ứng dụng được đóng gói trong vùng chứa không có trạng thái trong môi trường không có máy chủ. Dịch vụ này tự động xử lý tất cả cơ sở hạ tầng, mở rộng từ 0 để đáp ứng lưu lượng truy cập đến và giảm khi không hoạt động, giúp tiết kiệm chi phí và hiệu quả. Cloud Run hỗ trợ mọi ngôn ngữ hoặc thư viện miễn là được đóng gói trong một vùng chứa, cho phép bạn linh hoạt trong quá trình phát triển. Dịch vụ này tích hợp tốt với các dịch vụ khác của Google Cloud và phù hợp để xây dựng các dịch vụ vi mô, API, trang web và ứng dụng do sự kiện điều khiển mà không cần quản lý cơ sở hạ tầng máy chủ.

Điều kiện tiên quyết

Để hoàn thành nhiệm vụ này, bạn phải cài đặt gcloud trên máy cục bộ. Nếu không, hãy xem hướng dẫn tại đây. Thay vào đó, nếu bạn đang sử dụng Google Cloud Shell, bạn không cần làm gì cả.

Trước khi triển khai...

Nếu bạn đang làm việc trong môi trường cục bộ, hãy xác thực với Google Cloud bằng cách sau

  • $ gcloud auth login –update-adc # not needed in Cloud Shell

Thao tác này sẽ xác thực bạn thông qua quy trình đăng nhập OAuth trên trình duyệt. Đảm bảo rằng bạn đăng nhập thông qua Chrome bằng chính người dùng (ví dụ: vattelapesca@gmail.com) đã đăng nhập vào Google Cloud và bật tính năng thanh toán.

Bật API Cloud Run bằng lệnh sau

  • $ gcloud services enable run.googleapis.com

Lúc này, mọi thứ đã sẵn sàng để triển khai lên Cloud Run.

Triển khai ứng dụng của bạn trên Cloud Run thông qua gcloud

Lệnh cho phép bạn triển khai Ứng dụng trên Cloud Run là gcloud run deploy. Có một vài tuỳ chọn để đặt để đạt được mục tiêu của bạn. Bộ tối thiểu bao gồm:

  1. Tên của Dịch vụ Cloud Run mà bạn muốn triển khai cho Ứng dụng của mình. Dịch vụ Cloud Run sẽ trả về cho bạn một URL cung cấp điểm cuối cho Ứng dụng của bạn.
  2. Khu vực Google Cloud nơi Ứng dụng của bạn sẽ chạy.
  3. Hình ảnh vùng chứa gói ứng dụng của bạn.
  4. Biến môi trường mà Ứng dụng của bạn cần sử dụng trong quá trình thực thi.
  5. Cờ Allow-Unauthenticated (Cho phép không xác thực) cho phép mọi người truy cập vào Ứng dụng của bạn mà không cần xác thực thêm

Hãy tham khảo tài liệu để xem cách áp dụng tuỳ chọn này cho lệnh của bạn. Quá trình triển khai sẽ mất vài phút. Nếu mọi thông tin đều chính xác, bạn sẽ thấy nội dung tương tự như sau trong Google Cloud Console.

ef1029fb62f8de81.png

f7191d579c21ca3e.png

Nhấp vào URL do Cloud Run cung cấp và kiểm thử Ứng dụng của bạn. Sau khi xác thực, bạn sẽ thấy nội dung tương tự như sau.

d571a90cd5a373f9.png

"gcloud run deploy" với "no questions"

Bạn có thể nhận thấy rằng gcloud run deploy đặt câu hỏi phù hợp và điền vào chỗ trống mà bạn để lại. Thật tuyệt vời!

Tuy nhiên, trong một số mô-đun, chúng ta sẽ thêm lệnh này vào trình kích hoạt Cloud Build để không thể trả lời câu hỏi. Chúng ta cần điền mọi tuỳ chọn vào lệnh. Vì vậy, bạn muốn tạo gcloud run deploy --option1 blah --foo bar --region your-fav-region vàng. Bạn sẽ làm những gì?

  1. lặp lại các bước 2-3-4 cho đến khi gcloud ngừng đặt câu hỏi:
  2. [LOOP] gcloud run deploy với các lựa chọn đã tìm thấy đến nay
  3. [LOOP] hệ thống yêu cầu tuỳ chọn X
  4. [LOOP] Tìm kiếm trong tài liệu công khai cách thiết lập X từ CLI bằng cách thêm tuỳ chọn --my-option [my-value].
  5. Bây giờ, hãy quay lại bước 2, trừ phi gcloud hoàn tất mà không có câu hỏi nào khác.
  6. Quá trình triển khai gcloud run BLAH BLAH BLAH này thật tuyệt vời! Lưu lệnh vào một nơi nào đó, bạn sẽ cần lệnh này sau cho bước Cloud Build!

Bạn có thể xem giải pháp tại đây.

Hoan hô 🎉🎉🎉 Bạn đã triển khai thành công Ứng dụng của mình trong Google Cloud, hoàn thành bước đầu tiên của quy trình Hiện đại hoá.

6. Học phần 4: Xoá mật khẩu bằng Secret Manager

95cd57b03b4e3c73.png

Trong bước trước, chúng ta đã có thể triển khai và chạy thành công Ứng dụng trong Cloud Run. Tuy nhiên, chúng tôi đã làm điều này bằng một phương pháp bảo mật kém hiệu quả: cung cấp một số bí mật ở dạng văn bản thô.

Lặp lại lần đầu: Cập nhật config.php để sử dụng ENV

Bạn có thể nhận thấy rằng chúng ta đã đặt mật khẩu DB ngay vào mã trong tệp config.php. Điều này là bình thường đối với mục đích kiểm thử và để xem Ứng dụng có hoạt động hay không. Tuy nhiên, bạn không thể cam kết/sử dụng mã như vậy trong môi trường phát hành chính thức. Bạn nên đọc mật khẩu (và các tham số kết nối DB khác) một cách linh động và cung cấp cho Ứng dụng trong thời gian chạy. Thay đổi tệp config.php để tệp này đọc tham số db từ các biến ENV. Nếu không thành công, bạn nên cân nhắc việc đặt giá trị mặc định. Điều này rất hữu ích trong trường hợp bạn không tải được ENV, vì vậy, kết quả trang sẽ cho bạn biết liệu trang đó có đang sử dụng các giá trị mặc định hay không. Điền vào chỗ trống và thay thế mã trong 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();
?>

Khi ứng dụng của bạn được đóng gói, bạn cần cung cấp một cách để cung cấp các biến ENV cho ứng dụng. Bạn có thể thực hiện việc này theo một số cách:

  • Tại thời điểm xây dựng, trên Dockerfile. Thêm 4 tham số vào Dockerfile trước đó bằng cú pháp ENV DB_VAR=ENV_VAR_VALUE. Thao tác này sẽ thiết lập các giá trị mặc định có thể bị ghi đè trong thời gian chạy. Ví dụ: bạn có thể đặt "DB_NAME" và "DB_USER" tại đây và không nơi nào khác.
  • Tại thời điểm chạy. Bạn có thể thiết lập các biến này cho Cloud Run, cả từ CLI hoặc từ giao diện người dùng. Đây là nơi thích hợp để đặt cả 4 biến (trừ phi bạn muốn giữ các giá trị mặc định được đặt trong Dockerfile).

Trong máy chủ cục bộ, bạn nên đặt các biến ENV vào tệp .env (kiểm tra thư mục solutions (giải pháp)).

Ngoài ra, hãy đảm bảo rằng .env được thêm vào .gitignore : bạn không muốn đẩy thông tin bí mật của mình lên Github!

echo .env >> .gitignore

Sau đó, bạn có thể kiểm thử thực thể trên máy:

docker run -it -p 8080:8080 --env-file .env my-php-app-docker

Giờ đây, bạn đã đạt được những thành tựu sau:

  1. Ứng dụng của bạn sẽ đọc biến một cách linh động từ ENV
  2. Bạn đã cải thiện tính bảo mật vì đã xoá mật khẩu DB khỏi mã của mình)

Giờ đây, bạn có thể triển khai một bản sửa đổi mới cho Cloud Run. Hãy chuyển sang giao diện người dùng và đặt các biến môi trường theo cách thủ công:

  • Truy cập vào https://console.cloud.google.com/run
  • Nhấp vào ứng dụng của bạn
  • Nhấp vào "Chỉnh sửa và triển khai bản sửa đổi mới"
  • Trên thẻ đầu tiên "(Các) vùng chứa", hãy nhấp vào thẻ dưới cùng "Biến và thông tin bảo mật"
  • Nhấp vào "+ Thêm biến" rồi thêm tất cả biến cần thiết. Bạn sẽ thấy kết quả như sau:

7a5fbfa448544d3.png.

f2780c35585388ca.png

Có hoàn hảo không? Không. Hầu hết các nhà mạng vẫn nhìn thấy thẻ PASS của bạn. Bạn có thể giảm thiểu rủi ro này bằng Trình quản lý bí mật của Google Cloud.

Lặp lại lần thứ hai: Trình quản lý bí mật

Mật khẩu của bạn đã biến mất khỏi mã của chính bạn: chiến thắng! Nhưng chờ đã – chúng ta đã an toàn chưa?

Mật khẩu của bạn vẫn hiển thị với những người có quyền truy cập vào Google Cloud Console. Trên thực tế, nếu truy cập vào tệp triển khai YAML của Cloud Run, bạn sẽ có thể truy xuất tệp đó. Hoặc nếu bạn cố gắng chỉnh sửa hoặc triển khai một bản sửa đổi Cloud Run mới, mật khẩu sẽ xuất hiện trong phần Biến và khoá như trong ảnh chụp màn hình bên dưới.

Trình quản lý bí mật của Google Cloud là một dịch vụ tập trung, an toàn để quản lý thông tin nhạy cảm như khoá API, mật khẩu, chứng chỉ và các thông tin bí mật khác.

Thư viện này cho phép bạn lưu trữ, quản lý và truy cập vào các thông tin bí mật bằng các quyền chi tiết và phương thức mã hoá mạnh mẽ. Được tích hợp với giải pháp Quản lý danh tính và quyền truy cập (IAM) của Google Cloud, Secret Manager giúp bạn kiểm soát ai được phép truy cập vào một số thông tin bí mật cụ thể, đảm bảo việc tuân thủ quy định và bảo mật dữ liệu.

Dịch vụ này cũng hỗ trợ tính năng tự động xoay vòng và tạo phiên bản bí mật, đơn giản hoá việc quản lý vòng đời bí mật và tăng cường bảo mật trong các ứng dụng trên các dịch vụ của Google Cloud.

Để truy cập vào Trình quản lý bí mật, hãy chuyển từ trình đơn Bánh hamburger đến các dịch vụ Bảo mật rồi tìm trình quản lý này trong phần Bảo vệ dữ liệu như trong ảnh chụp màn hình bên dưới.

6df83a1c3cb757f6.pngS

Bật API Trình quản lý bí mật khi bạn đã truy cập vào trang này theo hình ảnh sau.

a96c312e2c098db1.png

  • Bây giờ, hãy nhấp vào "Tạo bí mật": Hãy đặt tên hợp lý cho bí mật đó:
  • Tên: php-amarcord-db-pass
  • Giá trị bí mật: "mật khẩu DB của bạn" (bỏ qua phần "tải tệp lên").
  • chú thích đường liên kết bí mật này, có dạng như projects/123456789012/secrets/php-amarcord-db-pass. Đây là con trỏ duy nhất đến khoá truy cập của bạn (Dành cho Terraform, Cloud Run và các dịch vụ khác). Đây là số dự án riêng biệt của bạn.

Mẹo: Hãy cố gắng sử dụng quy ước đặt tên nhất quán cho các khoá bí mật, chuyên biệt từ trái sang phải, ví dụ: cloud-devrel-phpamarcord-dbpass

  • Tổ chức (với công ty)
  • Nhóm (trong tổ chức)
  • Ứng dụng (trong nhóm)
  • Tên biến (trong ứng dụng)

Điều này cho phép bạn dễ dàng sử dụng biểu thức chính quy để tìm tất cả các khoá bí mật cho một ứng dụng.

Tạo bản sửa đổi mới cho Cloud Run

Giờ đây, khi đã có Khoá bí mật mới, chúng ta cần xoá biến DB_PASS ENV và thay thế bằng Khoá bí mật mới. Do đó:

  • Quyền truy cập vào Cloud Run bằng Google Cloud Console
  • Chọn ứng dụng.
  • Nhấp vào "Chỉnh sửa và triển khai bản sửa đổi mới"
  • tìm thẻ "Biến và khoá bí mật".
  • Sử dụng nút "+ Tham chiếu khoá bí mật" để đặt lại biến ENV DB_PASS.
  • Sử dụng cùng một "DB_PASS" cho các Khoá bí mật được tham chiếu và sử dụng phiên bản mới nhất.

9ed4e35be7654dcb.png

Sau khi hoàn tất, bạn sẽ thấy lỗi sau

da0ccd7af39b04ed.png

Hãy thử tìm cách khắc phục. Để giải quyết vấn đề này, bạn cần truy cập vào phần IAM và Quản trị viên rồi thay đổi quyền cấp. Chúc bạn gỡ lỗi thành công!

Sau khi tìm ra vấn đề, hãy quay lại Cloud Run và triển khai lại bản sửa đổi mới. Kết quả sẽ có dạng như hình sau:

e89f9ca780169b6b.png

Mẹo: Bảng điều khiển dành cho nhà phát triển (giao diện người dùng) rất hữu ích trong việc chỉ ra các vấn đề về quyền. Hãy dành thời gian để xem tất cả các đường liên kết cho các thực thể trên Cloud của bạn!

7. Học phần 5: Thiết lập CI/CD bằng Cloud Build

ba49b033c11be94c.png

Tại sao nên có Quy trình CI/CD?

Đến giờ, bạn đã nhập gcloud run deploy vài lần, có thể là trả lời đi trả lời lại cùng một câu hỏi.

Bạn thấy mệt mỏi vì phải triển khai ứng dụng theo cách thủ công bằng gcloud run triển khai? Sẽ thật tuyệt nếu ứng dụng của bạn có thể tự động triển khai mỗi khi bạn đẩy một thay đổi mới vào kho lưu trữ Git.

Để sử dụng quy trình CI/CD, bạn cần có hai thứ:

  1. Kho lưu trữ Git cá nhân: Rất may, bạn đã phân nhánh kho lưu trữ của lớp học này sang tài khoản GitHub của mình ở Bước 2. Nếu không, hãy quay lại và hoàn tất bước đó. Kho lưu trữ được phân nhánh của bạn sẽ có dạng như sau: https://github.com/<YOUR_GITHUB_USER>/app-mod-workshop
  2. Cloud Build. Dịch vụ tuyệt vời và rẻ này cho phép bạn định cấu hình tính năng tự động hoá bản dựng cho hầu hết mọi thứ: Terraform, ứng dụng được đóng gói trong Docker, v.v.

Phần này sẽ tập trung vào việc thiết lập Cloud Build.

Hãy bắt đầu sử dụng Cloud Build!

Chúng ta sẽ sử dụng Cloud Build để thực hiện việc này:

  • tạo nguồn (bằng Dockerfile). Hãy xem đây là một "tệp .zip lớn" chứa tất cả những gì bạn cần để xây dựng và chạy tệp ("cấu phần bản dựng bản dựng").
  • đẩy cấu phần phần mềm này tới Artifact Registry (AR).
  • Sau đó, hãy phát hành một bản triển khai từ AR sang Cloud Run cho ứng dụng "php-amarcord"
  • Thao tác này sẽ tạo một phiên bản ("bản sửa đổi") mới của ứng dụng hiện có (hãy coi đó là một lớp có mã mới) và chúng ta sẽ định cấu hình lớp đó để chuyển hướng lưu lượng truy cập đến phiên bản mới nếu quá trình đẩy thành công.

Đây là ví dụ về một số bản dựng cho ứng dụng php-amarcord của tôi:

f30f42d4571ad5e2.png

Làm cách nào để chúng tôi làm được những việc này?

  1. Bằng cách tạo một tệp YAML hoàn hảo: cloudbuild.yaml
  2. Bằng cách tạo một điều kiện kích hoạt Cloud Build.
  3. Bằng cách kết nối với kho lưu trữ github của chúng tôi thông qua Giao diện người dùng Cloud Build.

Tạo điều kiện kích hoạt (và Kho lưu trữ Connect)

  • Truy cập https://console.cloud.google.com/cloud-build/triggers
  • Nhấp vào "Tạo điều kiện kích hoạt".
  • Biên dịch:
  • Tên: Một cái tên có ý nghĩa như on-git-commit-build-php-app
  • Sự kiện: Đẩy đến nhánh
  • Nguồn: "Kết nối kho lưu trữ mới" văn bản thay thế
  • Thao tác này sẽ mở một cửa sổ ở bên phải: "Kết nối kho lưu trữ"
  • Nhà cung cấp nguồn: "GitHub" (đầu tiên)
  • "Tiếp tục"
  • Tính năng Xác thực sẽ mở một cửa sổ trên GitHub để xác thực chéo. Hãy làm theo quy trình và kiên nhẫn chờ đợi. Nếu có nhiều kho lưu trữ thì bạn có thể mất chút thời gian.
  • "Chọn kho lưu trữ" Chọn tài khoản/kho lưu trữ của bạn rồi đánh dấu vào phần "Tôi hiểu...".
  • Nếu bạn gặp lỗi: Ứng dụng GitHub chưa được cài đặt trên bất kỳ kho lưu trữ nào, hãy tiếp tục nhấp vào "Cài đặt Google Cloud Build" rồi làm theo hướng dẫn.
  • 23e0e0f1219afea3.pngSNhấp vào Kết nối
  • bafd904ec07122d2.png
  • Bingo! Kho lưu trữ của bạn hiện đã được kết nối.
  • Quay lại phần Kích hoạt....
  • Cấu hình: Tự động phát hiện (*)
  • Nâng cao: Chọn tài khoản dịch vụ "[PROJECT_NUMBER]- compute@developer.gserviceaccount.com"
  • xxxxx là mã dự án của bạn
  • Tài khoản dịch vụ điện toán mặc định là phù hợp với phương pháp thử nghiệm – đừng sử dụng tài khoản này trong môi trường sản xuất! ( Tìm hiểu thêm).
  • giữ nguyên mọi thứ khác.
  • Nhấp vào nút "Tạo".

(*) Đây là cách đơn giản nhất vì cách này sẽ kiểm tra Dockerfile hoặc cloudbuild.yaml. Tuy nhiên, cloudbuild.yaml cung cấp cho bạn quyền thực sự để quyết định việc cần làm ở bước nào.

Tôi có quyền!

Giờ đây, điều kiện kích hoạt sẽ không hoạt động trừ phi bạn cấp cho tài khoản dịch vụ Cloud Build (tài khoản dịch vụ là gì? Email của một "robot" thay mặt bạn thực hiện một nhiệm vụ – trong trường hợp này là tạo nội dung trên đám mây!).

SA sẽ không thể tạo và triển khai trừ phi bạn cho phép họ làm việc đó. Thật may là việc này rất dễ dàng!

  • chuyển đến "Cloud Build" (Bản dựng trên đám mây) > " Settings" (Cài đặt).
  • Tài khoản dịch vụ "[PROJECT_NUMBER]- compute@developer.gserviceaccount.com"
  • Đánh dấu vào các ô sau:
  • Cloud Run
  • Secret Manager
  • Tài khoản dịch vụ
  • Cloud Build
  • Ngoài ra, hãy đánh dấu vào mục "Đặt làm tài khoản dịch vụ ưu tiên"

8715acca72286a46.png

Cloud Buld YAML nằm ở đâu?

Bạn nên dành thời gian tạo tệp YAML cho bản dựng trên đám mây của riêng mình.

Tuy nhiên, nếu không có thời gian hoặc không muốn dành thời gian, bạn có thể tìm nguồn cảm hứng trong thư mục giải pháp này: .solutions

Giờ đây, bạn có thể đẩy thay đổi vào GitHub và quan sát Cloud Build.

Việc thiết lập Cloud Build có thể khá phức tạp. Bạn có thể phải trao đổi qua lại bằng cách:

  • Kiểm tra nhật ký trong https://console.cloud.google.com/cloud-build/builds;region=global
  • Đang tìm lỗi của bạn.
  • Sửa lỗi mã và phát hành lại lệnh git cam kết / git push.
  • Đôi khi, lỗi không nằm trong mã mà nằm trong một số cấu hình. Trong trường hợp đó, bạn có thể phát hành một bản dựng mới từ giao diện người dùng (bản dựng trên đám mây > "Trình kích hoạt" > Chạy)

97acd16980a144ab.png.

Xin lưu ý rằng nếu sử dụng giải pháp này, bạn vẫn còn một số việc cần làm. Ví dụ: bạn cần đặt các biến ENV cho các điểm cuối dev/prod mới tạo:

3da8723e4ff80c0a.png.

Bạn có thể làm điều này theo hai cách:

  • Thông qua giao diện người dùng – bằng cách đặt lại biến ENV
  • Thông qua CLI bằng cách tạo tập lệnh "hoàn hảo" cho bạn. Bạn có thể xem ví dụ tại đây: gcloud-run-deploy.sh . Bạn cần điều chỉnh một vài thông tin, chẳng hạn như điểm cuối và số dự án. Bạn có thể tìm thấy số dự án của mình trong phần Tổng quan về Google Cloud.

Làm cách nào để tôi cam kết mã cho github?

Nó nằm ngoài phạm vi của hội thảo này để hướng dẫn bạn cách tốt nhất để git push khai thác GitHub. Tuy nhiên, trong trường hợp bạn gặp sự cố và đang ở Cloud Shell, bạn có hai cách:

  1. CLI. Thêm khoá ssh cục bộ và thêm khoá từ xa bằng git@github.com:YOUR_USER/app-mod-workshop.git (thay vì http)
  2. VSCode. Nếu sử dụng trình chỉnh sửa Cloud Shell, bạn có thể sử dụng thẻ Kiểm soát nguồn (ctrl-shift-G), nhấp vào "đồng bộ hoá các thay đổi" rồi làm theo hướng dẫn. Bạn sẽ có thể xác thực tài khoản github của mình với vscode và việc kéo/đẩy từ đó trở nên dễ dàng.

f0d53f839c7fa3b6.png

Hãy nhớ git add clodubuild.yaml cùng với các tệp khác, nếu không tệp này sẽ không hoạt động.

"Tương đương dev/prod" sâu so với nông [không bắt buộc]

Nếu sao chép phiên bản mô hình từ đây, bạn sẽ có hai phiên bản DEV và PROD giống hệt nhau. Điều này rất thú vị và phù hợp với quy tắc 10 của Ứng dụng 12 yếu tố.

Tuy nhiên, chúng ta đang sử dụng hai điểm cuối Web khác nhau để có một ứng dụng trỏ đến cùng một Cơ sở dữ liệu. Điều này là đủ cho một hội thảo. Tuy nhiên, trong thực tế, bạn nên dành thời gian để tạo môi trường sản xuất thích hợp. Điều này có nghĩa là bạn có hai cơ sở dữ liệu (một cho mục đích phát triển và một cho mục đích sản xuất) và cũng chọn vị trí đặt các cơ sở dữ liệu đó để khôi phục sau sự cố / đảm bảo khả năng sẵn sàng cao. Đây là vấn đề nằm ngoài phạm vi của hội thảo này, nhưng cũng là một số thông tin để bạn cân nhắc.

Nếu bạn có thời gian để tạo phiên bản sản xuất "sâu", vui lòng lưu ý tất cả tài nguyên bạn cần sao chép, chẳng hạn như:

  • Cơ sở dữ liệu Cloud SQL (và có thể là phiên bản SQL).
  • Bộ chứa GCS
  • Hàm trên đám mây.
  • Bạn có thể dùng Gemini 1.5 Flash làm mô hình trong quá trình phát triển (rẻ hơn, nhanh hơn) và Gemini 1.5 Pro (mạnh hơn).

Nhìn chung, mỗi khi bạn làm gì đó cho ứng dụng, hãy suy nghĩ một cách phê phán: phiên bản phát hành công khai có nên có cùng giá trị này không? Nếu không, hãy lặp lại nỗ lực của bạn. Tất nhiên, việc này sẽ dễ dàng hơn nhiều với Terraform, nơi bạn có thể chèn môi trường (-dev, -prod) dưới dạng hậu tố cho tài nguyên.

8. Học phần 6: Chuyển sang Google Cloud Storage

a680e0f287dd2dfb.png

Bộ nhớ

Hiện tại, ứng dụng lưu trữ trạng thái trong một vùng chứa Docker. Nếu máy bị hỏng, ứng dụng bị lỗi hoặc đơn giản là nếu bạn đẩy một bản sửa đổi mới, thì một bản sửa đổi mới sẽ được lên lịch, với bộ nhớ được đặt lại (=>rỗng). 🙈

Làm cách nào để khắc phục vấn đề này? Có một số phương pháp.

  1. Lưu trữ hình ảnh trong DB. Đó là những gì tôi đã làm với ứng dụng PHP trước đó. Đây là giải pháp đơn giản nhất vì không làm phức tạp thêm ứng dụng. Nhưng chắc chắn việc này sẽ làm tăng độ trễ và tải cho cơ sở dữ liệu của bạn!
  2. Di chuyển ứng dụng Cloud Run sang một giải pháp thân thiện với bộ nhớ: GCE + Ổ đĩa lưu trữ dài lâu? Có thể là GKE + Bộ nhớ?
  3. Chuyển sang GCS. Google Cloud Storage cung cấp Bộ nhớ tốt nhất cho toàn bộ Google Cloud và đây là giải pháp đặc trưng nhất của Cloud. Tuy nhiên, chúng ta cần phải làm quen với thư viện PHP. Chúng tôi có thư viện PHP 5.7 cho GCS không? PHP 5.7 có hỗ trợ Composer không (có vẻ như PHP 5.3.2 là phiên bản sớm nhất mà Composer hỗ trợ)?
  4. Có thể sử dụng docker sidecar không?
  5. Hoặc bạn có thể dùng Cloud Run Volume ngàm của GCS. Nghe thật tuyệt vời.

🤔 Di chuyển bộ nhớ (kết thúc mở)

[Có kết thúc mở] Trong bài tập này, bạn cần tìm giải pháp để di chuyển hình ảnh theo cách nhất quán.

Kiểm thử chấp nhận

Tôi không muốn cho bạn biết giải pháp, nhưng tôi muốn điều này xảy ra:

  1. Bạn tải newpic.jpg lên. Bạn sẽ thấy thông báo này trong ứng dụng.
  2. Bạn nâng cấp ứng dụng lên phiên bản mới.
  3. newpic.jpg vẫn còn đó, hiển thị.

💡 Giải pháp có thể áp dụng (Thực hiện gắn ổ đĩa trên GCS Cloud Run)

Đây là một giải pháp rất tinh tế cho phép chúng ta thực hiện việc tải tệp có trạng thái lên mà không cần đụng đến mã (ngoài việc hiển thị nội dung mô tả hình ảnh, nhưng điều đó không quan trọng và chỉ để làm hài lòng mắt).

Thao tác này sẽ cho phép bạn gắn một thư mục từ Cloud Run vào GCS, vì vậy:

  1. Tất cả nội dung tải lên GCS sẽ thực sự xuất hiện trong ứng dụng của bạn.
  2. Tất cả nội dung tải lên ứng dụng của bạn sẽ được tải lên GCS
  3. Sự kỳ diệu sẽ xảy ra với các đối tượng được tải lên GCS (chương 7).

Lưu ý. Vui lòng đọc kỹ các điều khoản của FUSE. Điều này KHÔNG được chấp nhận nếu hiệu suất là vấn đề.

Tạo bộ chứa GCS

GCS là dịch vụ lưu trữ đa hiện diện của Google Cloud. API này đã được kiểm thử thực tế và được mọi dịch vụ GCP cần bộ nhớ sử dụng.

Xin lưu ý rằng Cloud Shell xuất PROJECT_ID dưới dạng 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/"

Định cấu hình Cloud Run để gắn bộ chứa vào thư mục /uploads/

Giờ chúng ta hãy đến với phần trang nhã. Chúng ta tạo một phương tiện php_uploads và hướng dẫn Cloud Run thực hiện việc gắn FUSE trên MOUNT_PATH (chẳng hạn như /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"

Bây giờ, hãy lặp lại bước này cho tất cả các điểm cuối mà bạn muốn trỏ đến Cloud Storage.

Bạn cũng có thể thực hiện tương tự trên giao diện người dùng

  1. Trong thẻ "Ổ đĩa", hãy tạo một Volume Mounts (Điểm gắn ổ đĩa) trỏ đến bộ chứa của bạn, thuộc loại "Bộ chứa trên Cloud Storage", ví dụ: có tên "php_uploads".
  2. Trong(các) Vùng chứa > Điểm gắn phương tiện, hãy gắn phương tiện bạn vừa tạo vào điểm gắn phương tiện mà ứng dụng yêu cầu. Điều này tuỳ thuộc vào tệp docker, nhưng có thể có dạng như var/www/html/uploads/ .

Dù cách nào, nếu thành công, khi chỉnh sửa bản sửa đổi mới cho Cloud Run, bạn sẽ thấy nội dung như sau:

6c2bb98fc1b0e077.pngS

Bây giờ, hãy kiểm thử ứng dụng mới, tải một hình ảnh mới lên điểm cuối /upload.php.

Hình ảnh sẽ chuyển liền mạch trên GCS mà không cần viết một dòng PHP nào:

70032b216afee2d7.png

Điều gì vừa xảy ra?

Một điều kỳ diệu đã xảy ra.

Một ứng dụng cũ có mã cũ vẫn đang hoạt động. Ngăn xếp mới, được hiện đại hoá cho phép chúng ta lưu giữ tất cả hình ảnh/hình ảnh trong ứng dụng một cách thoải mái trong một Bộ chứa đám mây có trạng thái. Bây giờ, bầu trời là giới hạn:

  • Bạn muốn gửi email mỗi khi có hình ảnh "nguy hiểm" hoặc "nhạy cảm"? Bạn có thể làm việc đó mà không cần đụng đến mã PHP.
  • Bạn muốn sử dụng mô hình Đa phương thức Gemini mỗi khi có hình ảnh được chèn vào để mô tả và tải DB lên cùng với nội dung mô tả? Bạn có thể làm việc đó mà không cần đụng đến mã PHP. Bạn không tin tôi à? Hãy đọc tiếp trong chương 7.

Chúng tôi vừa mở ra một cơ hội lớn tại đây.

9. Mô-đun 7: Nâng cao hiệu quả cho ứng dụng của bạn bằng Google Gemini

c00425f0ad83b32c.png

Giờ đây, bạn đã có một ứng dụng PHP mới, hiện đại và tuyệt vời (như Fiat 126 năm 2024) với bộ nhớ trên đám mây.

Tác dụng

Điều kiện tiên quyết

Trong chương trước, một giải pháp mô hình cho phép chúng ta gắn hình ảnh /uploads/ trên GCS, thực tế tách logic Ứng dụng khỏi bộ nhớ hình ảnh.

Bài tập này yêu cầu bạn:

  • Đã hoàn thành bài tập trong chương 6 (bộ nhớ) thành công.
  • Có một bộ chứa GCS chứa các tệp tải lên hình ảnh, nơi mọi người tải ảnh lên ứng dụng của bạn và ảnh sẽ chuyển đến bộ chứa của bạn.

Thiết lập một hàm trên Cloud (bằng python)

Bạn đã bao giờ tự hỏi cách triển khai ứng dụng dựa trên sự kiện chưa? Chẳng hạn như:

  • khi <event> diễn ra => gửi email
  • khi <event> xảy ra => nếu <condition> là true, thì hãy cập nhật Cơ sở dữ liệu.

Sự kiện có thể là bất kỳ nội dung nào, từ bản ghi mới có trong BigQuery, đối tượng mới thay đổi trong thư mục trong GCS hoặc thông báo mới đang chờ trong hàng đợi trong Pub/Sub.

Google Cloud hỗ trợ nhiều mô hình để đạt được điều này. Đáng chú ý nhất:

  • EventArc. Xem cách nhận sự kiện GCS. Rất phù hợp để tạo DAG và điều phối các hành động dựa trên câu lệnh if-then-else trong đám mây.
  • Cloud Scheduler. Ví dụ: rất phù hợp với công việc cron lúc nửa đêm trên đám mây.
  • Cloud Workflows (Quy trình công việc của Cloud). Tương tự như Event Arc, bạn có thể
  • Hàm Cloud Run (còn gọi là lambdas).
  • Cloud Composer. Về cơ bản, đây là phiên bản Google của Apache Airflow, cũng rất phù hợp với DAG.

Trong bài tập này, chúng ta sẽ tìm hiểu sâu về Hàm trên đám mây để đạt được kết quả khá ấn tượng. Ngoài ra, chúng tôi cũng sẽ cung cấp các bài tập không bắt buộc cho bạn.

Xin lưu ý rằng mã mẫu được cung cấp trong .solutions/

Thiết lập một hàm trên Cloud (🐍 python)

Chúng tôi đang cố gắng tạo ra một GCF rất tham vọng.

  1. Khi một hình ảnh mới được tạo trên GCS.. (có lẽ ai đó đã tải video lên ứng dụng - nhưng không chỉ)
  2. .. gọi Gemini để mô tả và nhận nội dung mô tả bằng văn bản về hình ảnh .. (nên kiểm tra MIME và đảm bảo đó là hình ảnh chứ không phải PDF, MP3 hoặc Văn bản)
  3. .. và cập nhật DB bằng nội dung mô tả này. (bạn có thể phải vá DB để thêm cột description vào bảng images).

Vá DB để thêm description vào hình ảnh

  1. Mở Cloud SQL Studio:

b92b07c4cba658ef.png

  1. Đặt người dùng và mật khẩu của bạn cho DB hình ảnh
  2. Chèn SQL này để thêm cột mô tả hình ảnh:

ALTER TABLE images ADD COLUMN description TEXT;

3691aced78a6389.png

Và bingo! Hãy thử ngay để kiểm tra xem cách này có hiệu quả không:

SELECT * FROM images;

Bạn sẽ thấy cột nội dung mô tả mới:

bed69d6ad0263114.png

Viết Gemini f(x)

Lưu ý. Chức năng này thực tế được tạo ra nhờ sự trợ giúp của Gemini Code.

Lưu ý. Khi tạo hàm này, bạn có thể gặp lỗi về quyền IAM. Một số lỗi được ghi lại bên dưới trong đoạn "Lỗi có thể xảy ra".

  1. Bật API
  2. Truy cập vào https://console.cloud.google.com/functions/list
  3. Nhấp vào "Tạo hàm"
  4. Bật API qua trình hướng dẫn API:

d22b82658cfd4c48.png

Bạn có thể tạo GCF từ giao diện người dùng hoặc từ dòng lệnh. Ở đây, chúng ta sẽ sử dụng dòng lệnh.

Bạn có thể tìm thấy mã có thể dùng trong .solutions/

  1. Tạo một thư mục để lưu trữ mã của bạn, ví dụ: "gcf/". Chuyển đến thư mục đó.
  2. Tạo tệp requirements.txt:
google-cloud-storage
google-cloud-aiplatform
pymysql
  1. Tạo một hàm python. Mã mẫu tại đây: 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. Đẩy hàm. Bạn có thể sử dụng tập lệnh tương tự như sau: gcf/push-to-gcf.sh.

Lưu ý 1. Hãy nhớ lấy nguồn ENV bằng các giá trị phù hợp hoặc chỉ thêm các giá trị đó lên trên cùng (GS_BUCKET=blah, ..):

Lưu ý 2. Thao tác này sẽ đẩy tất cả mã cục bộ (.), vì vậy, hãy nhớ đặt mã của bạn trong một thư mục cụ thể và sử dụng .gcloudignore như một chuyên gia để tránh việc đẩy các thư viện có dung lượng lớn. ( ví dụ).

#!/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

Lưu ý: trong ví dụ này, generate_caption sẽ là phương thức được gọi và Hàm trên đám mây sẽ truyền sự kiện GCS đến phương thức đó cùng với tất cả thông tin liên quan (tên bộ chứa, tên đối tượng, v.v.). Hãy dành thời gian gỡ lỗi tập lệnh python sự kiện đó.

Kiểm thử hàm

Kiểm thử đơn vị

Hàm này có nhiều phần chuyển động. Bạn nên kiểm thử tất cả các trường hợp riêng lẻ.

Bạn có thể xem ví dụ trong gcf/test.py.

Giao diện người dùng của Cloud Functions

Ngoài ra, hãy dành thời gian khám phá hàm trên giao diện người dùng. Bạn nên khám phá mọi thẻ, đặc biệt là Source (thẻ yêu thích của tôi), Variables, TriggerLogs; Bạn sẽ dành nhiều thời gian trong Logs để khắc phục sự cố (cũng xem các lỗi có thể xảy ra ở cuối trang này). Ngoài ra, hãy nhớ kiểm tra Permissions.

cf3ded30d532a2c7.png

Thử nghiệm E2E

Đã đến lúc kiểm thử hàm theo cách thủ công!

  1. Chuyển đến ứng dụng của bạn rồi đăng nhập
  2. Tải hình ảnh lên (không quá lớn, chúng tôi đã thấy vấn đề với hình ảnh lớn)
  3. kiểm tra trên giao diện người dùng hình ảnh được tải lên.
  4. Kiểm tra trên Cloud SQL Studio để đảm bảo bạn đã cập nhật nội dung mô tả. Đăng nhập và chạy truy vấn này: SELECT * FROM images.

43a680b12dbbdda0.png

Cách làm này hiệu quả! Chúng ta cũng có thể cập nhật giao diện người dùng để hiển thị nội dung mô tả đó.

Cập nhật PHP để hiển thị [không bắt buộc]

Chúng tôi đã chứng minh ứng dụng hoạt động. Tuy nhiên, người dùng cũng có thể xem nội dung mô tả đó.

Chúng tôi không cần phải là chuyên gia PHP mới có thể thêm mô tả vào index.php. Mã này sẽ thực hiện được việc này (vâng, Gemini cũng đã viết mã này cho tôi!):

<?php if (!empty($image['description'])): ?>
    <p class="font-bold">Gemini Caption:</p>
    <p class="italic"><?php echo $image['description']; ?></p>
<?php endif; ?>

Đặt mã này bên trong foreach theo ý thích của bạn.

Ở các bước tiếp theo, chúng ta cũng sẽ thấy một phiên bản giao diện người dùng đẹp hơn nhờ có tính năng Hỗ trợ mã của Gemini. Phiên bản đẹp có thể trông như sau:

fdc12de0c88c4464.png

Kết luận

Bạn đã kích hoạt một Hàm trên đám mây trên các đối tượng mới truy cập vào GCS. Hàm này có thể chú thích nội dung của hình ảnh như con người và tự động cập nhật cơ sở dữ liệu. Rất ấn tượng!

Tiếp theo là gì? Bạn có thể làm theo cùng một lý do để đạt được hai chức năng tuyệt vời.

[không bắt buộc] Thêm các Hàm trên đám mây khác [câu trả lời mở]

Tôi nghĩ đến một vài tính năng bổ sung.

📩 Điều kiện kích hoạt qua email

Trình kích hoạt email sẽ gửi cho bạn email mỗi khi có người gửi ảnh.

  • Quá thường xuyên? Thêm một hạn chế khác: Ảnh LỚN hoặc ảnh có nội dung của Gemini chứa các từ "khỏa thân/hình ảnh khoả thân/bạo lực".
  • Hãy cân nhắc việc kiểm tra EventArc cho vấn đề này.

🚫 Tự động kiểm duyệt ảnh không phù hợp

Hiện tại, một quản trị viên là con người đang gắn cờ hình ảnh là "không phù hợp". Thế còn Gemini làm phần việc nặng nhọc và kiểm duyệt không gian đó thì sao? Thêm một chương trình kiểm thử để gắn cờ nội dung kích hoạt không phù hợp và cập nhật cơ sở dữ liệu như chúng ta đã tìm hiểu trong hàm trước. Về cơ bản, điều này có nghĩa là lấy hàm trước đó, thay đổi câu lệnh và cập nhật DB dựa trên câu trả lời.

Thận trọng. AI tạo sinh có những kết quả khó đoán. Đảm bảo rằng "kết quả mẫu quảng cáo" từ Gemini được đưa vào "đường dẫn". Bạn có thể yêu cầu câu trả lời có tính quyết định như điểm tin cậy từ 0 đến 1, JSON, v.v. Bạn có thể thực hiện việc này theo nhiều cách, ví dụ: * Sử dụng thư viện python pydantic, langchain, .. * Sử dụng Đầu ra có cấu trúc Gemini.

Mẹo. Bạn có thể có NHIỀU hàm hoặc có một câu lệnh duy nhất thực thi câu trả lời JSON (hoạt động hiệu quả với "Đầu ra có cấu trúc Gemini" như được làm nổi bật ở trên) như:

Câu lệnh để tạo hình ảnh này là gì?

{
    "description": "This is the picture of an arrosticino",
    "suitable": TRUE
}

Bạn có thể thêm các trường bổ sung vào câu lệnh để nhận thông tin chi tiết như: có điều gì hay về ứng dụng không? Bạn không hài lòng? Bạn có nhận ra địa điểm này không? Có văn bản nào không (Nhận dạng ký tự quang học (OCR) chưa bao giờ dễ dàng đến thế):

  • goods: "Trông giống như đồ ăn ngon"
  • bads: "Có vẻ như đó là đồ ăn không tốt cho sức khoẻ"
  • OCR: "Da consumare preferibilmente prima del 10 Novembre 2024"
  • location: "Pescara, Lungomare"

Mặc dù thường tốt hơn khi có hàm N cho N kết quả, nhưng việc thực hiện một hàm có thể thực hiện 10 việc sẽ mang lại lợi ích vô cùng lớn. Hãy xem bài viết này của Riccardo để biết cách thực hiện.

Các lỗi có thể xảy ra (chủ yếu là IAM/quyền)

Lần đầu tiên phát triển giải pháp này, tôi gặp phải một số vấn đề về quyền IAM. Tôi sẽ thêm chúng vào đây để thể hiện sự đồng cảm và đưa ra một số ý tưởng về cách khắc phục.

Lỗi: không đủ quyền cho Tài khoản dịch vụ

  1. Xin lưu ý rằng để triển khai một hàm GCF theo dõi một bộ chứa GCS, bạn cần thiết lập các quyền thích hợp cho Tài khoản dịch vụ mà bạn đang sử dụng cho công việc đó, như trong hình:

22f51012fa6b4a24.png

Bạn cũng có thể phải bật EventArc API. Trong vài phút trước khi chúng trở nên đầy đủ.

Lỗi: Thiếu trình gọi Cloud Run

  1. Một nhận xét khác từ giao diện người dùng về việc cấp quyền cho GCF là ( Vai trò của phương thức gọi Cloud Run):

be72e17294f2d3f3.png

Bạn có thể sửa lỗi này bằng cách chạy lệnh trong hình ảnh, tương tự như fix-permissions.sh

Vấn đề này được mô tả tại đây: https://cloud.google.com/functions/docs/securing/authenticating

Lỗi: Đã vượt quá giới hạn bộ nhớ

Lần đầu tiên tôi chạy, nhật ký của tôi có thể cho biết: ""Giới hạn bộ nhớ 244 MiB đã vượt quá với 270 MiB đã sử dụng. Hãy cân nhắc tăng giới hạn bộ nhớ, xem https://cloud.google.com/functions/docs/configuring/memory"". Một lần nữa, hãy thêm RAM vào GCF. Bạn có thể dễ dàng thực hiện việc này trong giao diện người dùng. Sau đây là một vấn đề có thể xảy ra:

bed69d6ad0263114.png

Ngoài ra, bạn cũng có thể sửa tập lệnh triển khai Cloud Run để tăng MEM/CPU. Quá trình này sẽ mất nhiều thời gian hơn.

Lỗi: PubSub đã xuất bản

Việc tạo điều kiện kích hoạt bằng GCF phiên bản 1 đã gây ra lỗi sau:

e5c338ee35ad4c24.png

Xin nhắc lại rằng bạn có thể dễ dàng khắc phục vấn đề này bằng cách chuyển đến IAM và cấp cho Tài khoản dịch vụ của bạn vai trò "Nhà xuất bản Pub/Sub".

Lỗi: Chưa sử dụng Vertex AI

Nếu bạn gặp lỗi này:

Quyền bị từ chối: 403 Vertex AI API chưa được sử dụng trong dự án YOUR_PROJECT trước đây hoặc API này bị tắt. Để kích hoạt tính năng này, hãy truy cập vào https://console.developers.google.com/apis/api/aiplatform.googleapis.com/overview?project=YOR_PROJECT

Bạn chỉ cần bật API Vertex AI. Cách dễ nhất để bật TẤT CẢ API cần thiết là:

  1. https://console.cloud.google.com/vertex-ai
  2. Nhấp vào "bật tất cả API được đề xuất".

492f05ac377f3630.pngS

Lỗi: Không tìm thấy điều kiện kích hoạt EventArc.

Nếu bạn nhận được thông báo này, vui lòng triển khai lại chức năng này.

8ec4fc11833d7420.png

Lỗi: 400 Tác nhân dịch vụ đang được cấp phép

400 Tác nhân dịch vụ đang được cấp phép ( https://cloud.google.com/vertex-ai/docs/general/access-control#service-agents ). Cần có tác nhân dịch vụ để đọc tệp Cloud Storage được cung cấp. Vì vậy, vui lòng thử lại sau vài phút.

Nếu điều này xảy ra, hãy đợi một thời gian hoặc hỏi một nhân viên của Google.

10. Mô-đun 8: Tạo SLO về tình trạng còn hàng

Trong Chương, chúng tôi cố gắng đạt được điều này:

  1. Tạo SLI
  2. Tạo SLO dựa trên SLI
  3. Tạo cảnh báo dựa trên SLO

f63426182c052123.png

Đây là một chủ đề rất thân thuộc với tác giả, vì Riccardo làm việc trong lĩnh vực SRE/DevOps của Google Cloud.

(kết thúc mở) Tạo SLI và SLO cho ứng dụng này

Ứng dụng hữu ích đến mức nào nếu bạn không biết khi nào ứng dụng ngừng hoạt động?

SLO là gì?

Ôi trời! Google đã phát minh ra SLO! Để đọc thêm về vấn đề này, bạn có thể tham khảo:

Bước 1: Tạo SLI/SLO về tình trạng còn hàng

Hãy bắt đầu với SLO về Mức độ sẵn sàng, vì đây là chỉ số dễ đo lường nhất và có thể là quan trọng nhất mà bạn muốn đo lường.

Rất may, Cloud Run có hỗ trợ SLO tích hợp sẵn nhờ Istio.

Sau khi ứng dụng của bạn chạy trên Cloud Run, bạn chỉ mất 30 giây để thực hiện việc này.

  • Chuyển đến trang Cloud Run.
  • Nhấp/chọn ứng dụng của bạn.
  • Chọn thẻ SLOs.
  • Nhấp vào "+ Tạo SLO".
  • Tình trạng còn hàng, Dựa trên yêu cầu
  • Tiếp tục
  • Tháng theo lịch / 99%.
  • hãy nhấp vào "Tạo SLO".

e471c7ebdc56cdf6.png

Bước 2: thiết lập tính năng Cảnh báo về SLO này

Bạn nên tạo 2 cảnh báo:

  1. Một ứng dụng có tốc độ tiêu hao thấp ("Slowburn") để thông báo cho bạn qua email (mô phỏng vé có mức độ ưu tiên thấp).
  2. Một ứng dụng có tốc độ tiêu hao cao ("Fastburn") để cảnh báo bạn qua SMS (mô phỏng phiếu yêu cầu hỗ trợ có mức độ ưu tiên cao/máy nhắn tin)

Chuyển đến SLO tab trước đó.

Làm việc này hai lần:

314bfd6b9ef0a260.pngS

  • Nhấp vào "Tạo cảnh báo về Mức độ cung cấp dịch vụ" (nút 🔔 có dấu cộng bên trong, ở bên phải)
  • Khoảng thời gian xem lại, ngưỡng Tốc độ tiêu tiền:
  • [FAST]. Đầu tiên: 60 phút / 10 x
  • [CHẬM]. Thứ hai: 720 phút / 2 x
  • Kênh thông báo: nhấp vào Quản lý kênh thông báo
  • Trước tiên, hãy chọn "Email" -> Thêm mới -> ..
  • Thứ hai, "SMS" -> Thêm mới -> Xác minh trên điện thoại.
  • Mẹo: Tôi thích sử dụng biểu tượng cảm xúc trong tên! Bản minh hoạ thật thú vị.
  • khi hoàn tất, hãy nhấp vào dấu X lớn ở trên cùng bên phải.
  • Chọn điện thoại trước (nhanh), email tiếp theo (chậm).
  • Thêm một số tài liệu mẫu như:
  • [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.

Trò chơi cờ bạc!

Kết quả cuối cùng

Chúng ta có thể coi bài tập này là hoàn tất khi bạn có 1 SLO đang hoạt động + 2 lần cảnh báo về tình trạng sẵn sàng và cảnh báo này được gửi đến email và điện thoại của bạn.

Nếu muốn, bạn có thể thêm Độ trễ (và bạn nên làm như vậy) hoặc thậm chí là một độ trễ phức tạp hơn. Đối với độ trễ, hãy chọn độ trễ mà bạn cho là hợp lý. Nếu nghi ngờ, hãy chọn 200 mili giây.

11. Các bước tiếp theo

Bạn đã hoàn thành MỌI THỨ, còn thiếu gì?

Một số đề xuất cần lưu ý:

Chơi cùng Gemini

Bạn có thể sử dụng Gemini theo hai hương vị:

  1. Vertex AI. "Phương pháp doanh nghiệp", đan xen với GCP của bạn, chúng ta đã khám phá trong chương 7 (GCF+Gemini). Tất cả các quy trình xác thực đều hoạt động một cách kỳ diệu và các dịch vụ kết nối với nhau một cách tuyệt vời.
  2. AI của Google. "Cách của người tiêu dùng". Bạn có thể lấy Khoá API Gemini tại đây và bắt đầu tạo các tập lệnh nhỏ có thể được liên kết với bất kỳ khối lượng công việc nào mà bạn đã có (công việc độc quyền, các đám mây khác, máy chủ cục bộ, v.v.). Bạn chỉ cần thay thế khoá API và mã sẽ bắt đầu hoạt động một cách kỳ diệu.

Bạn nên thử khám phá (2) với các dự án riêng của mình.

Chuyển giao giao diện người dùng

Tôi không giỏi về giao diện người dùng. Nhưng Gemini thì có! Bạn chỉ cần chọn một trang PHP và nói những điều như sau:

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!]

Bạn có thể dễ dàng thiết lập chỉ trong chưa đầy 5 phút, chỉ cần một Cloud Build! :)

Câu trả lời của Gemini rất hoàn hảo (nghĩa là tôi không phải thay đổi gì cả):

8a3d5fe37ec40bf8.png

Và đây là bố cục mới trong ứng dụng cá nhân của tác giả:

81620eb90ae3229a.png

Lưu ý: mã được dán dưới dạng hình ảnh vì chúng tôi không muốn khuyến khích bạn lấy mã, nhưng để Gemini viết mã cho bạn, với các hạn chế về giao diện người dùng/giao diện người dùng sáng tạo của riêng bạn. Hãy tin tôi, bạn chỉ còn những thay đổi rất nhỏ sau đó.

Bảo mật

Bảo mật ứng dụng này đúng cách không phải là mục tiêu của hội thảo kéo dài 4 giờ này.

Để biết một số ý tưởng, hãy xem SECURITY doc.

12. Xin chúc mừng!

Xin chúc mừng 🎉🎉🎉 , bạn đã hiện đại hoá thành công ứng dụng PHP cũ bằng Google Cloud.

24cb9a39b1841fbd.pngS

Tóm lại, trong lớp học lập trình này, bạn đã tìm hiểu:

  • Cách triển khai cơ sở dữ liệu MYSQL trong Google Cloud SQL và cách di chuyển cơ sở dữ liệu hiện có vào cơ sở dữ liệu đó.
  • Cách tạo vùng chứa cho ứng dụng PHP bằng Docker và Buildpacks, đồng thời lưu trữ hình ảnh của ứng dụng đó vào Google Cloud Artifact Registry
  • Cách triển khai Ứng dụng được đóng gói trong vùng chứa lên Cloud Run và chạy ứng dụng đó bằng Cloud SQL
  • Cách lưu trữ/sử dụng bí mật các tham số cấu hình nhạy cảm (chẳng hạn như mật khẩu DB) bằng Trình quản lý bí mật của Google
  • Cách thiết lập quy trình CI/CD bằng Google Cloud Build để tự động tạo và triển khai Ứng dụng PHP bất cứ khi nào bạn đẩy mã vào kho lưu trữ GitHub.
  • Cách sử dụng Cloud Storage để "đưa lên đám mây" tài nguyên ứng dụng
  • Cách tận dụng các công nghệ không cần máy chủ để xây dựng quy trình làm việc tuyệt vời trên Google Cloud mà không cần đụng đến mã ứng dụng.
  • Sử dụng các tính năng đa phương thức của Gemini cho một trường hợp sử dụng phù hợp.

Đây là một khởi đầu tuyệt vời cho hành trình hiện đại hoá ứng dụng bằng Google Cloud!

🔁 Ý kiến phản hồi

Nếu bạn muốn chia sẻ trải nghiệm của mình về hội thảo này, hãy cân nhắc việc gửi biểu mẫu phản hồi này.

Chúng tôi rất mong nhận được ý kiến phản hồi của bạn cũng như PR cho những đoạn mã mà bạn đặc biệt tự hào.

🙏 Cảm ơn bạn

Tác giả xin cảm ơn Mirko Gilioli và Maurizio Ipsale của Datatonic đã giúp đỡ trong việc viết bài và kiểm thử giải pháp.