Mô-đun 5: Di chuyển từ Google App Engine sang Cloud Run bằng Cloud Buildpack (Gói bản dựng trên đám mây)

1. Tổng quan

Loạt lớp học lập trình này (hướng dẫn thực hành theo tiến độ riêng) nhằm giúp các nhà phát triển Google App Engine (Tiêu chuẩn) hiện đại hoá ứng dụng của họ bằng cách hướng dẫn họ thực hiện một loạt quy trình di chuyển. Sau khi hoàn thành mục tiêu này, người dùng có thể làm cho ứng dụng di động hơn bằng cách chia nhỏ các ứng dụng một cách rõ ràng thành Cloud Run, dịch vụ tương tự lưu trữ vùng chứa của Google Cloud cho App Engine, và các dịch vụ lưu trữ vùng chứa khác.

Hướng dẫn này chỉ cho bạn cách chứa các ứng dụng App Engine để triển khai cho dịch vụ được quản lý hoàn toàn Cloud Run bằng Cloud Buildpacks, một giải pháp thay thế cho Docker. Cloud Buildpacks chứa các ứng dụng của bạn mà không cần quản lý các tệp Dockerfile hay thậm chí không biết gì về Docker.

Lớp học lập trình này dành cho các nhà phát triển App Engine Python 2 đã chuyển ứng dụng của họ khỏi các dịch vụ tích hợp ban đầu và chuyển chúng sang Python 3, đồng thời hiện đang tìm cách chạy các ứng dụng đó trong một vùng chứa. Lớp học lập trình này BẮT ĐẦU bằng một ứng dụng đã hoàn chỉnh của Mô-đun 2 hoặc Mô-đun 3 Python 3.

Bạn sẽ tìm hiểu cách

  • Chuyển đổi vùng chứa ứng dụng bằng Cloud Buildpack
  • Triển khai hình ảnh vùng chứa lên Cloud Run

Bạn cần có

Khảo sát

Bạn sẽ sử dụng lớp học lập trình này như thế nào?

Chỉ đọc qua Đọc và hoàn thành bài tập

2. Thông tin khái quát

Các hệ thống PaaS như App Engine và Cloud Functions mang lại nhiều tiện ích cho đội ngũ và ứng dụng của bạn. Ví dụ: các nền tảng không máy chủ này cho phép SysAdmin/Devops tập trung vào việc xây dựng giải pháp. Ứng dụng của bạn có thể tự động mở rộng quy mô khi cần, giảm quy mô về 0 nhờ tính năng thanh toán trả tiền cho mỗi lần sử dụng giúp kiểm soát chi phí và sử dụng nhiều ngôn ngữ phát triển phổ biến.

Tuy nhiên, tính linh hoạt của vùng chứa cũng rất hấp dẫn, khả năng chọn bất kỳ ngôn ngữ, thư viện hay tệp nhị phân nào. Google Cloud Run mang đến cho người dùng những lợi ích tốt nhất của cả hai nền tảng, sự tiện lợi của mô hình không máy chủ cùng tính linh hoạt của vùng chứa.

Việc tìm hiểu cách sử dụng Cloud Run không thuộc phạm vi của lớp học lập trình này; có trong tài liệu về Cloud Run. Mục tiêu ở đây là giúp bạn biết cách chứa ứng dụng App Engine cho Cloud Run (hoặc các dịch vụ khác). Có một vài điều bạn nên biết trước khi tiếp tục, chủ yếu là trải nghiệm người dùng sẽ hơi khác một chút, ở mức thấp hơn một chút vì bạn sẽ không còn sử dụng và triển khai mã xử lý ứng dụng nữa.

Thay vào đó, bạn cần tìm hiểu một điều gì đó về vùng chứa như cách xây dựng và triển khai các vùng chứa đó. Bạn cũng có thể quyết định những gì bạn muốn đặt vào hình ảnh vùng chứa, bao gồm cả máy chủ web vì bạn sẽ không sử dụng máy chủ web của App Engine nữa. Nếu bạn không muốn đi theo đường dẫn này, việc giữ ứng dụng của bạn trên App Engine không phải là một lựa chọn xấu.

Trong hướng dẫn này, bạn sẽ tìm hiểu cách chứa ứng dụng của mình, xoá tệp cấu hình App Engine, quản lý máy chủ web, bao gồm cả cách khởi động ứng dụng.

Quá trình di chuyển này bao gồm các bước sau:

  1. Thiết lập/Chuẩn bị
  2. Vùng chứa ứng dụng
    • Thay thế các tệp cấu hình
    • Sửa đổi tệp ứng dụng

3. Thiết lập/Chuẩn bị

Trước khi bắt đầu phần chính của hướng dẫn, hãy thiết lập dự án, lấy mã, sau đó triển khai ứng dụng cơ sở để biết rằng mình đã bắt đầu làm việc với mã nguồn.

1. Thiết lập dự án

Nếu đã hoàn thành các lớp học lập trình Mô-đun 2 hoặc Mô-đun 3, bạn nên sử dụng lại chính dự án (và mã nguồn). Ngoài ra, bạn có thể tạo một dự án hoàn toàn mới hoặc sử dụng lại một dự án hiện có khác. Hãy đảm bảo dự án này có một tài khoản thanh toán đang hoạt động và đã bật App Engine (ứng dụng).

2. Tải ứng dụng mẫu cơ sở

Một trong những điều kiện tiên quyết của lớp học lập trình này là phải có một ứng dụng mẫu của Mô-đun 2 hoặc 3 hoạt động được. Nếu không có hướng dẫn nào, bạn nên hoàn tất một trong hai hướng dẫn (đường liên kết ở trên) trước khi tiếp tục thực hiện tại đây. Hoặc nếu đã quen thuộc với nội dung của thư viện, bạn có thể bắt đầu bằng cách chọn một trong các thư mục mã dưới đây.

Dù bạn sử dụng tài khoản của bạn hay của chúng tôi, thì hướng dẫn này sẽ BẮT ĐẦU. Lớp học lập trình này sẽ hướng dẫn bạn thực hiện quá trình di chuyển và vào thời điểm bạn hoàn tất, kết quả sẽ gần như khớp với nội dung trong thư mục repo nhịp 5 của Mô-đun 5.

Thư mục của các tệp START (của bạn hoặc của chúng tôi) sẽ có dạng như sau:

$ ls
README.md               main.py                 templates
app.yaml                requirements.txt

3. (Triển khai lại) ứng dụng cơ sở

Các bước chuẩn bị còn lại để thực hiện ngay:

  1. Làm quen lại bằng công cụ dòng lệnh gcloud
  2. Triển khai lại ứng dụng mẫu bằng gcloud app deploy
  3. Xác nhận rằng ứng dụng chạy trên App Engine mà không gặp vấn đề nào

Sau khi thực thi thành công các bước đó, bạn đã sẵn sàng chứa thông tin trong vùng chứa.

4. Trong vùng chứa ứng dụng

Docker là nền tảng tiêu chuẩn cho việc sử dụng vùng chứa trong ngành công nghiệp hiện nay. Như đã đề cập trước đó, một thách thức khi sử dụng thuộc tính này là bạn phải nỗ lực tuyển chọn một Dockerfile hiệu quả (tệp cấu hình giúp xác định cách tạo hình ảnh vùng chứa của bạn). Mặt khác, Buildpack (gói bản dựng) không cần nhiều công sức vì chức năng này dùng nội dung để xác định các phần phụ thuộc của ứng dụng, giúp vùng chứa Buildpacks mang lại hiệu quả cao nhất có thể cho ứng dụng của bạn.

Bạn đã đến đúng nơi nếu muốn bỏ qua việc tìm hiểu về Docker và muốn lưu trữ ứng dụng App Engine của mình để chạy trên Cloud Run hoặc bất kỳ nền tảng lưu trữ vùng chứa nào khác. Nếu muốn tìm hiểu cách sử dụng Docker để sử dụng vùng chứa ứng dụng, bạn có thể tham gia Lớp học lập trình về Mô-đun 4 sau khi hoàn thành lớp này. Nó giống với ví dụ này, nhưng sử dụng Docker để giúp bạn hiểu rõ hơn về cách quản lý hình ảnh vùng chứa.

Các bước di chuyển bao gồm thay thế tệp cấu hình App Engine và chỉ định cách ứng dụng của bạn bắt đầu hoạt động. Dưới đây là bảng tóm tắt các tệp cấu hình có thể sử dụng cho từng loại nền tảng. So sánh cột App Engine với cột Buildpacks (và Docker không bắt buộc):

Nội dung mô tả

App Engine

Docker

Gói bản dựng

Cấu hình chung

app.yaml

Dockerfile

(service.yaml)

Thư viện của bên thứ ba

requirements.txt

requirements.txt

requirements.txt

Cấu hình của bên thứ ba

app.yaml (cộng với appengine_config.pylib [chỉ 2.x])

(không áp dụng)

(không áp dụng)

Khởi động

(không áp dụng) hoặc app.yaml (nếu sử dụng entrypoint)

Dockerfile

Procfile

Bỏ qua tệp

.gcloudignore.gitignore

.gcloudignore, .gitignore.dockerignore

.gcloudignore.gitignore

Sau khi được lưu trữ trong vùng chứa, ứng dụng của bạn có thể được triển khai lên Cloud Run. Các lựa chọn khác về nền tảng vùng chứa Google Cloud bao gồm Compute Engine, GKEAnthos.

Cấu hình chung

App Engine tự động khởi động ứng dụng của bạn, nhưng Cloud Run thì không. Procfile có vai trò tương tự như lệnh app.yaml entrypoint. Đối với ứng dụng mẫu, Procfile sẽ thực thi python main.py để khởi động máy chủ phát triển Flask. Bạn cũng có thể sử dụng một máy chủ web phát hành công khai như gunicorn nếu muốn. Nếu có, hãy nhớ thêm máy chủ đó vào requirements.txt. Tìm hiểu thêm về cách triển khai từ mã nguồn bằng Buildpacks trên trang tài liệu này của Cloud Run.

Bạn chỉ cần di chuyển lệnh app.yaml entrypoint vào Procfile. Nếu bạn chưa có ứng dụng thử nghiệm, hãy sử dụng máy chủ phát triển Flask ngay bây giờ vì đây chỉ là một ứng dụng thử nghiệm mẫu để giúp người dùng làm quen với quá trình di chuyển này. Ứng dụng của bạn sẽ là một lệnh khởi động cụ thể mà bạn hiểu rõ nhất. Ở bên dưới, dịch vụ Cloud Run sẽ tạo một service.yaml trông/hoạt động giống app.yaml. Bạn có thể xem service.yaml được tạo tự động bằng cách truy cập vào một đường liên kết như sau, nhưng đối với dịch vụ SVC_NAMEREGION của bạn: https://console.cloud.google.com/run/detail/REGION/SVC_NAME/yaml/view.

Thư viện của bên thứ ba

Tệp requirements.txt không cần thay đổi; Bình chứa dữ liệu phải có ở đó cùng với thư viện ứng dụng Datastore (Cloud Datastore hoặc Cloud NDB). Nếu bạn muốn sử dụng một máy chủ HTTP khác tuân thủ WSGI như Gunicorn (phiên bản hiện tại tại thời điểm viết bài này là 20.0.4), hãy thêm gunicorn==20.0.4 vào requirements.txt.

Cấu hình của bên thứ ba

Buildpack không hỗ trợ Python 2, vì vậy chúng tôi không thảo luận về vấn đề này ở đây. Các ứng dụng Python 3 chạy trong vùng chứa trên Cloud Run cũng tương tự như các ứng dụng Python 3 App Engine trong đó thư viện của bên thứ ba phải được chỉ định trong requirements.txt.

Khởi động

Người dùng Python 3 có thể chuyển đổi tệp app.yaml để có lệnh entrypoint thay vì lệnh script: auto trong mục handlers. Nếu bạn sử dụng entrypoint trong Python 3 app.yaml, mã sẽ có dạng như sau:

runtime: python38
entrypoint: python main.py

Lệnh entrypoint hướng dẫn App Engine cách khởi động máy chủ của bạn. Bạn có thể di chuyển gần như trực tiếp vào Procfile. Tóm tắt vị trí mà một lệnh điểm truy cập sẽ xuất hiện giữa cả hai nền tảng: Thao tác này sẽ được dịch trực tiếp sang bên dưới; cũng cho thấy tương đương của Docker dưới dạng FYI:

  • Gói bản dựng: dòng trong Procfile: web: python main.py
  • Docker: dòng trong Dockerfile: ENTRYPOINT ["python", "main.py"]

Để thử nghiệm và chạy thử, bạn có thể dễ dàng chạy máy chủ phát triển của Flask từ Python như chúng tôi đã trình bày ở trên, nhưng nhà phát triển có thể chọn một công cụ mạnh mẽ hơn để phát hành chính thức, chẳng hạn như mẫu Cloud Run Quickstart (mẫu sử dụng gunicorn).

Tệp ứng dụng

Tất cả ứng dụng Mô-đun 2 hoặc Mô-đun 3 đều hoàn toàn tương thích với Python 2-3, tức là không có thay đổi nào đối với các thành phần cốt lõi của main.py; chúng ta sẽ chỉ thêm một vài dòng mã khởi động. Thêm một cặp dòng ở cuối main.py để khởi động máy chủ phát triển vì Cloud Run yêu cầu phải mở cổng 8080 để có thể gọi ứng dụng của bạn:

if __name__ == '__main__':
    import os
    app.run(debug=True, threaded=True, host='0.0.0.0',
            port=int(os.environ.get('PORT', 8080)))

5. Xây dựng và triển khai

Với cấu hình App Engine của bạn được thay thế bằng Buildpacks và cập nhật tệp nguồn đã hoàn tất, bạn đã sẵn sàng chạy ứng dụng trên Cloud Run. Trước đó, hãy thảo luận ngắn gọn về services.

Dịch vụ so với Ứng dụng

Mặc dù App Engine chủ yếu được tạo ra để lưu trữ ứng dụng, nhưng đây cũng là nền tảng để lưu trữ các dịch vụ web hoặc ứng dụng tạo thành từ một tập hợp các dịch vụ vi mô. Trong Cloud Run, mọi thứ đều là dịch vụ, dù đó là dịch vụ thực tế hay ứng dụng có giao diện web. Vì vậy, hãy coi việc sử dụng dịch vụ là triển khai dịch vụ thay vì ứng dụng.

Trừ phi ứng dụng App Engine của bạn được tạo thành từ nhiều dịch vụ, bạn thực sự không phải thực hiện bất kỳ cách đặt tên nào khi triển khai ứng dụng của mình. Điều này sẽ thay đổi với Cloud Run, vì vậy, bạn sẽ cần phải đặt tên dịch vụ. Trong khi đó, miền appspot.com của App Engine có mã dự án riêng, ví dụ: https://PROJECT_ID.appspot.com và có thể là chữ viết tắt của mã khu vực, ví dụ: http://PROJECT_ID.REGION_ID.r.appspot.com.

Tuy nhiên, miền của dịch vụ Cloud Run có tên dịch vụ, chữ viết tắt mã khu vực và giá trị băm, chứ không phải mã dự án, ví dụ: https://SVC_NAME-HASH-REG_ABBR.a.run.app. Nói tóm lại, hãy bắt đầu nghĩ đến tên dịch vụ!

Triển khai dịch vụ

Thực thi lệnh bên dưới để tạo hình ảnh vùng chứa của bạn và triển khai lên Cloud Run. Khi được nhắc, hãy chọn khu vực của bạn và cho phép kết nối chưa được xác thực để kiểm thử dễ dàng hơn và chọn khu vực của bạn cho phù hợp, trong đó SVC_NAME là tên dịch vụ bạn đang triển khai.

$ gcloud run deploy SVC_NAME --source .
Please choose a target platform:
 [1] Cloud Run (fully managed)
 [2] Cloud Run for Anthos deployed on Google Cloud
 [3] Cloud Run for Anthos deployed on VMware
 [4] cancel
Please enter your numeric choice:  1

To specify the platform yourself, pass `--platform managed`. Or, to make this the default target platform, run `gcloud config set run/platform managed`.

Please specify a region:
 [1] asia-east1
 [2] asia-east2
 [3] asia-northeast1
 [4] asia-northeast2
 [5] asia-northeast3
 [6] asia-south1
 [7] asia-southeast1
 [8] asia-southeast2
 [9] australia-southeast1
 [10] europe-north1
 [11] europe-west1
 [12] europe-west2
 [13] europe-west3
 [14] europe-west4
 [15] europe-west6
 [16] northamerica-northeast1
 [17] southamerica-east1
 [18] us-central1
 [19] us-east1
 [20] us-east4
 [21] us-west1
 [22] us-west2
 [23] us-west3
 [24] us-west4
 [25] cancel
Please enter your numeric choice: <select your numeric region choice>

To make this the default region, run `gcloud config set run/region REGION`.

Allow unauthenticated invocations to [SVC_NAME] (y/N)?  y

Building using Buildpacks and deploying container to Cloud Run service [SVC_NAME] in project [PROJECT_ID] region [REGION]
✓ Building and deploying... Done.
  ✓ Uploading sources...
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/BUILD-HASH?project=PROJECT_NUM].
  ✓ Creating Revision...
  ✓ Routing traffic...
Done.
Service [SVC_NAME] revision [SVC_NAME-00014-soc] has been deployed and is serving 100 percent of traffic.
Service URL: https://SVC_NAME-HASH-REG_ABBR.a.run.app

Truy cập vào URL được chỉ định bằng trình duyệt của bạn để xác nhận rằng quá trình triển khai đã thành công!

Như lệnh gcloud cho biết, người dùng có thể đặt nhiều chế độ cài đặt mặc định để giảm đầu ra và tính tương tác như đã trình bày ở trên. Ví dụ: để tránh tất cả các lượt tương tác, bạn có thể dùng lệnh triển khai một dòng sau đây:

$ gcloud beta run deploy SVC_NAME --source . --platform managed --region REGION --allow-unauthenticated

Nếu bạn sử dụng dịch vụ này, hãy nhớ chọn cùng một tên dịch vụ SVC_NAMEtên REGION mong muốn, chứ không phải lựa chọn trình đơn được lập chỉ mục như chúng ta đã làm tương tác ở trên.

6. Tóm tắt/Dọn dẹp

Xác nhận rằng ứng dụng hoạt động trên Cloud Run giống như trên App Engine. Nếu bạn đã xem loạt video này mà không thực hiện bất kỳ lớp học lập trình nào trước đó thì ứng dụng sẽ không thay đổi; trang này sẽ ghi lại tất cả lượt truy cập vào trang web chính (/) và có dạng như sau khi bạn đã truy cập đủ số lần vào trang web:

ứng dụng visitme

Mã của bạn bây giờ sẽ khớp với nội dung trong thư mục kho lưu trữ Mô-đun 5. Chúc mừng bạn đã hoàn thành lớp học lập trình Học phần 5 này.

Không bắt buộc: Dọn dẹp

Còn việc dọn dẹp để tránh bị tính phí cho đến khi bạn sẵn sàng chuyển sang lớp học lập trình di chuyển tiếp theo thì sao? Vì bạn đang dùng một sản phẩm khác, hãy nhớ xem hướng dẫn về giá của Cloud Run.

Không bắt buộc: Tắt dịch vụ

Nếu bạn chưa sẵn sàng chuyển đến hướng dẫn tiếp theo, hãy tắt dịch vụ của bạn để tránh phát sinh thêm phí. Khi đã sẵn sàng chuyển sang lớp học lập trình tiếp theo, bạn có thể bật lại lớp học này. Mặc dù bị vô hiệu hoá, ứng dụng của bạn sẽ không nhận được bất kỳ lưu lượng truy cập nào để bị tính phí. Tuy nhiên, một điều khác bạn có thể bị tính phí là mức sử dụng Datastore nếu vượt quá hạn mức miễn phí, vì vậy, hãy xoá đủ để nằm trong giới hạn đó.

Mặt khác, nếu không định tiếp tục quá trình di chuyển và muốn xoá hoàn toàn mọi thứ, thì bạn có thể xoá dịch vụ hoặc tắt hoàn toàn dự án.

Các bước tiếp theo

Xin chúc mừng, bạn đã sắp xếp ứng dụng của mình vào vùng chứa. Bài học này kết thúc hướng dẫn này! Từ đây, bước tiếp theo là tìm hiểu cách thực hiện tương tự với Docker trong lớp học lập trình Mô-đun 4 (đường liên kết bên dưới) hoặc thực hiện một quá trình di chuyển khác trên App Engine:

  • Học phần 4: Di chuyển sang Cloud Run bằng Docker
    • Trong vùng chứa để ứng dụng chạy trên Cloud Run bằng Docker
    • Cho phép bạn ở lại Python 2
  • Mô-đun 7: Hàng đợi tác vụ đẩy của App Engine (bắt buộc nếu bạn sử dụng Hàng đợi tác vụ [push])
    • Thêm các tác vụ đẩy taskqueue của App Engine vào ứng dụng Mô-đun 1
    • Giúp người dùng chuẩn bị để di chuyển sang Cloud Tasks trong Mô-đun 8
  • Học phần 3:
    • Hiện đại hoá quyền truy cập vào Datastore từ Cloud NDB thành Cloud Datastore
    • Đây là thư viện dùng cho các ứng dụng Python 3 App Engine và các ứng dụng không phải App Engine
  • Học phần 6: Di chuyển sang Cloud Firestore
    • Di chuyển sang Cloud Firestore để sử dụng các tính năng của Firebase
    • Mặc dù Cloud Firestore hỗ trợ Python 2, nhưng lớp học lập trình này chỉ dùng được với Python 3.

7. Tài nguyên khác

Vấn đề/phản hồi trong lớp học lập trình mô-đun di chuyển App Engine

Nếu bạn gặp vấn đề với lớp học lập trình này, vui lòng tìm vấn đề của bạn trước khi gửi. Đường liên kết để tìm kiếm và báo cáo vấn đề mới:

Tài nguyên di chuyển

Bạn có thể tìm thấy các đường liên kết đến các thư mục repo cho Mô-đun 2 và 3 (START) và Mô-đun 5 (gián đoạn) trong bảng bên dưới. Bạn cũng có thể truy cập vào các tệp này qua kho lưu trữ dành cho mọi quá trình di chuyển trong lớp học lập trình App Engine. Tại đây, bạn có thể sao chép hoặc tải tệp ZIP xuống.

Codelab

Python 2

Python 3

Học phần 2

()

Học phần 3

()

Học phần 5

(không áp dụng)

Tài nguyên của App Engine và Cloud Run

Dưới đây là các thông tin khác liên quan đến việc di chuyển cụ thể này: