Mô-đun 4: Di chuyển từ Google App Engine sang Cloud Run bằng Docker

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 trên Cloud Run bằng Docker, một nền tảng nổi tiếng trong ngành dùng để phát triển, vận chuyển và chạy ứng dụng trong vùng chứa. Đối với các nhà phát triển Python 2, hướng dẫn này sẽ BẮT ĐẦU với ứng dụng mẫu của Mô-đun Cloud NDB App Engine 2 trong khi các nhà phát triển Python 3 BẮT ĐẦU với mẫu Kho dữ liệu đám mây mô-đun 3.

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

  • Vùng chứa ứng dụng bằng Docker
  • 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, thay thế tệp cấu hình App Engine bằng cấu hình vùng chứa, xác định nội dung nào đi vào vùng chứa, sau đó chỉ định cách khởi động ứng dụng — nhiều việc trong số này được App Engine xử lý tự độ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ó ứng dụng mẫu của Mô-đun 2 hoặc Mô-đun 3 hoạt động được. Nếu bạn chưa có tài khoản, hãy xem toàn bộ một trong hai hướng dẫn ở trên trước khi tiếp tục thực hiện các bước này. Hoặc nếu đã quen với nội dung của khoá học, bạn có thể bắt đầu bằng cách lấy mã Mô-đun 2 hoặc 3 dưới đây.

Cho dù bạn sử dụng mã của bạn hay của chúng tôi, mã Mô-đun 2 là nơi chúng tôi sẽ BẮT ĐẦU cho phiên bản Python 2 của hướng dẫn này, và tương tự, mã Mô-đun 3 cho Python 3. Lớp học lập trình của Mô-đun 4 này sẽ hướng dẫn bạn qua từng bước và tuỳ thuộc vào lựa chọn của bạn, bạn nên tạo đoạn mã giống với một trong các thư mục repo của Mô-đun 4 (Finish) khi hoàn tất.

Thư mục của các tệp KHỞI ĐỘNG Mô-đun 2 Python 2 (của bạn hoặc của chúng tôi) sẽ có dạng như sau:

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

Nếu đang sử dụng mã Mô-đun 2 (2.x) của riêng mình, thì bạn cũng sẽ có một thư mục lib. Cả libappengine_config.py đều không được sử dụng cho Python 3, trong đó mã BẮT ĐẦU Mô-đun 3 (3.x) phải 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 đã biết về vùng chứa, Docker và muốn tìm hiểu thêm về cách vùng chứa ứng dụng App Engine cho Cloud Run. Bạn cũng có thể tham gia Lớp học lập trình dành cho Mô-đun 5 (giống với lớp học này nhưng với Cloud Buildpacks) sau đó. Ứng dụng mẫu barebones của chúng tôi đủ nhẹ để tránh một số vấn đề về Dockerfile nêu trên.

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 Docker (và các gói Buildpack 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

Di chuyển từ App Engine có nghĩa là thay thế app.yaml bằng một Dockerfile trình bày cách tạo và chạy vùng chứa. App Engine tự động khởi động ứng dụng của bạn, nhưng Cloud Run thì không. Đây là mục đích của lệnh Dockerfile ENTRYPOINTCMD. Tìm hiểu thêm về Dockerfile trên trang tài liệu này trên Cloud Run, cũng như xem một ví dụ về Dockerfile tạo gunicorn.

Giải pháp thay thế cho việc sử dụng ENTRYPOINT hoặc CMD trong Dockerfile là sử dụng Procfile. Cuối cùng, .dockerignore giúp lọc ra các tệp không phải ứng dụng để giảm kích thước vùng chứa. Sắp tới sẽ có thêm nhiều thông tin về những tính năng này!

Xoá app.yaml và tạo Dockerfile

app.yaml không được dùng trong vùng chứa, vì vậy, hãy xoá ngay. Tệp cấu hình vùng chứa là Dockerfile và ứng dụng mẫu của chúng ta chỉ yêu cầu một tệp cấu hình tối thiểu. Tạo Dockerfile bằng nội dung này, thay thế NNN bằng 2 hoặc 3, tuỳ thuộc vào phiên bản Python bạn đang sử dụng:

FROM python:NNN-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
ENTRYPOINT ["python", "main.py"]

Hầu hết Dockerfile chỉ định cách tạo vùng chứa ngoại trừ ENTRYPOINT chỉ định cách bắt đầu vùng chứa, trong trường hợp này là gọi python main.py để thực thi máy chủ phát triển Flask. Nếu bạn mới sử dụng Docker, lệnh FROM sẽ chỉ ra hình ảnh cơ sở để bắt đầu và là "slim" đề cập đến phân phối Python tối thiểu. Tìm hiểu thêm trên trang hình ảnh Docker Python.

Tập hợp các lệnh ở giữa tạo thư mục đang hoạt động (/app), các bản sao trong các tệp ứng dụng, sau đó chạy pip install để đưa thư viện của bên thứ ba vào vùng chứa. WORKDIR kết hợp các lệnh mkdircd của Linux với nhau; hãy đọc thêm về vấn đề này trong tài liệu về WORKDIR . Các lệnh COPYRUN sẽ dễ hiểu.

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

Tệp requirements.txt có thể giữ nguyên; 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

Các nhà phát triển App Engine Python 2 biết rằng các thư viện của bên thứ ba sẽ được sao chép vào thư mục lib, được tham chiếu trong requirements.txt, được phân thành mục trong app.yaml và được appengine_config.py hỗ trợ. Các vùng chứa, chẳng hạn như các ứng dụng Python 3 App Engine, chỉ sử dụng requirements.txt, vì vậy mọi nội dung khác đều có thể bị loại bỏ, nghĩa là nếu bạn có ứng dụng 2.x App Engine, hãy xoá appengine_config.py và mọi thư mục lib ngay bây giờ.

Khởi động

Người dùng Python 2 không khởi động máy chủ web của App Engine, nhưng bạn phải thực hiện việc này khi chuyển sang một vùng chứa. Bạn có thể thực hiện việc này bằng cách thêm lệnh CMD hoặc ENTRYPOINT vào Dockerfile để chỉ định cách khởi động ứng dụng. Cách thực hiện tương tự như đối với người dùng Python 3 được mô tả ở bên dưới.

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 Dockerfile (hoặc Procfile nếu sử dụng Gói bản dựng [xem Mô-đun 5] để chứa ứng dụng). Tóm tắt vị trí mà một lệnh điểm truy cập sẽ diễn ra giữa cả hai nền tảng:

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

Bạn có thể dùng máy chủ phát triển Flask cho mục đích kiểm thử, nhưng nếu sử dụng một máy chủ phát hành chính thức như gunicorn cho ứng dụng, hãy nhớ trỏ lệnh ENTRYPOINT hoặc CMD vào máy chủ đó giống như trong mẫu Bắt đầu nhanh Cloud Run.

Bỏ qua tệp

Bạn nên tạo tệp .dockerignore để cắt giảm kích thước của vùng chứa và không làm lộn xộn hình ảnh vùng chứa với các tệp thừa như sau:

*.md
*.pyc
*.pyo
.git/
.gitignore
__pycache__

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

Sau khi hoàn tất quá trình cập nhật tệp nguồn và cấu hình Docker, 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 beta 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 Dockerfile and deploying container to Cloud Run service [SVC_NAME] in project [PROJECT_ID] region [REGION]
✓ Building and deploying new service... Done.
  ✓ Uploading sources...
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/BUILD-HASH?project=PROJECT_NUM].
  ✓ Creating Revision... Deploying Revision.
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [SVC_NAME] revision [SVC_NAME-00001-vos] 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ờ phải khớp với nội dung trong thư mục repo Mô-đun 4, cho dù đó là 2.x hay 3.x. Chúc mừng bạn đã hoàn thành lớp học lập trình Học phần 4 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 Cloud Buildpacks trong lớp học lập trình Mô-đun 5 (đườ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:

  • Di chuyển sang Python 3 nếu bạn chưa di chuyển. Ứng dụng mẫu đã tương thích với phiên bản 2.x và 3.x, vì vậy, thay đổi duy nhất là đối với người dùng Docker cập nhật Dockerfile để sử dụng hình ảnh Python 3.
  • Học phần 5: Di chuyển sang Cloud Run bằng các gói bản dựng trên đám mây
    • Trong vùng chứa của ứng dụng để chạy trên Cloud Run bằng Cloud Buildpacks
    • Bạn không cần phải biết gì về Docker, vùng chứa hoặc Dockerfile
    • Yêu cầu bạn phải di chuyển ứng dụng của mình sang Python 3
  • 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 4 (complete) 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 4

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: