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: ngày 1 tháng 11 năm 2024

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

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

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

Trong lớp học này, bạn sẽ:

  1. Tạo vùng chứa cho ứng dụng PHP.
  2. 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 (đây là giải pháp thay thế không cần thao tác cho GKE/Kubernetes).
  4. Bảo mật Ứng dụng bằng dịch vụ Quản lý danh tính và quyền truy cập (IAM) và Secret Manager.
  5. Xác định quy trình CI/CD thông qua Cloud Build. Cloud Build có thể kết nối 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à được kích hoạt tại bất kỳ lần đẩy nào vào nhánh chính, chẳng hạn.
  6. Lưu trữ hình ảnh ứng dụng trên Cloud Storage. Việc này được thực hiện thông qua việc gắn kết 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 máy chủ).
  8. Làm quen với SLOvận hành ứng dụng mới được làm mới.

Bằng cách làm theo các bước này, bạn có thể dần hiện đại hoá ứng dụng PHP của mình, cải thiện khả năng mở rộng, tính bảo mật và tính linh hoạt khi triển khai. Ngoài ra, việc chuyển sang Google Cloud cho phép bạn tận dụng cơ sở hạ tầng và các dịch vụ mạnh mẽ của Google Cloud để đả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 học được sau khi làm theo 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 khác và các trường hợp sử dụng khác.

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

Ứng dụng ( , theo giấy phép MIT) mà bạn sẽ phân nhánh là một ứng dụng PHP 5.7 cơ bản có tính năng xác thực MySQL. Mục đích 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ẻ cho những hình ảnh không phù hợp. Ứng dụng này có 2 bảng:

  • Người dùng. Được biên dịch sẵn với các quản trị viên. Người dùng mới có thể đăng ký.
  • Hình ảnh. Đi kèm với một số 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 chút biến hoá ở đây.

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

Chúng tôi muốn hiện đại hoá ứng dụng cũ để có thể sử dụng ứng dụng này trong Google Cloud. Chúng tôi sẽ tận dụng các công cụ và dịch vụ của Google Cloud để cải thiện khả năng mở rộng, tăng cường bảo mật, tự động hoá hoạt động quản lý cơ sở hạ tầng và 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 bằng 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ể học quy trình tư duy đằng sau mỗi bước. Thông thường, mỗi bước sẽ mở ra những khả năng mới cho các bước tiếp theo (ví dụ: mô-đun 2 -> 3 và 6 -> 7).

Bạn vẫn chưa tin? 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 và kết nối Internet.
  • Một số khoản tín dụng của GCP. Hãy xem bước tiếp theo để biết cách thực hiện.
  • Bạn sẽ sử dụng Cloud Shell. Nó đi kèm với tất cả các lệnh được cài đặt sẵn mà bạn cần và một IDE.
  • Tài khoản GitHub. Bạn cần có kho lưu trữ 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. Bạn cần có quy trình CI/CD riêng (tự động cam kết -> xây dựng -> triển khai)

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

Hội thảo này được thiết kế để hoàn thành trên Cloud Shell (trên trình duyệt).

Tuy nhiên, bạn cũng có thể thử từ máy tính cục bộ.

2. Thiết lập tín dụng và Fork

6dafc658860c0ce5.png

Sử dụng 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ó sẵn một số tín dụng. Nếu đã có thông tin thanh toán riêng, bạn có thể bỏ qua bước này.

Tạo một tài khoản Google Gmail hoàn toàn mới (*) để liên kết với 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 tín dụng GCP hoặc sử dụng 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 được 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ế khả năng thực hiện của họ. Bạn nên tạo một tài khoản Gmail mới hoặc sử dụng tài khoản Gmail hiện có (gmail.com) mà trước đây chưa từng sử dụng GCP.

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

331658dc50213403.png

Điền vào biểu mẫu sau đây bằng Tên và Họ của bạn, đồ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 rồi tạo một dự án mới bằng cách nhấp vào Trình chọn dự án trong 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 nào như trong ảnh chụp màn hình bên dưới. Có một lựa chọn "DỰ ÁN MỚI" ở góc trên 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ử của 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 thứ trong môi trường đá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 bên trái như minh hoạ bên dưới.

7d732d7bf0deb12e.png

Đảm bảo rằng 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 hợp lệ):

c2ffd36a781b276a.png

Đã chọn (tốt):

594563c158f4f590.png

Phân 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 🍴 rẽ nhánh.
  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ã ứng dụng bằng cách sử dụng
  2. 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 mà 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 "Mở trình chỉnh sửa" như minh hoạ bên dưới.

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 đây

a4e5ffb3e9a35e84.png

Bạn có thể thực hiện việc này một cách trực quan bằng cách nhấp vào "Mở thư mục" rồi chọn thư mục, có thể là app-mod-workshop trong thư mục gốc của bạn.

3. Mô-đun 1: Tạo một phiên bản SQL

645902e511a432a6.png

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

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

  1. Truy cập vào trang Cloud SQL: https://console.cloud.google.com/sql/instances
  2. Nhấp vào "Tạo phiên bản"
  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 tìm cho bạn phiên bản rẻ nhất để có thể dùng lâu hơn):
  • Phiên bản: Enterprise
  • Đặt trước: development (chúng tôi đã thử Hộp cát nhưng không hiệu quả)
  • Mysql Ver: 5.7 (wow, a blast from the past!)
  1. Mã nhận dạng phiên bản: chọn appmod-phpapp (nếu bạn thay đổi mã nhận dạng này, hãy nhớ thay đổi cả 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 kỳ mật khẩu nào bạn muốn nhưng hãy ghi lại mật khẩu đó dưới dạng CLOUDSQL_INSTANCE_PASSWORD
  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. Tính sẵn 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 Create Instance (Tạo phiên bản) để triển khai cơ sở dữ liệu Cloud SQL; ⌛ quá trình này mất khoảng 10 phút để hoàn tấ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 ("Containerize your PHP App" – Tạo vùng chứa cho ứng dụng PHP) vì mô-đun này không phụ thuộc vào mô-đun này trong phần đầu tiên (cho đến khi bạn khắc phục kết nối cơ sở dữ liệu).

Lưu ý. Phiên bản này sẽ tốn của bạn khoảng 7 đô la/ngày. Hãy nhớ triển khai ý tưởng này sau hội thảo.

Tạo cơ sở dữ liệu image_catalog và Người dùng trong Cloud SQL

Dự án Ứng dụng đi kèm với một thư mục db/ chứa 2 tệp sql:

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

Các tệp này sẽ được 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ở phiên bản 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 cái:
  • Tên người dùng: appmod-phpapp-user
  • Mật khẩu: Chọn mật khẩu mà bạn có thể nhớ hoặc nhấp vào "tạo"
  • Giữ "Cho phép mọi người dùng (%)".
  1. nhấp vào THÊM.

Mở DB cho các IP đã biết.

Xin lưu ý rằng tất cả các DB trong Cloud SQL đều được tạo ra ở trạng thái "riêng 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 phiên bản của bạn
  2. Mở trình đơn "Kết nối"
  3. Nhấp vào thẻ "Mạng".
  4. Nhấp vào trong phần "Mạng được uỷ quyền". Bây giờ, hãy thêm một mạng (tức là một mạng con).
  • Hiện tại, hãy chọn chế độ cài đặt nhanh nhưng KHÔNG AN TOÀN để cho phép Ứng dụng hoạt động. Sau này, bạn có thể muốn hạn chế chế độ này đối với những IP mà bạn tin tưởng:
  • Tên: "Mọi người trên thế giới – KHÔNG AN TOÀN".
  • Mạng: "0.0.0.0/0" (Lưu ý: đây là phần KHÔNG BẢO MẬT!)
  • Nhấp vào XONG
  1. 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 lựa chọn thoả hiệp tốt để hoàn thành buổi hội thảo trong O(giờ). Tuy nhiên, hãy xem tài liệu BẢO MẬT để giúp bảo mật giải pháp của bạn cho quá trình phát hành công khai!

Đã đến lúc kiểm tra kết nối cơ sở dữ liệu!

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ạ dưới đây:

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 chúng. Sao chép mã SQL từ các tệp trong kho lưu trữ ( 01_schema.sql rồi 02_seed.sql) và thực thi các tệp đó lần lượt theo thứ tự tuần tự.

Sau đó, bạn sẽ nhận được 2 bảng trong image_catalog, đó là usersimages như minh hoạ dưới đây:

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 của phiên bản Cloud SQL, bạn sẽ cần địa chỉ này sau. Để lấy IP, hãy chuyển đến trang chính của phiên bản Cloud SQL trong trang Tổng quan. (Tổng quan > Kết nối với phiên bản này > Địa chỉ IP công khai).

4. Mô-đun 2: Chuyển đổi ứng dụng PHP của bạn thành vùng chứa

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à bạn cần đóng gói mã trong một loại tệp ZIP nào đó chứa tất cả thông tin để kích hoạt 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.
  • Buildpack. Ít phổ biến hơn, nhưng có xu hướng "tự động đ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 bối cảnh của hội thảo này, chúng tôi sẽ giả định rằng bạn sử dụng Docker.

Nếu bạn chọn sử dụng Cloud Shell, thì đây là thời điểm để mở lại công cụ này (nhấp vào góc trên cùng bên phải của bảng điều khiển đám mây).

ec6a6b90b39e03e.png

Thao tác này sẽ mở một trình bao thuận tiện ở cuối trang, nơi bạn nên phân nhánh mã trong bước thiết lập.

6999b906c0dedeb7.png

Docker

Nếu muố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 các tệp tải lên, tệp thực thi không chuẩn trong ứng dụng,...)

Vì cuối cùng chúng ta muốn triển khai ứng dụng được chứa trong vùng chứa của mình lên Cloud Run, hãy xem tài liệu sau đây. Bạn sẽ chuyển ngược nó từ PHP 8 về PHP 5.7 như thế nào? Có thể bạn có thể dùng Gemini cho việc này. Ngoài ra, bạn có thể sử dụng phiên bản được tạo sẵn này:

# Use the official PHP image: https://hub.docker.com/_/php
FROM php:5.6-apache

# Configure PHP for Cloud Run.
# Precompile PHP code with opcache.
# Install PHP's extension for MySQL
RUN docker-php-ext-install -j "$(nproc)" opcache mysqli pdo pdo_mysql && docker-php-ext-enable pdo_mysql

RUN set -ex; \
  { \
    echo "; Cloud Run enforces memory & timeouts"; \
    echo "memory_limit = -1"; \
    echo "max_execution_time = 0"; \
    echo "; File upload at Cloud Run network limit"; \
    echo "upload_max_filesize = 32M"; \
    echo "post_max_size = 32M"; \
    echo "; Configure Opcache for Containers"; \
    echo "opcache.enable = On"; \
    echo "opcache.validate_timestamps = Off"; \
    echo "; Configure Opcache Memory (Application-specific)"; \
    echo "opcache.memory_consumption = 32"; \
  } > "$PHP_INI_DIR/conf.d/cloud-run.ini"

# Copy in custom code from the host machine.
WORKDIR /var/www/html

COPY . .

# Setup the PORT environment variable in Apache configuration files: https://cloud.google.com/run/docs/reference/container-contract#port
ENV PORT=8080

# Tell Apache to use 8080 instead of 80.
RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf

# Note: This is quite insecure and opens security breaches. See last chapter for hardening ideas.
# Uncomment at your own risk:
#RUN chmod 777 /var/www/html/uploads/

# Configure PHP for development.
# Switch to the production php.ini for production operations.
# RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
# https://github.com/docker-library/docs/blob/master/php/README.md#configuration
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"

# Expose the port
EXPOSE 8080

Bạn có thể xem phiên bản Dockerfile mới nhất tại đây.

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

<?php
// Database configuration
$db_host = '____________';
$db_name = '____________';
$db_user = '____________';
$db_pass = '____________';

try {
    $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Errore di connessione: " . $e->getMessage());
}

session_start();
?>
  • DB_HOST 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 SQL:

bd27071bf450a8d0.png

  • DB_NAME phải giữ nguyên: image_catalog
  • DB_USER phải là appmod-phpapp-user
  • DB_PASS là một lựa chọn của bạn. Thiết lập trong dấu nháy đơn và thoát nếu cần.

Ngoài ra, bạn có thể dùng Gemini để dịch một vài đoạn tiếng Ý sang tiếng Anh!

Được rồi, giờ bạn đã có Dockerfile và đã định cấu hình Ứng dụng PHP để kết nối với DB, hãy thử xem sao!

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

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.

# Build command - don't forget the final . This works if Dockerfile is inside the code folder:
$ docker build -t my-php-app-docker .   

# Local Run command: most likely ports will be 8080:8080
$ docker run -it -p <CONTAINER_PORT>:<LOCAL_MACHINE_PORT> my-php-app-docker

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ủ lưu trữ cục bộ! Giờ đây, ứng dụng của bạn đang chạy trên cổng 8080, hãy nhấp vào biểu tượng "Xem trước trên web" (một trình duyệt có biểu tượng con 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

Nếu đăng nhập bằng Admin/admin123, bạn sẽ thấy nội dung như sau.

68b62048c2e86aea.png

Tuyệt vời!!! Ngoài văn bản tiếng Ý, mọi thứ đều hoạt động! 🎉🎉🎉

Nếu quá trình docker hoá của bạn diễn ra tốt nhưng thông tin đăng nhập vào cơ sở dữ liệu không chính xác, bạn có thể gặp phải trường hợp như sau:

e22f45b79bab86e1.png

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

Lưu vào Artifact Registry [không bắt buộc]

Đến đây, bạn sẽ có một ứng dụng PHP được chứa hoá đ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à giúp hình ảnh này có thể truy cập được để 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 là Artifact Registry, một dịch vụ hoàn toàn do Google Cloud quản lý, đượ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 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, định dạng và khu vực hợp lệ phù hợp để lưu trữ các 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ữ Artifact Registry vừa tạo. Hãy hoàn tất 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. Trước đó, bạn có thể dành 2 phút để thử tải lên/đăng nhập/đăng xuất và làm quen với các điểm cuối của ứng dụng.Bạn sẽ cần đến chúng sau này.

Các lỗi có thể xảy ra

Nếu bạn gặp lỗi về việc tạo vùng chứa, hãy thử dùng Gemini để giải thích và khắc phục lỗi, bằng cách cung cấp:

  • Dockerfile hiện tại của bạn
  • Lỗi nhận được
  • [nếu cần] mã PHP đang được thực thi.

Quyền tải lên. Bạn cũng có thể thử điểm cuối /upload.php và thử tải một bức ảnh lên. Bạn có thể gặp phải lỗi bên dưới. Nếu vậy, bạn cần thực hiện một số bản sửa lỗi chmod/chown trong Dockerfile.

Cảnh báo: move_uploaded_file(uploads/image (3).png): failed to open stream: Permission denied in /var/www/html/upload.php on line 11

PDOException "could not find driver" (hoặc "Errore di connessione: could not find driver"). Đảm bảo Dockerfile của bạn có các thư viện PDO phù hợp cho mysql (pdo_mysql) để kết nối với DB. Tìm nguồn cảm hứng từ các giải pháp tại đây.

Không thể chuyển tiếp yêu cầu của bạn đến một hệ thống phụ trợ. Không kết nối được với máy chủ trên cổng 8080. Điều này có nghĩa là có thể bạn đang hiển thị sai cổng. Đảm bảo rằng bạn đang hiển thị cổng mà Apache/Nginx thực sự đang phân phát. Đây không phải là vấn đề nhỏ. Nếu có thể, hãy đặt cổng đó thành 8080 (giúp bạn dễ dàng hơn khi sử dụng Cloud Run). Nếu bạn muốn giữ cổng 80 (ví dụ: vì Apache muốn như vậy), hãy dùng một lệnh khác để chạy:

$ docker run -it -p 8080:80 # force 80

# Use the PORT environment variable in Apache configuration files.

# https://cloud.google.com/run/docs/reference/container-contract#port

RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf

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

9ffca42774f6c5d1.png

Tại sao nên chọn Cloud Run?

Đây là một câu hỏi hợp lý! Cách đây nhiều năm, chắc chắn bạn sẽ chọn Google App Engine.

Nói một cách đơn giản, Cloud Run hiện có một bộ phần mềm cơ sở mới hơn, dễ triển khai hơn, rẻ hơn và có thể giảm xuống 0 khi bạn không sử dụng. Nhờ khả năng chạy mọi vùng chứa không trạng thái và tích hợp với nhiều dịch vụ của Google Cloud, GKE là lựa chọn lý tưởng để triển khai các vi dịch vụ 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 quản lý toàn diện của Google Cloud, cho phép bạn chạy các ứng dụng có chứa vùng chứa không trạng thái trong một môi trường không máy chủ. Nền tảng này tự động xử lý mọi cơ sở hạ tầng, mở rộng quy mô từ 0 để đáp ứng lưu lượng truy cập đến và giảm xuống 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 phát triển. Nền tảng 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 vi dịch vụ, API, trang web và ứng dụng dựa trên sự kiệ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 nên cài đặt gcloud trong máy cục bộ. Nếu không, hãy xem hướng dẫn tại đây. Nếu đ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 một lần đăng nhập OAuth trên trình duyệt. Đảm bảo rằng bạn đăng nhập 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 Cloud Run API bằng lệnh sau:

  • $ gcloud services enable run.googleapis.com cloudbuild.googleapis.com

Đến đây, mọi thứ đã sẵn sàng để triển khai lên Cloud Run.

Triển khai ứng dụng lê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. Bạn có thể thiết lập một số lựa chọn để đạt được mục tiêu của mình. Sau đây là bộ tuỳ chọn tối thiểu (bạn có thể cung cấp thông qua dòng lệnh hoặc công cụ sẽ hỏi bạn bằng lời nhắc tương tác):

  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. (--region REGION)
  3. Hình ảnh vùng chứa bao bọc Ứ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 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.

Tham khảo tài liệu (hoặc di chuyển xuống để xem giải pháp có thể có) để biết cách áp dụng lựa chọn này cho dòng lệnh.

Quá trình triển khai sẽ mất vài phút. Nếu mọi thứ đề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" không có đối số

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

Tuy nhiên, trong một vài mô-đun, chúng ta sẽ thêm lệnh này vào một trình kích hoạt Cloud Build, vì vậy, chúng ta không thể sử dụng các câu hỏi tương tác. Chúng ta cần điền thông tin vào mọi lựa chọn trong lệnh. Vậy bạn muốn chế 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 và 4 cho đến khi gcloud ngừng hỏi:
  2. [LOOP] gcloud run deploy với các lựa chọn đã tìm thấy
  3. [LOOP] systems ask for option X
  4. [LOOP] Tìm trong tài liệu công khai cách thiết lập X từ CLI bằng cách thêm lựa chọn --my-option [my-value].
  5. 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. Lệnh gcloud run deploy BLAH BLAH BLAH này thật tuyệt vời! Lưu lệnh này ở đâu đó, bạn sẽ cần đến lệnh này cho bước Cloud Build sau này!

Bạn có thể xem một giải pháp khả thi tại đây. Bạn có thể xem tài liệu tại đây.

Xin chúc mừng 🎉🎉🎉 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 quá 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 của mình trong Cloud Run. Tuy nhiên, chúng tôi đã thực hiện việc này bằng một phương pháp bảo mật không tốt: cung cấp một số bí mật ở dạng văn bản thuần tuý.

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

Có thể bạn đã 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 phù hợp cho mục đích kiểm thử và để xem Ứng dụng có hoạt động hay không. Nhưng bạn không thể cam kết/sử dụng mã như vậy trong môi trường phát hành. Mật khẩu (và các tham số kết nối DB khác) sẽ được đọc linh hoạt 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 cá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ì đầu ra 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') ?: 'localhost';
$db_name = getenv('DB_NAME') ?: 'image_catalog';
$db_user = getenv('DB_USER') ?: 'appmod-phpapp-user';
$db_pass = getenv('DB_PASS') ?: 'wrong_password';
// Note getenv() is PHP 5.3 compatible
try {
    $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Errore di connessione: " . $e->getMessage());
}

session_start();
?>

Vì Ứng dụng của bạn được chứa trong vùng chứa, nên 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:

  • Vào thời điểm build, 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ụ: "DB_NAME" và "DB_USER" có thể được đặt ở đây và không được đặt ở nơi nào khác.
  • Vào thời gian chạy. Bạn có thể thiết lập các biến này cho Cloud Run, cả từ giao diện dòng lệnh (CLI) hoặc giao diện người dùng. Đây là nơi phù hợp để đặt tất cả 4 biến của bạn (trừ phi bạn muốn giữ các giá trị mặc định được đặt trong Dockerfile).

Trong localhost, bạn có thể muốn đặt các biến ENV trong tệp .env (kiểm tra thư mục solutions).

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

echo .env >> .gitignore

Sau đó, bạn có thể kiểm thử phiên bản cục bộ:

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

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

  1. Ứng dụng của bạn sẽ đọc biến một cách linh hoạt 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 lên 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 "Container(s)" (Vùng chứa), hãy nhấp vào thẻ dưới cùng "Variables and secrets" (Biến và khoá bí mật)
  • Nhấp vào "+ Thêm biến" rồi thêm tất cả các biến cần thiết. Bạn sẽ thấy như sau:

7a5fbfa448544d3.png

f2780c35585388ca.png

Có hoàn hảo không? Không. PASS của bạn vẫn hiển thị với hầu hết các nhà khai thác. Bạn có thể giảm thiểu tình trạng này bằng Google Cloud Secret Manager.

Lần lặp lại thứ hai: Secret Manager

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 khoan đã – chúng ta đã an toàn chưa?

Mật khẩu của bạn vẫn hiển thị với bất kỳ ai 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 này. 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, thì mật khẩu sẽ xuất hiện trong phần Biến và bí mật như trong ảnh chụp màn hình bên dưới.

Secret Manager 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 bí mật khác.

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

Secret Manager cũng hỗ trợ tính năng xoay vòng và quản lý phiên bản bí mật tự động, giúp đơn giản hoá việc quản lý vòng đời bí mật và tăng cường tính 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 Secret Manager, hãy chuyển từ trình đơn Hamburger đến các dịch vụ Bảo mật rồi tìm dịch vụ 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.png

Bật Secret Manager API 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 khoá bí mật". Hãy gọi khoá này một cách hợp lý:
  • 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, phải có dạng như projects/123456789012/secrets/php-amarcord-db-pass. Đây là con trỏ duy nhất đến khoá bí mật của bạn (Đối với Terraform, Cloud Run và các dịch vụ khác). Số này là số dự án riêng biệt của bạn.

Lưu ý: 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 (cùng 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 sẽ giúp bạn dễ dàng có các biểu thức chính quy để tìm tất cả các khoá bí mật cho một ứng dụng duy nhất.

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

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

  • 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 phiên bản mới"
  • tìm thẻ "Variables & Secrets" (Biến và khoá bí mật).
  • Sử dụng nút "+ Reference a Secret" (Tham chiếu một khoá bí mật) để đặt lại biến ENV DB_PASS.
  • Sử dụng cùng một "DB_PASS" cho các Secret đượ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ẽ gặp phải lỗi sau

da0ccd7af39b04ed.png

Hãy cố gắng 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 mục IAM & Admin (IAM và quản trị) rồi thay đổi quyền cấp. Chúc bạn gỡ lỗi thành công!

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

e89f9ca780169b6b.png

Lưu ý: Developer Console (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 khám phá tất cả các đường liên kết cho các thực thể trên Cloud của bạn!

7. Module 5: Thiết lập CI/CD bằng Cloud Build

ba49b033c11be94c.png

Tại sao cần có quy trình CI/CD?

Đến đây, chắc hẳn 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 cảm thấy mệt mỏi khi phải triển khai ứng dụng theo cách thủ công bằng lệnh gcloud run deploy? 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ó 2 thứ:

  1. Kho lưu trữ Git cá nhân: May mắn là bạn đã phân nhánh kho lưu trữ của hội thảo vào tài khoản GitHub của mình ở Bước 2. Nếu chưa, 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ẻ tiền này cho phép bạn định cấu hình quy trình tự động hoá bản dựng cho hầu hết mọi thứ: Terraform, ứng dụng được đóng gói bằng Docker, v.v.

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

Cloud Build đã ra đời!

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

  • tạo nguồn (bằng Dockerfile). Hãy coi đây là một "tệp .zip lớn" chứa mọi thứ bạn cần để tạo và kích hoạt tệp này ("hiện vật bản dựng" của bạn).
  • đẩy cấu phần phần mềm này lên Artifact Registry (AR).
  • Sau đó, hãy triển khai từ AR đến 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 đây là một lớp có mã mới) và chúng tôi sẽ định cấu hình để chuyển hướng lưu lượng truy cập đến phiên bản mới nếu quá trình truyền 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 thế nào để chúng ta thực hiện tất 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 trình 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à kết nối kho lưu trữ)

  • Truy cập vào 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 tên có ý nghĩa như on-git-commit-build-php-app
  • Sự kiện: Đẩy lê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" (lần đầu)
  • "Tiếp tục"
  • Authenticate (Xác thực) sẽ mở một cửa sổ trên GitHub để xác thực chéo. Làm theo quy trình và kiên nhẫn. Nếu có nhiều kho lưu trữ, bạn có thể mất 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 phải lỗi: Ứng dụng GitHub chưa được cài đặt trên bất kỳ kho lưu trữ nào của bạn, hãy nhấp vào "Cài đặt Google Cloud Build" rồi làm theo hướng dẫn.
  • 23e0e0f1219afea3.pngNhấ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 Trình 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ụ tính toán mặc định phù hợp với phương pháp trong phòng thí nghiệm – đừng sử dụng tài khoản này trong quá trình 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 kiểm tra Dockerfile hoặc cloudbuild.yaml. Tuy nhiên, cloudbuild.yaml cho phép bạn thực sự quyết định việc cần làm ở bước nào.

Tôi có sức mạnh!

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 các thành phần trong Cloud!).

SA của bạn sẽ không thể tạo và triển khai trừ phi bạn cho phép anh ta làm việc đó. May mắn là việc này rất dễ!

  • chuyển đến "Cloud Build" > " 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
  • Đồng thời đánh dấu vào "Đặt làm tài khoản dịch vụ ưu tiên"

8715acca72286a46.png

Tệp YAML của Cloud Build ở đâu?

Bạn nên dành thời gian tạo tệp YAML Build 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ể tham khảo một số ý tưởng trong thư mục giải pháp này: .solutions

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

Việc thiết lập Cloud Build có thể phức tạp. Dự kiến sẽ có một số trao đổi qua lại vào:

  • Kiểm tra nhật ký tại https://console.cloud.google.com/cloud-build/builds;region=global
  • Tìm lỗi.
  • Sửa trong mã và phát hành lại git commit / 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 bản dựng mới từ giao diện người dùng (cloud build > "Triggers" > Run)

97acd16980a144ab.png

Xin lưu ý rằng nếu sử dụng giải pháp này, bạn vẫn cần phải làm một số việc. 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 các 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 số 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ề đám mây.

Làm cách nào để xác nhận mã trên GitHub?

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

  1. CLI. Thêm khoá SSH cục bộ và thêm một kho lưu trữ 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 "sync changes" (đồng bộ hoá các thay đổi) rồi làm theo hướng dẫn. Bạn 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 trong số các tệp khác, nếu không, tệp này sẽ không hoạt động.

"dev/prod parity" (tương đồng giữa môi trường phát triển và môi trường sản xuất) 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ó 2 phiên bản DEV và PROD giống hệt nhau. Điều này rất hữu ích và phù hợp với quy tắc 10 của Ứng dụng mười hai yếu tố.

Tuy nhiên, chúng ta đang sử dụng 2 đ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ột môi trường sản xuất phù hợp. Điều này có nghĩa là bạn phải có hai cơ sở dữ liệu (một cho quá trình phát triển và một cho quá trình sản xuất), đồng thời chọn nơi lưu trữ các cơ sở dữ liệu đó để khôi phục sau thảm hoạ / đảm bảo tính sẵn sàng cao. Điều này nằm ngoài phạm vi của hội thảo này, nhưng bạn có thể suy ngẫm về vấn đề này.

Nếu bạn có thời gian để thực hiện một phiên bản sản xuất "chuyên sâu", vui lòng lưu ý đến tất cả cá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
  • Cloud Function.
  • 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 mẽ hơn).

Nhìn chung, mỗi khi bạn làm điều gì đó về ứng dụng, hãy suy nghĩ thấu đáo: bản phát hành công khai có nên có cùng giá trị này hay không? Nếu không, hãy nỗ lực gấp đôi. 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 của mình (-dev, -prod) làm hậu tố cho tài nguyên.

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

a680e0f287dd2dfb.png

Bộ nhớ

dc3a4b8ea92aaef6.png

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 gặp sự cố 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 một bộ nhớ trống mới: 🙈

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. Đây là giải pháp đơn giản nhất vì nó không làm tăng độ phức tạp. Nhưng chắc chắn nó sẽ làm tăng độ trễ và tải cho DB 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 + Storage? Lưu ý: khi có quyền kiểm soát, bạn sẽ mất đi tính linh hoạt.
  3. Chuyển sang GCS. Google Cloud Storage cung cấp dịch vụ lưu trữ hàng đầu cho toàn bộ Google Cloud và đây là giải pháp phù hợp nhất với Cloud. Tuy nhiên, điều này đòi hỏi chúng ta phải làm việc với các 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 được Composer hỗ trợ)?
  4. Có thể sử dụng docker sidecar không?
  5. Hoặc có thể sử dụng Cloud Run Volume Mounts của GCS. Nghe thật tuyệt.

🤔 Di chuyển bộ nhớ (câu trả lời mở)

[Câu hỏi mở] Trong bài tập này, bạn cần tìm ra một giải pháp để di chuyển hình ảnh theo cách nào đó.

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 một phiên bản mới.
  3. newpic.jpg vẫn còn và hiển thị.

💡 Giải pháp có thể áp dụng (GCS Cloud Run Volume Mounts)

Đây là một giải pháp rất hiệu quả, cho phép chúng ta đạt được trạng thái tải tệp lên mà KHÔNG cần chỉnh sửa 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ỉ để người dùng cảm thấy hài lòng).

Điều 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ẽ thực sự được tải lên GCS
  3. Điều kỳ diệu sẽ xảy ra với các đối tượng được tải lên trong GCS (chương 7).

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

Tạo bộ chứa GCS

GCS là dịch vụ lưu trữ có mặt ở khắp mọi nơi của Google Cloud. Nó đã được kiểm chứng và được mọi dịch vụ của 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 vùng chứa vào thư mục /uploads/

Bây giờ, hãy chuyển sang phần thanh lịch. Chúng ta tạo một ổ đĩa php_uploads và hướng dẫn Cloud Run thực hiện thao tá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 thao tác tương tự trên giao diện người dùng

  1. Trong thẻ "Volumes" (Ổ đĩa), hãy tạo một Volume Mounts (Điểm gắn ổ đĩa) trỏ đến nhóm của bạn, thuộc loại "Cloud Storage bucket" (Nhóm lưu trữ đám mây), ví dụ: có tên là "php_uploads".
  2. Trong phần Container(s) > Volume Mounts (Vùng chứa > Điểm gắn ổ đĩa), hãy gắn ổ đĩa mà bạn vừa tạo vào điểm gắn ổ đĩa do ứng dụng của bạn yêu cầu. Tuỳ thuộc vào dockerfile, nhưng có thể trông giống như var/www/html/uploads/ .

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

6c2bb98fc1b0e077.png

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

Các hình ảnh sẽ xuất hiệ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?

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

Một ứng dụng cũ có mã cũ vẫn đang hoạt động. Một ngăn xếp mới, hiện đại cho phép chúng tôi lưu trữ tất cả hình ảnh/ảnh trong ứng dụng một cách thoải mái trong một Cloud Bucket có trạng thái. Giờ đây, nhà sáng tạo có thể làm được mọi thứ:

  • Bạn có muốn gửi email mỗi khi nhận được hình ảnh có nội dung "nguy hiểm" hoặc "khoả thân" không? Bạn có thể làm việc đó mà không cần chỉnh sửa mã PHP.
  • Bạn muốn sử dụng Mô hình đa phương thức của Gemini mỗi khi có hình ảnh xuất hiện để mô tả hình ảnh đó và tải cơ sở dữ liệu lên cùng với nội dung mô tả? Bạn có thể làm việc đó mà không cần chỉnh sửa mã PHP. Bạn không tin tôi? Hãy đọc tiếp chương 7.

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

9. Module 7: Nâng cao ứ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 (giống 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, trên 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 (lưu trữ).
  • Có một vùng lưu trữ GCS chứa các hình ảnh được tải lên, nơi mọi người tải ảnh lên ứng dụng của bạn và ảnh sẽ được chuyển đến vùng lưu trữ của bạn.

Thiết lập một hàm Cloud (bằng Python)

Bạn đã bao giờ thắc mắc về cách triển khai một ứng dụng hướng sự kiện chưa? Chẳng hạn như:

  • khi <event> xảy 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 cứ điều gì, từ bản ghi mới có trong BigQuery, một đối tượng mới thay đổi trong một thư mục trong GCS hoặc một 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 mục tiêu này. Đáng chú ý nhất:

Trong bài tập này, chúng ta sẽ tìm hiểu sâu về Cloud Functions để đạt được một kết quả khá ấn tượng. 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 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ó thể là do người dùng đã tải video đó lên ứng dụng – nhưng không chỉ có vậy)
  2. .. gọi Gemini để mô tả hình ảnh đó và nhận nội dung mô tả bằng văn bản về hình ảnh .. (sẽ rất hữu ích nếu bạn kiểm tra MIME để đả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. (việc này có thể yêu cầu vá DB để thêm cột description vào bảng images).

Vá cơ sở dữ liệu để thêm description vào hình ảnh

  1. Mở Cloud SQL Studio:

b92b07c4cba658ef.png

  1. Nhập tên người dùng và mật khẩu của bạn cho cơ sở dữ liệu hình ảnh
  2. Chèn SQL này để thêm một cột cho nội dung 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 mô tả mới:

bed69d6ad0263114.png

Viết Gemini f(x)

Lưu ý. Hàm này được tạo bằng sự trợ giúp của Gemini Code Assist.

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

  1. Bật các 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 bằng 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ã trong phần .solutions/

  1. Tạo một thư mục để lưu trữ mã của bạn, ví dụ: "gcf/". Vào 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 một tập lệnh tương tự như tập lệnh này: gcf/push-to-gcf.sh.

Lưu ý 1. Đảm bảo bạn lấy các ENV có giá trị phù hợp hoặc chỉ cần thêm chúng vào đầu (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 đẩy các thư viện 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à Cloud Functions sẽ truyền sự kiện GCS đến phương thức này 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 chút thời gian để gỡ lỗi từ điển python của sự kiện đó.

Kiểm thử hàm

Kiểm thử đơn vị

Hàm này có nhiều thành phần chuyển động. Bạn có thể muốn kiểm thử tất cả các thành phần riêng lẻ.

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

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

Ngoài ra, hãy dành thời gian khám phá chức năng của bạn 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ẻ tôi yêu thích), Variables, TriggerLogs; Bạn sẽ dành nhiều thời gian trong Logs để khắc phục sự cố (xem thêm 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

Kiểm thử E2E

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

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

43a680b12dbbdda0.png

Và cách làm này hiệu quả! Chúng ta cũng có thể muốn 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 được rằng ứng dụng này hoạt động. Tuy nhiên, người dùng cũng nên thấy nội dung mô tả đó.

Chúng ta không cần phải là chuyên gia về PHP để thêm nội dung mô tả vào index.php. Đoạn mã này sẽ thực hiện (đúng vậy, Gemini cũng đã viết đoạn 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; ?>

Bạn có thể đặt mã này bên trong foreach theo ý mình.

Trong các bước tiếp theo, chúng ta cũng thấy một phiên bản giao diện người dùng đẹp hơn nhờ Gemini Code Assist. Một 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 Cloud Function khi các đối tượng mới xuất hiện trên GCS. Cloud Function 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 DB. Rất ấn tượng!

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

[không bắt buộc] Thêm các Cloud Functions 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 email

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

  • Quá thường xuyên? Thêm một giới hạn khác: Một bức ảnh LỚN hoặc một bức ảnh có nội dung do Gemini tạo ra chứa các từ "ảnh khỏa thân/trần trụi/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, quản trị viên là con người đang gắn cờ hình ảnh là "không phù hợp". Bạn nghĩ sao nếu để Gemini xử lý các công việc phức tạp và kiểm duyệt không gian? 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 DB như chúng ta đã tìm hiểu trong hàm trước đó. Điều này có nghĩa là về cơ bản, bạn sẽ 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.

Điều cần chú ý. AI tạo sinh có thể đưa ra kết quả không dự đoán được. Đảm bảo "đầu ra sáng tạo" của Gemini được "đặt đúng hướng". Bạn có thể yêu cầu câu trả lời xác định như điểm tin cậy từ 0 đến 1, một JSON, v.v. Bạn có thể đạt được điều này theo nhiều cách, ví dụ: * Sử dụng các thư viện Python pydantic, langchain, v.v. * Sử dụng Đầu ra có cấu trúc của Gemini.

Mẹo. Bạn có thể có NHIỀU hàm hoặc có một câu lệnh duy nhất bắt buộc phải trả lời bằng JSON (rất hiệu quả với "Đầu ra có cấu trúc của Gemini" như đã nêu bật ở trên), chẳng hạn như:

Câu lệnh nào sẽ tạo ra hình ảnh này?

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

Bạn có thể thêm các trường khác vào câu lệnh để nhận thông tin chi tiết, chẳng hạn như: có điểm nào tốt về sản phẩm này không? Bạn có thấy phiền không? Bạn có nhận ra địa điểm này không? Có văn bản nào không (OCR chưa bao giờ dễ dàng đến thế):

  • goods: "Nhìn có vẻ ngon"
  • bads: "Có vẻ như là thực phẩm không lành mạnh"
  • OCR: "Da consumare preferibilmente prima del 10 Novembre 2024"
  • location: "Pescara, Lungomare"

Mặc dù thường thì bạn nên có hàm N cho N kết quả, nhưng việc có một hàm thực hiện 10 việc sẽ mang lại hiệu quả đáng kinh ngạc. 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)

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

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

  1. Xin lưu ý rằng để triển khai một hàm GCF lắng nghe 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 – có thể mất vài phút thì các API này mới hoạt động đầ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 để cấp quyền GCF là ( Vai trò Người 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á hạn mức bộ nhớ

Lần đầu tiên tôi chạy ứng dụng này, nhật ký của tôi có thể cho biết: "Đã vượt quá giới hạn bộ nhớ 244 MiB với 270 MiB được sử dụng. Cân nhắc tăng giới hạn bộ nhớ, hãy xem https://cloud.google.com/functions/docs/configuring/memory". Tiếp theo, hãy thêm RAM vào GCF. Bạn có thể thực hiện việc này rất dễ dàng trong giao diện người dùng. Sau đây là một trường hợp 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 mất nhiều thời gian hơn một chút.

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

Việc tạo một trình kích hoạt bằng GCF phiên bản 1 từng gây ra lỗi này:

e5c338ee35ad4c24.png

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 phải lỗi này:

Quyền bị từ chối: 403 Vertex AI API chưa từng được sử dụng trong dự án YOUR_PROJECT hoặc đã bị tắt. Bật API này bằng cách 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 Vertex AI API. Cách dễ nhất để bật TẤT CẢ các API cần thiết là:

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

492f05ac377f3630.png

Lỗi: Không tìm thấy Trình kích hoạt EventArc.

Nếu bạn gặp phải lỗi này, vui lòng triển khai lại hàm.

8ec4fc11833d7420.png

Lỗi: 400 Đang cung cấp tác nhân dịch vụ

400 tác nhân Dịch vụ đang được cung cấp ( https://cloud.google.com/vertex-ai/docs/general/access-control#service-agents ). Bạn 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 lúc hoặc hỏi một nhân viên của Google.

10. Mô-đun 8: Tạo SLO về tính sẵn sàng

Trong Chương này, chúng tôi cố gắng đạt được mục tiêu sau:

  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 quan trọng đối với tác giả, vì Riccardo làm việc trong lĩnh vực SRE / DevOps của Google Cloud.

(câu hỏi mở) Tạo SLI và SLO cho ứng dụng này

Ứng dụng sẽ ra sao 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ề khả năng đáp ứng

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

Rất may là Cloud Run có sẵn tính năng hỗ trợ SLO nhờ Istio.

Sau khi ứng dụng của bạn chạy trên Cloud Run, việc này rất đơn giản, chỉ mất 30 giâ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".
  • Phạm vi cung cấp, Dựa trên yêu cầu
  • Tiếp tục
  • Tháng theo lịch / 99%.
  • nhấp vào "Tạo SLO".

e471c7ebdc56cdf6.png

Bước 2: thiết lập Cảnh báo cho SLO này

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

  1. Một với tốc độ sử dụng thấp ("Slowburn") để cảnh báo bạn qua email (mô phỏng vé ưu tiên thấp).
  2. Một với tốc độ đốt cao ("Fastburn") để cảnh báo bạn qua SMS (mô phỏng vé / máy nhắn tin có mức độ ưu tiên cao)

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

Thực hiện việc này 2 lần:

314bfd6b9ef0a260.png

  • Nhấp vào "Tạo cảnh báo SLO" (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:
  • [NHANH]. Đầu tiên: 60 phút / 10 x
  • [CHẬM]. Giây: 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 dùng biểu tượng cảm xúc trong tên! Đây là một cách thú vị để minh hoạ.
  • 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), sau đó chọn email (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.

Bingo!

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 mục tiêu mức độ dịch vụ đang hoạt động + 2 cảnh báo về tính sẵn sàng, đồng thời cảnh báo được gửi đến email và điện thoại của bạn.

Nếu muốn, bạn có thể thêm một Độ trễ (và tôi rất khuyến khích bạ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 không chắc chắn, hãy chọn 200 mili giây.

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

Bạn đã hoàn thành MỌI VIỆC, vậy còn thiếu gì?

Một số điều cần suy ngẫm:

Chơi cùng Gemini

Bạn có thể dùng Gemini theo hai cách:

  1. Vertex AI. "Cách thức của doanh nghiệp", gắn liền với GCP của bạn, mà 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 liền mạch.
  2. AI của Google. "Cách của người tiêu dùng". Bạn có thể lấy Khoá Gemini API tại đây và bắt đầu xây dựng các tập lệnh nhỏ có thể được liên kết với mọi khối lượng công việc mà bạn hiện có (công việc độc quyền, các đám mây khác, localhost, v.v.). Bạn chỉ cần thay thế khoá API của mình 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 cá nhân của mình.

Nâng cấp 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 lấy một trang PHP và nói điều gì đó 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 nhận được thông tin này trong vòng 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 (tức là tôi không phải thay đổi gì):

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ã, mà muốn bạn yêu cầu Gemini viết mã cho bạn, theo các ràng buộc 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; tin tôi đi, sau đó bạn chỉ cần thực hiện một số thay đổi rất nhỏ.

Bảo mật

Bảo mật đúng cách cho ứng dụng này không phải là mục tiêu của hội thảo kéo dài 4 giờ này, vì việc đó sẽ làm tăng thời gian hoàn thành hội thảo này lên gấp 1 đến 2 lần.

Tuy nhiên, đây là một chủ đề cực kỳ quan trọng! Chúng tôi đã thu thập một số ý tưởng trong SECURITY.

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ũ của mình bằng Google Cloud.

24cb9a39b1841fbd.png

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 trong Google Cloud SQL và cách di chuyển cơ sở dữ liệu hiện có vào đó.
  • 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 đó trong Google Cloud Artifact Registry
  • Cách triển khai Ứng dụng được chứa trong vùng chứa lên Cloud Run và chạy ứng dụng đó bằng Cloud SQL
  • Cách bí mật lưu trữ/sử dụng các thông số cấu hình nhạy cảm (chẳng hạn như mật khẩu DB) bằng Google Secret Manager
  • 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 của bạn bất cứ khi nào bạn đẩy mã lên kho lưu trữ GitHub.
  • Cách sử dụng Cloud Storage để "đưa lên đám mây" các tài nguyên của ứng dụng
  • Cách tận dụng các công nghệ không máy chủ để xây dựng Workflows tuyệt vời trên Google Cloud mà không cần chỉnh sửa mã ứng dụng.
  • Sử dụng các khả năng đa phương thức của Gemini cho một trường hợp sử dụng phù hợp.
  • Triển khai các nguyên tắc SRE trong Google Cloud

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

🔁 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 điền vào 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ư PRs 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 GilioliMaurizio Ipsale của Datatonic vì đã giúp đỡ trong việc viết bài và kiểm thử giải pháp.