1. Tổng quan
Loạt lớp học lập trình Serverless Migration Station (hướng dẫn thực hành theo tốc độ của riêng bạn) và các video liên quan nhằm giúp các nhà phát triển Google Cloud không máy chủ hiện đại hoá các ứng dụng của họ bằng cách hướng dẫn họ thực hiện một hoặc nhiều quy trình di chuyển, chủ yếu là chuyển từ các dịch vụ cũ. Làm như vậy sẽ giúp ứng dụng của bạn dễ dàng di chuyển hơn, đồng thời mang đến cho bạn nhiều lựa chọn và sự linh hoạt hơn, cho phép bạn tích hợp và truy cập vào nhiều sản phẩm trên đám mây hơn, cũng như dễ dàng nâng cấp lên các bản phát hành ngôn ngữ mới hơn. Mặc dù ban đầu tập trung vào những người dùng Cloud sớm nhất, chủ yếu là các nhà phát triển App Engine (môi trường tiêu chuẩn), nhưng loạt bài này đủ rộng để bao gồm các nền tảng không máy chủ khác như Cloud Functions và Cloud Run, hoặc ở những nơi khác nếu có thể.
Lớp học lập trình này hướng dẫn bạn cách sử dụng các tác vụ đẩy Hàng đợi tác vụ App Engine trong ứng dụng mẫu của lớp học lập trình Mô-đun 1. Bài đăng trên blog và video về Mô-đun 7 bổ sung cho hướng dẫn này, cung cấp thông tin tổng quan ngắn gọn về nội dung trong hướng dẫn này.
Trong mô-đun này, chúng ta sẽ thêm việc sử dụng các tác vụ push, sau đó di chuyển việc sử dụng đó sang Cloud Tasks trong Mô-đun 8 và sau đó sang Python 3 và Cloud Datastore trong Mô-đun 9. Những người sử dụng Hàng đợi tác vụ cho các tác vụ kéo sẽ di chuyển sang Cloud Pub/Sub và nên tham khảo các Mô-đun 18-19.
Bạn sẽ tìm hiểu cách
- Sử dụng API Hàng đợi tác vụ/dịch vụ đi kèm của App Engine
- Thêm mức sử dụng tác vụ truyền dữ liệu vào một ứng dụng NDB cơ bản của Python 2 Flask App Engine
Bạn cần có
- Một dự án trên Google Cloud có tài khoản thanh toán GCP đang hoạt động
- Kỹ năng cơ bản về Python
- Có kiến thức cơ bản về các lệnh Linux thường dùng
- Kiến thức cơ bản về cách phát triển và triển khai các ứng dụng App Engine
- Một ứng dụng App Engine hoạt động ở Mô-đun 1 (hoàn thành lớp học lập trình này [nên dùng] hoặc sao chép ứng dụng từ kho lưu trữ)
Bản khảo sát
Bạn sẽ sử dụng hướng dẫn này như thế nào?
Bạn đánh giá thế nào về trải nghiệm của mình với Python?
Bạn đánh giá thế nào về trải nghiệm khi sử dụng các dịch vụ của Google Cloud?
2. Thông tin khái quát
Hàng đợi tác vụ App Engine hỗ trợ cả tác vụ đẩy và kéo. Để cải thiện khả năng di chuyển ứng dụng, nhóm Google Cloud đề xuất bạn di chuyển từ các dịch vụ cũ đi kèm (chẳng hạn như Hàng đợi tác vụ) sang các dịch vụ tương đương độc lập trên Cloud hoặc của bên thứ ba.
- Người dùng Task Queue push task (tác vụ đẩy Hàng đợi tác vụ) nên di chuyển sang Cloud Tasks.
- Người dùng kéo tác vụ của Hàng đợi tác vụ nên di chuyển sang Cloud Pub/Sub.
Việc di chuyển tác vụ kéo được đề cập trong Các mô-đun di chuyển 18-19, trong khi Các mô-đun 7-9 tập trung vào việc di chuyển tác vụ đẩy. Để di chuyển từ các tác vụ đẩy của Hàng đợi tác vụ App Engine, hãy thêm việc sử dụng hàng đợi này vào ứng dụng Flask và App Engine NDB hiện có có được từ lớp học lập trình Mô-đun 1. Trong ứng dụng đó, một lượt xem trang mới sẽ ghi nhận một Lượt truy cập mới và hiển thị những lượt truy cập gần đây nhất cho người dùng. Vì các lượt truy cập cũ sẽ không bao giờ xuất hiện lại và chiếm dung lượng trong Datastore, nên chúng ta sẽ tạo một tác vụ truyền dữ liệu để tự động xoá các lượt truy cập cũ nhất. Trong Mô-đun 8, chúng ta sẽ di chuyển ứng dụng đó từ Hàng đợi tác vụ sang Cloud Tasks.
Hướng dẫn này có các bước sau:
- Thiết lập/Công việc chuẩn bị
- Cập nhật cấu hình
- Sửa đổi mã xử lý ứng dụng
3. Thiết lập/Công việc chuẩn bị
Phần này giải thích cách:
- Thiết lập dự án trên đám mây
- Tải ứng dụng mẫu cơ sở
- (Triển khai lại) và xác thực ứng dụng cơ sở
Các bước này đảm bảo bạn bắt đầu bằng mã đang hoạt động.
1. Thiết lập dự án
Nếu đã hoàn thành lớp học lập trình Mô-đun 1, bạn nên sử dụng lại chính dự án (và mã) đó. 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. Đảm bảo dự án có một tài khoản thanh toán đang hoạt động và App Engine được bật.
2. Tải ứng dụng mẫu cơ sở
Một trong những điều kiện tiên quyết để tham gia lớp học lập trình này là phải có một ứng dụng App Engine hoạt động ở Mô-đun 1: hoàn thành lớp học lập trình Mô-đun 1 (nên dùng) hoặc sao chép ứng dụng Mô-đun 1 từ kho lưu trữ. Cho dù bạn dùng mã của mình hay của chúng tôi, mã của Mô-đun 1 sẽ là nơi chúng ta "BẮT ĐẦU". Lớp học lập trình này sẽ hướng dẫn bạn từng bước, kết thúc bằng đoạn mã tương tự như đoạn mã trong thư mục "FINISH" của kho lưu trữ Mô-đun 7.
- BẮT ĐẦU: Thư mục Mô-đun 1 (Python 2)
- HOÀN TẤT: Thư mục Mô-đun 7 (Python 2)
- Toàn bộ kho lưu trữ (để sao chép hoặc tải tệp ZIP xuống)
Bất kể bạn dùng ứng dụng nào trong Mô-đun 1, thư mục này sẽ có dạng như bên dưới, có thể có cả thư mục lib:
$ ls README.md main.py templates app.yaml requirements.txt
3. (Triển khai lại) Ứng dụng cơ sở
Thực hiện các bước sau để (triển khai lại) ứng dụng Mô-đun 1:
- Xoá thư mục
lib(nếu có) rồi chạy:pip install -t lib -r requirements.txtđể điền lạilib. Bạn có thể cần dùng lệnhpip2nếu đã cài đặt cả Python 2 và 3. - Đảm bảo bạn đã cài đặt và khởi chạy công cụ dòng lệnh
gcloud, đồng thời đã xem xét cách sử dụng công cụ này. - Đặt dự án trên đám mây bằng
gcloud config set projectPROJECT_IDnếu bạn không muốn nhậpPROJECT_IDmỗi khi đưa ra lệnhgcloud. - Triển khai ứng dụng mẫu bằng
gcloud app deploy - Xác nhận rằng ứng dụng Mô-đun 1 chạy như mong đợi mà không gặp vấn đề khi hiển thị các lượt truy cập gần đây nhất (minh hoạ bên dưới)

4. Cập nhật cấu hình
Bạn không cần thay đổi các tệp cấu hình App Engine tiêu chuẩn (app.yaml, requirements.txt, appengine_config.py).
5. Sửa đổi tệp ứng dụng
Tệp ứng dụng chính là main.py và tất cả nội dung cập nhật trong phần này đều liên quan đến tệp đó. Ngoài ra, mẫu trang web templates/index.html cũng có một bản cập nhật nhỏ. Sau đây là những thay đổi cần triển khai trong phần này:
- Cập nhật các lệnh nhập
- Thêm việc cần làm bằng thông báo đẩy
- Thêm trình xử lý tác vụ
- Cập nhật mẫu trang web
1. Cập nhật các lệnh nhập
Việc nhập google.appengine.api.taskqueue sẽ mang lại chức năng Hàng đợi tác vụ. Bạn cũng cần một số gói thư viện chuẩn của Python:
- Vì chúng ta đang thêm một tác vụ để xoá các lượt truy cập cũ nhất, nên ứng dụng sẽ cần xử lý dấu thời gian, tức là sử dụng
timevàdatetime. - Để ghi lại thông tin hữu ích liên quan đến việc thực thi tác vụ, chúng ta cần
logging.
Sau khi thêm tất cả các nội dung nhập này, mã của bạn sẽ trông như sau trước và sau khi thực hiện những thay đổi này:
TRƯỚC:
from flask import Flask, render_template, request
from google.appengine.ext import ndb
SAU:
from datetime import datetime
import logging
import time
from flask import Flask, render_template, request
from google.appengine.api import taskqueue
from google.appengine.ext import ndb
2. Thêm tác vụ đẩy (đối chiếu dữ liệu cho tác vụ, xếp hàng tác vụ mới)
Tài liệu về hàng đợi đẩy nêu rõ: "Để xử lý một tác vụ, bạn phải thêm tác vụ đó vào hàng đợi đẩy. App Engine cung cấp một hàng đợi đẩy mặc định có tên là default. Hàng đợi này được định cấu hình và sẵn sàng sử dụng với các chế độ cài đặt mặc định. Nếu muốn, bạn chỉ cần thêm tất cả các tác vụ vào hàng đợi mặc định mà không cần tạo và định cấu hình các hàng đợi khác." Lớp học lập trình này sử dụng hàng đợi default để cho ngắn gọn. Để tìm hiểu thêm về cách xác định hàng đợi truyền dữ liệu của riêng bạn, có cùng đặc điểm hoặc đặc điểm khác nhau, hãy xem tài liệu Tạo hàng đợi truyền dữ liệu.
Mục tiêu chính của lớp học lập trình này là thêm một tác vụ (vào hàng đợi đẩy default) có nhiệm vụ xoá những lượt truy cập cũ không còn xuất hiện trên Datastore nữa. Ứng dụng cơ sở đăng ký từng lượt truy cập (yêu cầu GET đến /) bằng cách tạo một thực thể Visit mới, sau đó tìm nạp và hiển thị các lượt truy cập gần đây nhất. Không có lượt truy cập cũ nhất nào được hiển thị hoặc sử dụng lại, vì vậy, tác vụ đẩy xoá tất cả lượt truy cập cũ hơn lượt truy cập cũ nhất được hiển thị. Để thực hiện việc này, hành vi của ứng dụng cần thay đổi một chút:
- Khi truy vấn các lượt truy cập gần đây nhất, thay vì trả về ngay những lượt truy cập đó, hãy sửa đổi ứng dụng để lưu dấu thời gian của
Visitcuối cùng, lượt truy cập cũ nhất được hiển thị – bạn có thể xoá tất cả các lượt truy cập cũ hơn lượt truy cập này. - Tạo một tác vụ đẩy có dấu thời gian này làm tải trọng và chuyển hướng tác vụ đó đến trình xử lý tác vụ, có thể truy cập thông qua
POSTHTTP đến/trim. Cụ thể, hãy sử dụng các tiện ích Python tiêu chuẩn để chuyển đổi dấu thời gian Datastore và gửi dấu thời gian đó (dưới dạng số thực) đến tác vụ, đồng thời ghi nhật ký (dưới dạng chuỗi) và trả về chuỗi đó dưới dạng giá trị báo hiệu để hiển thị cho người dùng.
Tất cả những điều này diễn ra trong fetch_visits() và đây là giao diện trước và sau khi thực hiện những nội dung cập nhật này:
TRƯỚC:
def fetch_visits(limit):
return (v.to_dict() for v in Visit.query().order(
-Visit.timestamp).fetch(limit))
SAU:
def fetch_visits(limit):
'get most recent visits and add task to delete older visits'
data = Visit.query().order(-Visit.timestamp).fetch(limit)
oldest = time.mktime(data[-1].timestamp.timetuple())
oldest_str = time.ctime(oldest)
logging.info('Delete entities older than %s' % oldest_str)
taskqueue.add(url='/trim', params={'oldest': oldest})
return (v.to_dict() for v in data), oldest_str
3. Thêm trình xử lý tác vụ (mã được gọi khi tác vụ chạy)
Mặc dù bạn có thể dễ dàng xoá các lượt truy cập cũ trong fetch_visits(), nhưng hãy lưu ý rằng chức năng này không liên quan nhiều đến người dùng cuối. Đây là chức năng phụ trợ và là một lựa chọn phù hợp để xử lý không đồng bộ bên ngoài các yêu cầu tiêu chuẩn của ứng dụng. Người dùng cuối sẽ được hưởng lợi từ các truy vấn nhanh hơn vì sẽ có ít thông tin hơn trong Datastore. Tạo một hàm mới trim(), được gọi thông qua yêu cầu POST của Hàng đợi tác vụ đến /trim, hàm này sẽ thực hiện những việc sau:
- Trích xuất tải trọng dấu thời gian "lượt truy cập lâu nhất"
- Đưa ra một truy vấn Datastore để tìm tất cả thực thể cũ hơn dấu thời gian đó.
- Chọn truy vấn "chỉ có khoá" nhanh hơn vì không cần dữ liệu người dùng thực tế.
- Ghi nhật ký số lượng thực thể cần xoá (kể cả số 0).
- Gọi
ndb.delete_multi()để xoá mọi thực thể (bỏ qua nếu không có). - Trả về một chuỗi trống (cùng với mã trả về HTTP 200 ngầm định).
Bạn có thể xem tất cả những thông tin đó trong phần trim() bên dưới. Thêm mã này vào main.py ngay sau fetch_visits():
@app.route('/trim', methods=['POST'])
def trim():
'(push) task queue handler to delete oldest visits'
oldest = request.form.get('oldest', type=float)
keys = Visit.query(
Visit.timestamp < datetime.fromtimestamp(oldest)
).fetch(keys_only=True)
nkeys = len(keys)
if nkeys:
logging.info('Deleting %d entities: %s' % (
nkeys, ', '.join(str(k.id()) for k in keys)))
ndb.delete_multi(keys)
else:
logging.info('No entities older than: %s' % time.ctime(oldest))
return '' # need to return SOME string w/200
4. Cập nhật mẫu trang web
Cập nhật mẫu web templates/index.html bằng điều kiện Jinja2 này để hiển thị dấu thời gian cũ nhất nếu biến đó tồn tại:
{% if oldest is defined %}
<b>Deleting visits older than:</b> {{ oldest }}</p>
{% endif %}
Thêm đoạn mã này sau danh sách lượt truy cập đã hiển thị nhưng trước khi đóng nội dung để mẫu của bạn có dạng như sau:
<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>
<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>
{% if oldest is defined %}
<b>Deleting visits older than:</b> {{ oldest }}</p>
{% endif %}
</body>
</html>
6. Tóm tắt/Dọn dẹp
Phần này kết thúc lớp học lập trình bằng cách triển khai ứng dụng, xác minh rằng ứng dụng hoạt động như dự kiến và trong mọi đầu ra được phản ánh. Sau khi xác thực ứng dụng, hãy dọn dẹp mọi thứ và cân nhắc các bước tiếp theo.
Triển khai và xác minh ứng dụng
Triển khai ứng dụng bằng gcloud app deploy. Kết quả đầu ra sẽ giống hệt với ứng dụng Mô-đun 1, ngoại trừ một dòng mới ở dưới cùng cho biết những lượt truy cập sẽ bị xoá:

Chúc mừng bạn đã hoàn thành lớp học lập trình này. Mã của bạn hiện phải khớp với mã trong thư mục kho lưu trữ Mô-đun 7. Giờ đây, bạn đã sẵn sàng di chuyển sang Cloud Tasks trong Mô-đun 8.
Dọn dẹp
Giải pháp chung
Nếu đã hoàn tất, bạn nên tắt ứng dụng App Engine để tránh bị tính phí. Tuy nhiên, nếu muốn kiểm thử hoặc thử nghiệm thêm, nền tảng App Engine có một hạn mức miễn phí. Vì vậy, miễn là không vượt quá cấp sử dụng đó, bạn sẽ không bị tính phí. Đó là mức phí cho hoạt động tính toán, nhưng cũng có thể có các khoản phí cho các dịch vụ App Engine có liên quan. Vì vậy, hãy xem trang định giá của dịch vụ này để biết thêm thông tin. Nếu quá trình di chuyển này liên quan đến các dịch vụ đám mây khác, thì các dịch vụ đó sẽ được tính phí riêng. Trong cả hai trường hợp, nếu có, hãy xem phần "Cụ thể cho lớp học lập trình này" bên dưới.
Để công bố đầy đủ, việc triển khai trên một nền tảng điện toán không máy chủ của Google Cloud như App Engine sẽ phát sinh một khoản chi phí nhỏ cho việc tạo và lưu trữ. Cloud Build có hạn mức miễn phí riêng, tương tự như Cloud Storage. Việc lưu trữ hình ảnh đó sẽ chiếm một phần hạn mức. Tuy nhiên, có thể bạn sinh sống ở một khu vực không có gói miễn phí như vậy, vì vậy, hãy lưu ý đến mức sử dụng bộ nhớ để giảm thiểu chi phí phát sinh. Bạn nên xem xét các "thư mục" cụ thể trên Cloud Storage, bao gồm:
console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/imagesconsole.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com- Các đường liên kết đến bộ nhớ ở trên phụ thuộc vào
PROJECT_IDvà *LOC*của bạn, ví dụ: "us" nếu ứng dụng của bạn được lưu trữ ở Hoa Kỳ.
Mặt khác, nếu bạn không tiếp tục với ứng dụng này hoặc các lớp học lập trình di chuyển có liên quan khác và muốn xoá hoàn toàn mọi thứ, hãy tắt dự án của bạn.
Cụ thể đối với lớp học lập trình này
Các dịch vụ trong danh sách dưới đây là riêng biệt đối với lớp học lập trình này. Hãy tham khảo tài liệu của từng sản phẩm để biết thêm thông tin:
- Dịch vụ Hàng đợi tác vụ của App Engine không phát sinh thêm bất kỳ khoản phí nào theo trang định giá cho các dịch vụ đi kèm cũ như Hàng đợi tác vụ.
- Dịch vụ App Engine Datastore do Cloud Datastore (Cloud Firestore ở chế độ Datastore) cung cấp, dịch vụ này cũng có một cấp miễn phí; hãy xem trang định giá của dịch vụ này để biết thêm thông tin.
Các bước tiếp theo
Trong quá trình "di chuyển" này, bạn đã thêm việc sử dụng hàng đợi đẩy của Hàng đợi tác vụ vào ứng dụng mẫu của Mô-đun 1, thêm tính năng hỗ trợ theo dõi khách truy cập, dẫn đến ứng dụng mẫu của Mô-đun 7. Quá trình di chuyển tiếp theo sẽ hướng dẫn bạn cách nâng cấp từ các tác vụ đẩy của App Engine lên Cloud Tasks nếu bạn chọn làm như vậy. Kể từ mùa thu năm 2021, người dùng không còn phải di chuyển sang Cloud Tasks khi nâng cấp lên Python 3. Đọc thêm về vấn đề này trong phần tiếp theo.
Nếu bạn muốn chuyển sang Cloud Tasks, thì lớp học lập trình Mô-đun 8 sẽ là bước tiếp theo. Ngoài ra, bạn cần cân nhắc các hoạt động di chuyển khác, chẳng hạn như Cloud Datastore, Cloud Memorystore, Cloud Storage hoặc Cloud Pub/Sub (hàng đợi kéo). Ngoài ra, còn có các hoạt động di chuyển trên nhiều sản phẩm sang Cloud Run và Cloud Functions. Bạn có thể truy cập vào tất cả nội dung của Serverless Migration Station (lớp học lập trình, video, mã nguồn [nếu có]) tại kho lưu trữ nguồn mở của nội dung đó.
7. Di chuyển sang Python 3
Vào mùa thu năm 2021, nhóm App Engine đã mở rộng phạm vi hỗ trợ của nhiều dịch vụ đi kèm sang thời gian chạy thế hệ thứ 2 (ban đầu chỉ có trong thời gian chạy thế hệ thứ nhất). Điều này có nghĩa là bạn không còn phải di chuyển từ các dịch vụ đi kèm như Hàng đợi tác vụ App Engine sang các dịch vụ Cloud độc lập hoặc các dịch vụ tương đương của bên thứ ba như Cloud Tasks khi chuyển ứng dụng sang Python 3. Nói cách khác, bạn có thể tiếp tục sử dụng Hàng đợi tác vụ trong các ứng dụng Python 3 App Engine miễn là bạn điều chỉnh mã để truy cập các dịch vụ đi kèm từ thời gian chạy thế hệ tiếp theo.
Bạn có thể tìm hiểu thêm về cách di chuyển việc sử dụng các dịch vụ đi kèm sang Python 3 trong lớp học lập trình mô-đun 17 và video tương ứng. Mặc dù chủ đề đó nằm ngoài phạm vi của Mô-đun 7, nhưng dưới đây là các phiên bản Python 3 của cả ứng dụng Mô-đun 1 và 7 được chuyển sang Python 3 và vẫn sử dụng NDB App Engine cũng như Hàng đợi tác vụ.
8. Tài nguyên khác
Dưới đây là các tài nguyên bổ sung dành cho những nhà phát triển muốn tìm hiểu thêm về Mô-đun di chuyển này hoặc các mô-đun di chuyển có liên quan, cũng như các sản phẩm có liên quan. Trong đó có những nơi để bạn gửi ý kiến phản hồi về nội dung này, đường liên kết đến mã và nhiều phần tài liệu mà bạn có thể thấy hữu ích.
Vấn đề/ý kiến phản hồi về lớp học lập trình
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 kiếm vấn đề của bạn trước khi báo cáo. Đường liên kết để tìm kiếm và tạo vấn đề mới:
Tài nguyên di chuyển
Bạn có thể tìm thấy đường liên kết đến các thư mục kho lưu trữ cho Mô-đun 2 (BẮT ĐẦU) và Mô-đun 7 (KẾT THÚC) trong bảng bên dưới.
Lớp học lập trình | Python 2 | Python 3 |
mã (không có trong hướng dẫn này) | ||
Học phần 7 (lớp học lập trình này) | mã (không có trong hướng dẫn này) |
Tài nguyên trực tuyến
Dưới đây là các tài nguyên trực tuyến có thể liên quan đến hướng dẫn này:
Hàng đợi tác vụ App Engine
- Tổng quan về Hàng đợi tác vụ của App Engine
- Tổng quan về hàng đợi đẩy của Hàng đợi tác vụ App Engine
- Tạo hàng đợi đẩy Task Queue
queue.yamltài liệu tham khảoqueue.yamlso với Cloud Tasks- Hướng dẫn di chuyển hàng đợi đẩy sang Cloud Tasks
- Mẫu tài liệu về hàng đợi đẩy của Hàng đợi công việc App Engine sang Cloud Tasks
Nền tảng App Engine
- Tài liệu về App Engine
- Thời gian chạy Python 2 App Engine (môi trường tiêu chuẩn)
- Sử dụng các thư viện tích hợp sẵn của App Engine trên App Engine Python 2
- Thời gian chạy Python 3 App Engine (môi trường tiêu chuẩn)
- Sự khác biệt giữa thời gian chạy Python 2 và 3 App Engine (môi trường tiêu chuẩn)
- Hướng dẫn di chuyển ứng dụng từ Python 2 sang Python 3 trên App Engine (môi trường tiêu chuẩn)
- Thông tin về giá và hạn mức của App Engine
- Ra mắt nền tảng App Engine thế hệ thứ hai (2018)
- So sánh nền tảng thế hệ thứ nhất và thứ hai
- Hỗ trợ dài hạn cho các thời gian chạy cũ
- Các mẫu di chuyển tài liệu
- Các mẫu di chuyển do cộng đồng đóng góp
Thông tin khác về Cloud
- Python trên Google Cloud Platform
- Thư viện ứng dụng Google Cloud Python
- Cấp "Luôn miễn phí" của Google Cloud
- SDK Google Cloud (công cụ dòng lệnh
gcloud) - Tất cả tài liệu của Google Cloud
Video
- Serverless Migration Station
- Expeditions không cần máy chủ
- Đăng ký theo dõi Google Cloud Tech
- Đăng ký theo dõi Google Developers
Giấy phép
Tác phẩm này được cấp phép theo giấy phép Ghi công theo Creative Commons 2.0 Chung.