Mô-đun 11: Di chuyển từ Google App Engine sang Cloud Functions

1. Tổng quan

Loạt lớp học lập trình về Trạm di chuyển không máy chủ (hướng dẫn thực hành theo tiến độ riêng) và video có liên quan nhằm giúp các nhà phát triển Google Cloud không máy chủ không 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 quá trình di chuyển, chủ yếu là ngừng sử dụng các dịch vụ cũ. Việc này giúp ứng dụng của bạn dễ di chuyển hơn, đồng thời mang đến cho bạn nhiều lựa chọn và độ 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 của Cloud hơn, đồng thời dễ dàng nâng cấp lên 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 FunctionsCloud Run hoặc ở những nơi khác nếu có.

Có những trường hợp bạn không có "toàn bộ ứng dụng" cần tài nguyên của App Engine hoặc Cloud Run. Nếu mã của bạn chỉ bao gồm một dịch vụ vi mô hoặc hàm đơn giản, thì Chức năng đám mây có thể sẽ phù hợp hơn. Lớp học lập trình này hướng dẫn bạn cách di chuyển các ứng dụng App Engine đơn giản (hoặc chia nhỏ các ứng dụng lớn thành nhiều dịch vụ vi mô) rồi triển khai chúng lên Cloud Functions, một nền tảng không máy chủ khác được tạo riêng cho các trường hợp sử dụng như thế này.

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

  • Sử dụng Cloud Shell
  • Bật Google Cloud Translation API
  • Xác thực các yêu cầu API
  • Chuyển đổi một ứng dụng App Engine nhỏ để chạy trên Cloud Functions
  • Triển khai mã của bạn vào Cloud Functions

Bạn cần có

Khảo sát

Bạn sẽ sử dụng hướng dẫn này như thế nào?

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

Bạn đánh giá thế nào về trải nghiệm sử dụng Python?

Người mới tập Trung cấp Thành thạo

Bạn đánh giá thế nào về trải nghiệm sử dụng các dịch vụ của Google Cloud?

Người mới tập Trung cấp Thành thạo

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

Các hệ thống PaaS như Google App Engine và Cloud Functions mang lại nhiều tiện ích cho người dùng. Các nền tảng không máy chủ này giúp nhóm kỹ thuật của bạn tập trung vào việc tạo ra các giải pháp kinh doanh thay vì dành thời gian điều tra các nền tảng để sử dụng và xác định lượng phần cứng cần thiết. Các ứng dụng có thể tự động mở rộng quy mô khi cần, giảm quy mô xuống bằng 0 bằng tính năng thanh toán trả tiền cho mỗi lần sử dụng để kiểm soát chi phí. Ứng dụng cũng hỗ trợ nhiều ngôn ngữ phát triển phổ biến hiện nay.

Tuy nhiên, mặc dù việc phát triển ứng dụng web toàn bộ ngăn xếp hoặc hệ thống phụ trợ phức tạp cho ứng dụng di động rất phù hợp với App Engine, nhưng thường thì các nhà phát triển chủ yếu đang cố gắng đưa một số chức năng lên mạng, chẳng hạn như cập nhật nguồn cấp tin tức hoặc lấy điểm số mới nhất của trận đấu loại trực tiếp của đội chủ nhà. Mặc dù logic lập trình tồn tại cho cả hai trường hợp, nhưng dường như không phải là "ứng dụng" toàn diện đòi hỏi sức mạnh của App Engine. Đây là lý do Cloud Functions.

Cloud Functions dùng để triển khai một đoạn mã nhỏ mà:

  • Không phải là một phần của toàn bộ ứng dụng
  • Không cần thiết trong toàn bộ ngăn xếp phát triển
  • Nằm trong một ứng dụng hoặc phần phụ trợ của một ứng dụng di động tập trung vào một thứ

Bạn cũng có thể sử dụng Cloud Functions để chia một ứng dụng lớn, nguyên khối thành nhiều dịch vụ vi mô, mỗi dịch vụ sử dụng một cơ sở dữ liệu chung dùng chung như Cloud Firestore hoặc Cloud SQL. Ngoài ra, nếu muốn chức năng hoặc dịch vụ vi mô của mình được chứa và thực thi không máy chủ trên Cloud Run, thì bạn cũng có thể làm việc đó.

Ứng dụng App Engine mẫu của chúng tôi xuất hiện trong hầu hết các hướng dẫn di chuyển là một ứng dụng ngắn có chức năng cơ bản hoạt động tốt trong Cloud Functions. Trong hướng dẫn này, bạn sẽ tìm hiểu cách sửa đổi ứng dụng đó để chạy trên Cloud Functions. Từ góc độ App Engine, vì các chức năng đơn giản hơn toàn bộ ứng dụng nên trải nghiệm bắt đầu của bạn sẽ dễ dàng hơn (và nhanh hơn) và ít "chi phí" hơn nói chung. Quá trình di chuyển này bao gồm các bước sau:

  • Thiết lập/Chuẩn bị
  • Xoá tệp cấu hình
  • Sửa đổi tệp ứng dụng

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

Lớp học lập trình này bắt đầu bằng phiên bản Python 3 của ứng dụng mẫu Mô-đun 2 Cloud NDB App Engine vì Cloud Functions không hỗ trợ Python 2. Trước tiên, hãy thiết lập dự án, lấy mã, sau đó triển khai ứng dụng cơ sở để xác nhận rằng chúng ta đang bắt đầu với mã nguồn làm việc.

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

Nếu đã hoàn thành lớp học lập trình Mô-đun 2 (và chuyển sang Python 3), 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à đã bật dịch vụ App Engine.

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ạt động được. Nếu bạn chưa có tài khoản, hãy hoàn tất một trong hai hướng dẫn được liên kết bên trên trước khi tiếp tục thực hiện tại đâ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 bên dưới.

Cho dù bạn sử dụng mã của chúng tôi hay của bạn, mã Mô-đun 2 Python 3 là nơi chúng tôi sẽ BẮT ĐẦU. Lớp học lập trình Mô-đun 11 này sẽ hướng dẫn bạn qua từng bước, kết thúc bằng mã tương tự như những gì trong thư mục kho lưu trữ Mô-đun 11 (Finish).

Thư mục của các tệp KHỞI ĐỘNG Mô-đun 2 Python 3 (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 chuyển đổi hàm đó thành Hàm đám mây.

4. Xoá tệp cấu hình

Tệp app.yaml là cấu phần phần mềm App Engine không được sử dụng với Cloud Functions, vì vậy, hãy xoá tệp này ngay. Nếu bạn không hoặc quên thực hiện việc này thì sẽ không có mối nguy hại nào vì Cloud Functions không sử dụng. Đó là thay đổi duy nhất về cấu hình vì requirements.txt không thay đổi so với thay đổi trong Mô-đun 2.

Nếu bạn cũng đang chuyển một ứng dụng Python 2 App Engine sang Python 3, hãy xoá appengine_config.py và thư mục lib nếu có. Đây là các cấu phần phần mềm App Engine không được sử dụng trong thời gian chạy Python 3.

5. Sửa đổi tệp ứng dụng

Chỉ có một tệp ứng dụng, main.py, do đó, tất cả những thay đổi cần thiết để di chuyển sang Cloud Functions đều diễn ra trong tệp này.

Nhập

Do chúng ta chỉ làm việc với các hàm nên không cần khung ứng dụng web. Tuy nhiên, để thuận tiện, khi gọi Cloud Functions dựa trên Python, các Hàm này sẽ tự động được chuyển một đối tượng yêu cầu để mã của bạn dùng khi cần. (Nhóm Cloud Functions đã chọn đối tượng này là một đối tượng Yêu cầu Flask được truyền đến hàm của bạn.)

Vì khung web không thuộc bối cảnh Cloud Functions nên sẽ không có lệnh nhập nào từ Flask trừ phi ứng dụng của bạn sử dụng các tính năng khác của Flask. Đây thực sự là trường hợp của chúng ta vì quá trình kết xuất mẫu vẫn diễn ra sau khi chuyển đổi thành một hàm, có nghĩa là bạn vẫn phải gọi flask.render_template(), do đó phải nhập lệnh gọi từ Flask. Không có khung web nghĩa là không cần tạo thực thể cho ứng dụng Flask, do đó hãy xoá app = Flask(__name__). Mã của bạn sẽ có dạng như sau, trước và sau khi áp dụng các thay đổi:

TRƯỚC KHI:

from flask import Flask, render_template, request
from google.cloud import ndb

app = Flask(__name__)
ds_client = ndb.Client()

SAU KHI:

from flask import render_template
from google.cloud import ndb

ds_client = ndb.Client()

Nếu phụ thuộc vào đối tượng ứng dụng (app) hay bất kỳ cơ sở hạ tầng khung web nào khác, bạn cần giải quyết tất cả các phần phụ thuộc đó, tìm giải pháp phù hợp hoặc xoá hoàn toàn việc sử dụng chúng hoặc tìm proxy. Chỉ khi đó, bạn mới có thể chuyển đổi mã của mình thành Hàm đám mây. Nếu không, tốt hơn là bạn nên tiếp tục sử dụng App Engine hoặc vùng chứa ứng dụng của mình cho Cloud Run

Cập nhật chữ ký của hàm trình xử lý chính

Những thay đổi bắt buộc trong chữ ký hàm như sau:

  1. Bình không còn được dùng sau khi chuyển đổi ứng dụng sang một Hàm đám mây, vì vậy hãy xoá bộ trang trí tuyến đường.
  2. Cloud Functions tự động truyền vào đối tượng Request của Flask dưới dạng tham số, vì vậy, hãy tạo một biến cho đối tượng đó. Trong ứng dụng mẫu, chúng ta sẽ đặt tên cho nó là request.
  3. Bạn phải đặt tên cho các Chức năng đám mây đã triển khai. Trình xử lý chính của chúng ta được đặt tên phù hợp là root() trong App Engine để mô tả đó là trình xử lý gốc của ứng dụng. Vì là một Hàm đám mây, nên dùng tên đó sẽ không hợp lý. Thay vào đó, chúng ta sẽ triển khai Hàm đám mây bằng tên visitme. Vì vậy, hãy sử dụng tên đó làm tên của hàm Python. Tương tự, trong Mô-đun 4 và 5, chúng tôi cũng đặt tên cho dịch vụ Cloud Run là visitme.

Dưới đây là hình ảnh trước và sau của những thay đổi này:

TRƯỚC KHI:

@app.route('/')
def root():
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    visits = fetch_visits(10)
    return render_template('index.html', visits=visits)

SAU KHI:

def visitme(request):
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    visits = fetch_visits(10)
    return render_template('index.html', visits=visits)

Đó là toàn bộ nội dung cập nhật cần thiết. Lưu ý rằng các thay đổi được thực hiện chỉ ảnh hưởng đến "cơ sở hạ tầng" của ứng dụng . Không cần thay đổi mã xử lý ứng dụng cốt lõi nào và chức năng nào của ứng dụng cũng không bị thay đổi. Dưới đây là hình ảnh minh hoạ những thay đổi đã được thực hiện để minh hoạ điểm này:

668f30e3865b27a9.pngS

Phát triển và kiểm thử cục bộ

Trong khi App Engine có máy chủ phát triển cục bộ dev_appserver.py, Cloud Functions có Khung hàm. Với khung này, bạn có thể phát triển và thử nghiệm cục bộ. Bạn có thể triển khai mã cho Cloud Functions, nhưng cũng có thể triển khai mã cho các nền tảng điện toán khác như Compute Engine, Cloud Run hay thậm chí là các hệ thống đám mây tại chỗ hoặc kết hợp hỗ trợ Knative. Hãy xem bên dưới để biết thêm các đường liên kết đến Khung hàm.

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

Việc triển khai lên Cloud Functions có một chút khác biệt so với App Engine. Vì không có tệp cấu hình nào được dùng bên ngoài requirements.txt nên bạn phải chỉ định thêm thông tin về mã này trong dòng lệnh. Triển khai Hàm đám mây mới được kích hoạt HTTP chạy trong Python 3.10 bằng lệnh sau:

$ gcloud functions deploy visitme --runtime python310 --trigger-http --allow-unauthenticated

Bạn sẽ nhận được kết quả tương tự như sau:

Deploying function (may take a while - up to 2 minutes)...⠛
For Cloud Build Logs, visit: https://console.cloud.google.com/cloud-build/builds;region=REGION/f5f6fc81-1bb3-4cdb-8bfe?project=PROJECT_ID
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 256
buildId: f5f6fc81-1bb3-4cdb-8bfe
buildName: projects/PROJECT_ID/locations/REGION/builds/f5f6fc81-1bb3-4cdb-8bfe
dockerRegistry: CONTAINER_REGISTRY
entryPoint: visitme
httpsTrigger:
  securityLevel: SECURE_OPTIONAL
  url: https://REGION-PROJECT_ID.cloudfunctions.net/visitme
ingressSettings: ALLOW_ALL
labels:
  deployment-tool: cli-gcloud
name: projects/PROJECT_ID/locations/REGION/functions/visitme
runtime: python310
serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/uploads-853031211983.REGION.cloudfunctions.appspot.com/8c923758-cee8-47ce-8e97-5720a5301c34.zip
status: ACTIVE
timeout: 60s
updateTime: '2022-05-16T18:28:06.153Z'
versionId: '8'

Sau khi chức năng được triển khai, hãy sử dụng URL từ dữ liệu đầu ra của quá trình triển khai rồi truy cập vào ứng dụng của bạn. URL có dạng: REGION-PROJECT_ID.cloudfunctions.net/visitme. Kết quả phải giống với khi bạn triển khai trước đó cho App Engine:

2732ae9218f011a2.pngS

Giống như hầu hết các lớp học lập trình và video khác trong loạt video này, chức năng cơ sở của ứng dụng không thay đổi. Mục đích là để áp dụng một kỹ thuật hiện đại hoá và giúp ứng dụng hoạt động chính xác như trước đây nhưng sử dụng cơ sở hạ tầng mới hơn, ví dụ: di chuyển từ một dịch vụ cũ của App Engine sang sản phẩm Cloud độc lập thay thế hoặc di chuyển một ứng dụng sang một nền tảng không máy chủ khác của Google Cloud.

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

Chúc mừng bạn đã chuyển đổi ứng dụng App Engine nhỏ này thành Hàm đám mây! Một trường hợp sử dụng thích hợp khác: chia nhỏ một ứng dụng App Engine lớn nguyên khối thành một loạt các dịch vụ vi mô, mỗi dịch vụ là một Chức năng đám mây. Đây là kỹ thuật phát triển hiện đại hơn, mang lại trải nghiệm "cắm là chạy" nhiều hơn thành phần ("ngăn xếp Jam"). Giải pháp này cho phép kết hợp và so khớp cũng như sử dụng lại mã, đó là hai mục tiêu. Tuy nhiên, một lợi ích khác là các dịch vụ vi mô này sẽ tiếp tục được gỡ lỗi theo thời gian, tức là mã ổn định và chi phí bảo trì tổng thể thấp hơn.

Dọn dẹp

Sau khi hoàn thành lớp học lập trình này, bạn có thể tắt ứng dụng App Engine Mô-đun 2 (tạm thời hoặc vĩnh viễn) để tránh phát sinh thanh toán. Nền tảng App Engine có hạn mức miễn phí, vì vậy bạn sẽ không bị tính phí miễn là bạn duy trì được cấp sử dụng của nền tảng đó. Điều này cũng áp dụng cho Datastore; hãy xem trang giá của Cloud Datastore để biết thêm chi tiết.

Việc triển khai cho các nền tảng như App Engine và Cloud Functions sẽ làm phát sinh chi phí bản dựng và bộ nhớ thấp. Ở một số khu vực, Cloud Build có hạn mức miễn phí riêng cũng như Cloud Storage. Các bản dựng sẽ sử dụng một phần hạn mức đó. Hãy lưu ý đến mức sử dụng bộ nhớ của bạn để giảm thiểu chi phí tiềm ẩn, đặc biệt nếu khu vực của bạn không có bậc miễn phí như vậy.

Rất tiếc, Cloud Functions không có tính năng "disable" của chúng tôi. Sao lưu mã của bạn và chỉ cần xoá hàm này. Bạn luôn có thể triển khai lại bằng cùng một tên vào lúc khác. Tuy nhiên, nếu bạn không định tiếp tục các lớp học lập trình di chuyển khác và muốn xoá hoàn toàn toàn bộ nội dung, hãy ngừng cung cấp các dự án trên Cloud.

Các bước tiếp theo

Ngoài hướng dẫn này, bạn cũng nên xem xét các mô-đun di chuyển khác bao gồm việc sử dụng vùng chứa ứng dụng App Engine cho Cloud Run. Xem các đường liên kết đến các lớp học lập trình của Mô-đun 4 và Mô-đun 5:

  • 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
  • Quá trình di chuyển này cho phép bạn tiếp tục sử dụng Python 2.
  • Học phần 5: Di chuyển sang Cloud Run bằng Cloud Buildpacks (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 ứng dụng của bạn phải chuyển sang Python 3 (Gói bản dựng không hỗ trợ Python 2)

Nhiều mô-đun khác tập trung hướng dẫn nhà phát triển cách di chuyển từ các dịch vụ theo gói App Engine sang các dịch vụ thay thế độc lập trên Cloud:

  • Mô-đun 2: di chuyển từ App Engine ndb sang Cloud NDB
  • Mô-đun 7-9: di chuyển từ Hàng đợi tác vụ của App Engine để đẩy các tác vụ sang Cloud Tasks
  • Mô-đun 12-13: di chuyển từ App Engine Memcache sang Cloud Memorystore
  • Mô-đun 15-16: di chuyển từ App Engine Blobstore sang Cloud Storage
  • Mô-đun 18-19: di chuyển từ Hàng đợi tác vụ của App Engine (Tác vụ kéo) sang Cloud Pub/Sub

Nếu việc tích hợp vùng chứa đã trở thành một phần trong quy trình phát triển ứng dụng của bạn, đặc biệt nếu quy trình đó bao gồm một quy trình CI/CD (tích hợp liên tục/phân phối hoặc triển khai liên tục), hãy cân nhắc chuyển sang Cloud Run thay vì Cloud Functions. Xem Mô-đun 4 để chứa ứng dụng của bạn bằng Docker, hoặc Mô-đun 5 để thực hiện mà không cần vùng chứa, kiến thức về Docker hoặc Dockerfile. Bất kể đang cân nhắc đến Cloud Functions hay Cloud Run, bạn không bắt buộc phải chuyển sang một nền tảng không máy chủ khác. Đồng thời, bạn nên cân nhắc các lựa chọn phù hợp nhất cho ứng dụng và trường hợp sử dụng của mình trước khi điều chỉnh.

Bất kể bạn cân nhắc mô-đun di chuyển nào tiếp theo, bạn đều có thể truy cập vào tất cả nội dung của Trạm di chuyển không máy chủ (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 chúng. README của kho lưu trữ này cũng cung cấp hướng dẫn về những quá trình di chuyển cần xem xét và mọi "đơn đặt hàng" có liên quan Mô-đun di chuyển.

8. 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 8 (START) và Mô-đun 9 (Finish) 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 3

Học phần 2

Học phần 11

Tài nguyên trực tuyến

Dưới đây là các tài nguyên trực tuyến có thể phù hợp với hướng dẫn này:

App Engine

Cloud Functions

Thông tin khác về đám mây

Video

Giấy phép

Tác phẩm này được cấp phép theo Giấy phép chung Ghi nhận tác giả Creative Commons 2.0.