Di chuyển từ App Engine Memcache sang Cloud Memorystore (Mô-đun 13)

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 FunctionsCloud Run, hoặc ở những nơi khác nếu có thể.

Mục đích của lớp học lập trình này là hướng dẫn các nhà phát triển App Engine Python 2 cách di chuyển từ App Engine Memcache sang Cloud Memorystore (cho Redis). Ngoài ra, còn có một quy trình di chuyển ngầm từ App Engine ndb sang Cloud NDB, nhưng quy trình này chủ yếu được đề cập trong lớp học lập trình Mô-đun 2; hãy xem lớp học lập trình này để biết thêm thông tin từng bước.

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

  • Thiết lập một phiên bản Cloud Memorystore (từ Cloud Console hoặc công cụ gcloud)
  • Thiết lập một trình kết nối cho phép truy cập vào VPC không máy chủ trên đám mây (từ Cloud Console hoặc công cụ gcloud)
  • Di chuyển từ Memcache của App Engine sang Cloud Memorystore
  • Triển khai chức năng lưu vào bộ nhớ đệm bằng Cloud Memorystore trong một ứng dụng mẫu
  • Di chuyển từ App Engine ndb sang Cloud NDB

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 qua Đọc và hoàn thành các bài tập

Bạn đánh giá thế nào về trải nghiệm của mình với Python?

Người mới bắt đầu Trung cấp Thành thạo

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?

Người mới bắt đầu Trung cấp Thành thạo

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

Lớp học lập trình này minh hoạ cách di chuyển một ứng dụng mẫu từ App Engine Memcache (và NDB) sang Cloud Memorystore (và Cloud NDB). Quá trình này bao gồm việc thay thế các phần phụ thuộc trên các dịch vụ đi kèm của App Engine, giúp ứng dụng của bạn dễ dàng di chuyển hơn. Bạn có thể chọn tiếp tục sử dụng App Engine hoặc cân nhắc chuyển sang bất kỳ lựa chọn thay thế nào được mô tả trước đó.

Quá trình di chuyển này đòi hỏi nhiều công sức hơn so với các quá trình di chuyển khác trong loạt bài này. Giải pháp thay thế được đề xuất cho Memcache của App Engine là Cloud Memorystore, một dịch vụ lưu vào bộ nhớ đệm trên đám mây được quản lý toàn diện. Memorystore hỗ trợ một cặp công cụ lưu vào bộ nhớ đệm nguồn mở phổ biến là RedisMemcached. Mô-đun di chuyển này sử dụng Cloud Memorystore for Redis. Bạn có thể tìm hiểu thêm trong phần Tổng quan về Memorystore và Redis.

Vì Memorystore yêu cầu một máy chủ đang chạy, nên bạn cũng cần có Cloud VPC. Cụ thể, bạn phải tạo một trình kết nối cho phép truy cập VPC không máy chủ để ứng dụng App Engine có thể kết nối với phiên bản Memorystore thông qua địa chỉ IP riêng tư của phiên bản đó. Khi hoàn tất bài tập này, bạn sẽ cập nhật ứng dụng để ứng dụng hoạt động như trước đây, nhưng Cloud Memorystore sẽ là dịch vụ lưu vào bộ nhớ đệm, thay thế dịch vụ Memcache của App Engine.

Hướng dẫn này bắt đầu bằng ứng dụng mẫu Mô-đun 12 trong Python 2, sau đó là một bản nâng cấp nhỏ, không bắt buộc lên Python 3. Nếu đã quen với việc truy cập vào các dịch vụ đi kèm của App Engine từ Python 3 thông qua SDK App Engine Python 3, bạn có thể bắt đầu bằng phiên bản Python 3 của ứng dụng mẫu Mô-đun 12. Việc này sẽ kéo theo việc xoá việc sử dụng SDK vì Memorystore không phải là một dịch vụ đi kèm của App Engine. Hướng dẫn này không đề cập đến cách sử dụng SDK App Engine cho Python 3.

Hướng dẫn này có các bước chính sau:

  1. Thiết lập/công việc chuẩn bị
  2. Thiết lập dịch vụ lưu vào bộ nhớ đệm
  3. Cập nhật tệp cấu hình
  4. Cập nhật ứng dụng chính

3. Thiết lập/công việc chuẩn bị

Chuẩn bị dự án trên đám mây

Bạn nên sử dụng lại dự án mà bạn đã dùng để hoàn thành lớp học lập trình Mô-đun 12. 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ỗi lớp học lập trình trong loạt lớp học lập trình này đều có một "START" (mã cơ sở để bắt đầu) và một "FINISH" (ứng dụng đã di chuyển). Mã FINISH được cung cấp để bạn có thể so sánh giải pháp của mình với giải pháp của chúng tôi trong trường hợp bạn gặp vấn đề. Bạn luôn có thể khôi phục để BẮT ĐẦU lại nếu có sự cố. Những điểm kiểm tra này được thiết kế để đảm bảo bạn học được cách thực hiện quy trình di chuyển.

Dù bạn sử dụng dự án nào trên Cloud, hãy nhớ đảm bảo dự án đó có một tài khoản thanh toán đang hoạt động. Ngoài ra, hãy đảm bảo rằng bạn đã bật App Engine. Hãy xem xét và đảm bảo bạn hiểu rõ những tác động chung về chi phí khi thực hiện các hướng dẫn này. Tuy nhiên, không giống như những lớp học lập trình khác trong loạt lớp học này, lớp học lập trình này sử dụng các tài nguyên trên đám mây khônggói miễn phí, vì vậy, bạn sẽ phải trả một khoản phí để hoàn thành bài tập. Thông tin cụ thể hơn về chi phí sẽ được cung cấp cùng với các đề xuất về việc giảm mức sử dụng, bao gồm cả hướng dẫn ở cuối về cách giải phóng tài nguyên để giảm thiểu phí thanh toán.

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

Từ mã Mô-đun 12 cơ sở mà chúng ta sẽ BẮT ĐẦU, lớp học lập trình này sẽ hướng dẫn bạn từng bước trong quá trình di chuyển. Khi hoàn tất, bạn sẽ có một ứng dụng Module 13 hoạt động và có mã gần giống với mã trong một trong các thư mục FINISH. Sau đây là những tài nguyên đó:

Thư mục START phải chứa các tệp sau:

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

Nếu bạn bắt đầu từ phiên bản Python 2, thì cũng sẽ có một tệp appengine_config.py và có thể là một thư mục lib nếu bạn đã hoàn thành lớp học lập trình Mô-đun 12.

(Triển khai lại) Ứng dụng Mô-đun 12

Các bước chuẩn bị còn lại:

  1. Làm quen lại với công cụ dòng lệnh gcloud (nếu cần)
  2. (Triển khai lại) mã Mô-đun 12 vào App Engine (nếu cần)

Người dùng Python 2 nên xoá và cài đặt lại thư mục lib bằng các lệnh sau:

rm -rf ./lib; pip install -t lib -r requirements.txt                

Giờ đây, mọi người (người dùng Python 2 và 3) đều có thể tải mã lên App Engine bằng lệnh sau:

gcloud app deploy                

Sau khi triển khai thành công, hãy xác nhận rằng ứng dụng có giao diện và chức năng giống như ứng dụng trong Mô-đun 12, một ứng dụng web theo dõi lượt truy cập và lưu vào bộ nhớ đệm cho cùng một người dùng trong một giờ:

dfe56a02ae59ddd8.png

Vì các lượt truy cập gần đây nhất được lưu vào bộ nhớ đệm, nên các lượt làm mới trang sẽ tải khá nhanh.

4. Thiết lập dịch vụ lưu vào bộ nhớ đệm

Cloud Memorystore không phải là dịch vụ không máy chủ. Bạn phải có một phiên bản; trong trường hợp này là một phiên bản Redis đang chạy. Không giống như Memcache, Memorystore là một sản phẩm độc lập trên Cloud và khôngbậc miễn phí, vì vậy, hãy nhớ kiểm tra thông tin về giá của Memorystore cho Redis trước khi tiếp tục. Để giảm thiểu chi phí cho hoạt động này, bạn nên sử dụng ít tài nguyên nhất có thể: một cấp dịch vụ Cơ bản và dung lượng 1 GB.

Phiên bản Memorystore nằm trên một mạng khác với ứng dụng App Engine (các phiên bản) của bạn. Đó là lý do bạn phải tạo một trình kết nối Truy cập VPC không máy chủ để App Engine có thể truy cập vào các tài nguyên Memorystore của bạn. Để giảm thiểu chi phí VPC, hãy chọn loại phiên bản (f1-micro) và số lượng phiên bản yêu cầu ít nhất (chúng tôi đề xuất tối thiểu là 2, tối đa là 3). Bạn cũng có thể xem trang thông tin về giá của VPC.

Chúng tôi sẽ nhắc lại những đề xuất này để giảm chi phí khi hướng dẫn bạn tạo từng tài nguyên bắt buộc. Ngoài ra, khi tạo tài nguyên Memorystore và VPC trong Cloud Console, bạn sẽ thấy máy tính giá cho từng sản phẩm ở góc trên bên phải, giúp bạn ước tính chi phí hằng tháng (xem hình minh hoạ bên dưới). Những giá trị đó sẽ tự động điều chỉnh nếu bạn thay đổi các lựa chọn. Đây là nội dung bạn sẽ thấy:

7eb35ebf7248c010.png

Bạn phải tạo cả hai tài nguyên này và không quan trọng việc bạn tạo tài nguyên nào trước. Nếu bạn tạo phiên bản Memorystore trước, ứng dụng App Engine sẽ không thể truy cập vào phiên bản đó nếu không có trình kết nối VPC. Tương tự, nếu bạn tạo trình kết nối VPC trước, thì sẽ không có gì trên mạng VPC đó để ứng dụng App Engine của bạn giao tiếp. Trong hướng dẫn này, bạn sẽ tạo phiên bản Memorystore trước, sau đó là trình kết nối VPC.

Sau khi cả hai tài nguyên đều trực tuyến, bạn sẽ thêm thông tin liên quan vào app.yaml để ứng dụng có thể truy cập vào bộ nhớ đệm. Bạn cũng có thể tham khảo hướng dẫn về Python 2 hoặc Python 3 trong tài liệu chính thức. Bạn cũng nên tham khảo hướng dẫn lưu vào bộ nhớ đệm dữ liệu trên trang di chuyển Cloud NDB ( Python 2 hoặc Python 3).

Tạo một phiên bản Cloud Memorystore

Vì Cloud Memorystore không có bậc miễn phí, nên bạn nên phân bổ ít tài nguyên nhất để hoàn thành lớp học lập trình này. Bạn có thể giảm thiểu chi phí bằng cách sử dụng các chế độ cài đặt sau:

  • Chọn cấp dịch vụ thấp nhất: Cơ bản (mặc định trên bảng điều khiển: "Tiêu chuẩn", mặc định trên gcloud: "Cơ bản").
  • Chọn dung lượng lưu trữ ít nhất: 1 GB (mặc định trên bảng điều khiển: 16 GB, mặc định trên gcloud: 1 GB).
  • Thông thường, phiên bản mới nhất của bất kỳ phần mềm nào cũng đòi hỏi nhiều tài nguyên nhất, nhưng bạn cũng không nên chọn phiên bản cũ nhất. Phiên bản mới thứ hai hiện tại là Phiên bản Redis 5.0 (mặc định trên bảng điều khiển: 6.x)

Với những chế độ cài đặt đó, phần tiếp theo sẽ hướng dẫn bạn cách tạo phiên bản từ Cloud Console. Nếu bạn muốn thực hiện việc này từ dòng lệnh, hãy chuyển sang bước tiếp theo.

Trên Cloud Console

Chuyển đến trang Cloud Memorystore trong Cloud Console (bạn có thể được nhắc cung cấp thông tin thanh toán). Nếu chưa bật Memorystore, bạn sẽ được nhắc bật:

68318997e3105db6.png

Sau khi bật (và có thể cùng với tính năng thanh toán), bạn sẽ truy cập vào trang tổng quan Memorystore. Đây là nơi bạn có thể xem tất cả các phiên bản được tạo trong dự án của mình. Dự án bên dưới không có hàng nào, đó là lý do bạn thấy thông báo "Không có hàng nào để hiển thị". Để tạo một phiên bản Memorystore, hãy nhấp vào Tạo phiên bản ở trên cùng:

63547aa575838a36.png

Trang này có một biểu mẫu để bạn điền các chế độ cài đặt mong muốn nhằm tạo phiên bản Memorystore:

b77d927287fdf4c7.png

Để giảm chi phí cho hướng dẫn này và ứng dụng mẫu của hướng dẫn, hãy làm theo các đề xuất đã đề cập trước đó. Sau khi chọn xong, hãy nhấp vào Tạo. Quá trình tạo mất vài phút. Khi quá trình này hoàn tất, hãy sao chép địa chỉ IPsố cổng của phiên bản để thêm vào app.yaml.

Từ dòng lệnh

Mặc dù việc tạo các phiên bản Memorystore từ Cloud Console mang tính trực quan, nhưng một số người dùng lại thích dòng lệnh. Hãy nhớ gcloud cài đặtkhởi chạy trước khi tiếp tục.

Tương tự như Cloud Console, bạn phải bật Cloud Memorystore for Redis. Phát lệnh gcloud services enable redis.googleapis.com và đợi lệnh này hoàn tất, như ví dụ sau:

$ gcloud services enable redis.googleapis.com
Operation "operations/acat.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.

Nếu dịch vụ đã được bật, việc chạy lệnh (lại) sẽ không gây ra tác dụng phụ (tiêu cực). Sau khi bật dịch vụ này, hãy tạo một phiên bản Memorystore. Lệnh đó có dạng như sau:

gcloud redis instances create NAME --redis-version VERSION \
    --region REGION --project PROJECT_ID

Chọn tên cho phiên bản Memorystore của bạn; phòng thí nghiệm này sử dụng "demo-ms" làm tên cùng với mã dự án "my-project". Khu vực của ứng dụng mẫu này là us-central1 (giống như us-central), nhưng bạn có thể sử dụng một khu vực gần bạn hơn nếu lo ngại về độ trễ. Bạn phải chọn cùng khu vực với ứng dụng App Engine. Bạn có thể chọn bất kỳ phiên bản Redis nào mà bạn muốn, nhưng chúng ta sẽ sử dụng phiên bản 5 như đã đề xuất trước đó. Với những chế độ cài đặt đó, đây là lệnh bạn sẽ đưa ra (cùng với đầu ra liên quan):

$ gcloud redis instances create demo-ms --region us-central1 \
    --redis-version redis_5_0 --project my-project

Create request issued for: [demo-ms]
Waiting for operation [projects/my-project/locations/us-central1/operations/operation-xxxx] to complete...done.
Created instance [demo-ms].

Không giống như các giá trị mặc định của Cloud Console, gcloud mặc định là tài nguyên tối thiểu. Kết quả là cả cấp dịch vụ lẫn dung lượng lưu trữ đều không bắt buộc trong lệnh đó. Quá trình tạo một phiên bản Memorystore mất vài phút. Khi hoàn tất, hãy ghi lại địa chỉ IP và số cổng của phiên bản vì chúng sẽ sớm được thêm vào app.yaml.

Xác nhận đã tạo phiên bản

Trên Cloud Console hoặc dòng lệnh

Cho dù tạo phiên bản từ Cloud Console hay dòng lệnh, bạn đều có thể xác nhận rằng phiên bản đó có sẵn và sẵn sàng sử dụng bằng lệnh sau: gcloud redis instances list --region REGION

Sau đây là lệnh kiểm tra các phiên bản trong khu vực us-central1 cùng với kết quả dự kiến cho thấy phiên bản mà chúng ta vừa tạo:

$ gcloud redis instances list --region us-central1
INSTANCE_NAME  VERSION    REGION       TIER   SIZE_GB  HOST         PORT  NETWORK  RESERVED_IP     STATUS  CREATE_TIME
demo-ms        REDIS_5_0  us-central1  BASIC  1        10.aa.bb.cc  6379  default  10.aa.bb.dd/29  READY   2022-01-28T09:24:45

Khi được yêu cầu cung cấp thông tin về phiên bản hoặc định cấu hình ứng dụng, hãy nhớ sử dụng HOSTPORT (không phải RESERVED_IP). Giờ đây, trang tổng quan Cloud Memorystore trong Cloud Console sẽ hiển thị phiên bản đó:

c5a6948ec1c056ed.png

Từ máy ảo Compute Engine

Nếu có một máy ảo (VM) Compute Engine, bạn cũng có thể gửi các lệnh trực tiếp của phiên bản Memorystore từ một VM để xác nhận rằng phiên bản đó đang hoạt động. Xin lưu ý rằng việc sử dụng một máy ảo có thể phát sinh chi phí độc lập với các tài nguyên mà bạn đang sử dụng.

Tạo trình kết nối cho phép truy cập vào VPC không máy chủ

Tương tự như Cloud Memorystore, bạn có thể tạo trình kết nối Cloud VPC không máy chủ trong bảng điều khiển Cloud hoặc trên dòng lệnh. Tương tự, Cloud VPC không có bậc miễn phí, vì vậy, bạn nên phân bổ ít tài nguyên nhất có thể để hoàn thành lớp học lập trình nhằm giảm thiểu chi phí. Bạn có thể đạt được điều này bằng các chế độ cài đặt sau:

  • Chọn số lượng phiên bản tối đa thấp nhất: 3 (bảng điều khiển và gcloud mặc định: 10)
  • Chọn loại máy có chi phí thấp nhất: f1-micro (mặc định của bảng điều khiển: e2-micro, không có gcloud mặc định)

Phần tiếp theo sẽ hướng dẫn bạn cách tạo trình kết nối từ Cloud Console bằng các chế độ cài đặt VPC trên đám mây ở trên. Nếu bạn muốn thực hiện việc này qua dòng lệnh, hãy chuyển sang phần tiếp theo.

Trên Cloud Console

Chuyển đến trang "Quyền truy cập VPC không máy chủ" của Cloud Networking trong bảng điều khiển Cloud (bạn có thể được nhắc cung cấp thông tin thanh toán). Nếu chưa bật API, bạn sẽ thấy lời nhắc bật API:

e3b9c0651de25e97.png

Sau khi bật API (và có thể cùng với thông tin thanh toán), bạn sẽ thấy trang tổng quan hiển thị tất cả trình kết nối VPC đã tạo. Dự án được dùng trong ảnh chụp màn hình bên dưới không có hàng nào, đó là lý do tại sao dự án này có thông báo "Không có hàng nào để hiển thị". Trong bảng điều khiển, hãy nhấp vào Create Connector (Tạo trình kết nối) ở trên cùng:

b74b49b9d73b7dcf.png

Điền chế độ cài đặt mong muốn vào biểu mẫu:

6b26b2aafa719f73.png

Chọn chế độ cài đặt phù hợp cho các ứng dụng của riêng bạn. Đối với hướng dẫn này và ứng dụng mẫu có nhu cầu tối thiểu, bạn nên giảm thiểu chi phí. Vì vậy, hãy làm theo các đề xuất đã đề cập trước đó. Sau khi chọn xong, hãy nhấp vào Tạo. Quá trình yêu cầu một trình kết nối VPC sẽ mất vài phút để hoàn tất.

Từ dòng lệnh

Trước khi tạo trình kết nối VPC, trước tiên, hãy bật Serverless VPC Access API. Bạn sẽ thấy kết quả tương tự sau khi phát hành lệnh sau:

$ gcloud services enable vpcaccess.googleapis.com
Operation "operations/acf.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.

Khi API được bật, một trình kết nối VPC sẽ được tạo bằng một lệnh có dạng như sau:

gcloud compute networks vpc-access connectors create CONNECTOR_NAME \
    --range 10.8.0.0/28 --region REGION --project PROJECT_ID

Chọn tên cho trình kết nối cũng như địa chỉ IP bắt đầu của khối CIDR /28 chưa sử dụng. Hướng dẫn này đưa ra các giả định sau:

  • Mã dự án: my-project
  • Tên trình kết nối VPC: demo-vpc
  • Số phiên bản tối thiểu: 2 (mặc định) và số phiên bản tối đa: 3
  • Loại phiên bản: f1-micro
  • Khu vực: us-central1
  • Khối CIDR IPv4: 10.8.0.0/28 (theo đề xuất trong bảng điều khiển đám mây)

Nếu bạn thực thi lệnh sau đây với những giả định trên, thì bạn sẽ thấy kết quả tương tự như kết quả dưới đây:

$ gcloud compute networks vpc-access connectors create demo-vpc \
    --max-instances 3 --range 10.8.0.0/28 --machine-type f1-micro \
    --region us-central1  --project my-project

Create request issued for: [demo-vpc]
Waiting for operation [projects/my-project/locations/us-central1/operations/xxx] to complete...done.
Created connector [demo-vpc].

Lệnh trên bỏ qua việc chỉ định các giá trị mặc định, chẳng hạn như số lượng phiên bản tối thiểu là 2 và một mạng có tên là default. Quá trình tạo một trình kết nối VPC mất vài phút để hoàn tất.

Xác nhận đã tạo trình kết nối

Sau khi quá trình này hoàn tất, hãy thực hiện lệnh gcloud sau (giả sử đó là khu vực us-central1) để xác nhận rằng bạn đã tạo và sẵn sàng sử dụng:

$ gcloud compute networks vpc-access connectors list --region us-central1
CONNECTOR_ID  REGION       NETWORK  IP_CIDR_RANGE  SUBNET  SUBNET_PROJECT  MIN_THROUGHPUT  MAX_THROUGHPUT  STATE
demo-vpc      us-central1  default  10.8.0.0/28                            200             300             READY

Tương tự, trang tổng quan hiện sẽ hiển thị trình kết nối bạn vừa tạo:

e03db2c8140ed014.png

Ghi lại mã dự án trên đám mây, tên trình kết nối VPC và khu vực.

Giờ đây, khi bạn đã tạo các tài nguyên Cloud cần thiết khác (bằng dòng lệnh hoặc trong bảng điều khiển), bạn cần cập nhật cấu hình ứng dụng để hỗ trợ việc sử dụng các tài nguyên đó.

5. Cập nhật tệp cấu hình

Bước đầu tiên là cập nhật mọi nội dung cần thiết cho các tệp cấu hình. Mục tiêu chính của lớp học lập trình này là giúp người dùng Python 2 di chuyển. Tuy nhiên, nội dung đó thường đi kèm với thông tin về quy trình chuyển đổi thêm sang Python 3 trong từng phần bên dưới.

requirements.txt

Trong phần này, chúng ta sẽ thêm các gói để hỗ trợ Cloud Memorystore cũng như Cloud NDB. Đối với Cloud Memorystore cho Redis, bạn chỉ cần sử dụng ứng dụng Redis tiêu chuẩn cho Python (redis) vì không có thư viện ứng dụng Cloud Memorystore. Thêm cả redisgoogle-cloud-ndb vào requirements.txt, kết hợp flask từ Phụ lục 12:

flask
redis
google-cloud-ndb

Tệp requirements.txt này không có số phiên bản, tức là các phiên bản mới nhất sẽ được chọn. Nếu có bất kỳ điểm không tương thích nào, hãy chỉ định số phiên bản để khoá các phiên bản đang hoạt động.

app.yaml

Các phần mới cần thêm

Thời gian chạy App Engine Python 2 yêu cầu các gói cụ thể của bên thứ ba khi sử dụng Cloud API như Cloud NDB, cụ thể là grpciosetuptools. Người dùng Python 2 phải liệt kê các thư viện tích hợp như thế này cùng với một phiên bản hiện có trong app.yaml. Nếu bạn chưa có phần libraries, hãy tạo một phần và thêm cả hai thư viện như sau:

libraries:
- name: grpcio
  version: latest
- name: setuptools
  version: latest

Khi di chuyển ứng dụng của bạn, ứng dụng đó có thể đã có một phần libraries. Nếu có, nhưng thiếu grpciosetuptools, bạn chỉ cần thêm chúng vào phần libraries hiện có.

Tiếp theo, ứng dụng mẫu của chúng ta cần thông tin về phiên bản Cloud Memorystore và trình kết nối VPC. Vì vậy, hãy thêm 2 phần mới sau đây vào app.yaml bất kể bạn đang dùng thời gian chạy Python nào:

env_variables:
    REDIS_HOST: 'YOUR_REDIS_HOST'
    REDIS_PORT: 'YOUR_REDIS_PORT'

vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR

Đó là tất cả những nội dung cập nhật bắt buộc. app.yaml được cập nhật của bạn giờ đây sẽ có dạng như sau:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

libraries:
- name: grpcio
  version: 1.0.0
- name: setuptools
  version: 36.6.0

env_variables:
    REDIS_HOST: 'YOUR_REDIS_HOST'
    REDIS_PORT: 'YOUR_REDIS_PORT'

vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR

Dưới đây là ví dụ "trước và sau" minh hoạ những nội dung cập nhật mà bạn nên áp dụng cho app.yaml:

ec2bb027a67debb6.png

*Điểm khác biệt của Python 3

Đây là phần không bắt buộc và chỉ áp dụng nếu bạn đang chuyển sang Python 3. Để làm điều đó, bạn cần thực hiện một số thay đổi đối với cấu hình Python 2. Bỏ qua phần này nếu bạn không nâng cấp tại thời điểm này.

Không dùng threadsafe cũng như api_version cho thời gian chạy Python 3, vì vậy, hãy xoá cả hai chế độ cài đặt này. Thời gian chạy App Engine mới nhất không hỗ trợ các thư viện tích hợp sẵn của bên thứ ba cũng như việc sao chép các thư việnkhông tích hợp sẵn. Yêu cầu duy nhất đối với các gói của bên thứ ba là liệt kê chúng trong requirements.txt. Do đó, bạn có thể xoá toàn bộ phần libraries của app.yaml.

Tiếp theo, thời gian chạy Python 3 yêu cầu sử dụng các khung web tự định tuyến, do đó, chúng tôi đã hướng dẫn nhà phát triển cách di chuyển từ webp2 sang Flask trong Mô-đun 1. Do đó, bạn phải thay đổi tất cả trình xử lý tập lệnh thành auto. Vì ứng dụng này không phân phát bất kỳ tệp tĩnh nào, nên việc liệt kê các trình xử lý là "vô nghĩa" (vì tất cả đều là auto), nên bạn cũng có thể xoá toàn bộ phần handlers. Do đó, app.yaml mới, rút gọn được điều chỉnh cho Python 3 sẽ được rút ngắn để có dạng như sau:

runtime: python39

env_variables:
    REDIS_HOST: 'YOUR_REDIS_HOST'
    REDIS_PORT: 'YOUR_REDIS_PORT'

vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR

Tóm tắt những điểm khác biệt trong app.yaml khi chuyển sang Python 3:

  • Xoá chế độ cài đặt threadsafeapi_version
  • Xoá libraries phần
  • Xoá phần handlers (hoặc chỉ các trình xử lý script nếu ứng dụng của bạn phân phát tệp tĩnh)

Thay thế các giá trị

Các giá trị trong phần mới cho Memorystore và trình kết nối VPC chỉ là các giá trị giữ chỗ. Thay thế những giá trị viết hoa đó (YOUR_REDIS_HOST, YOUR_REDIS_PORT, PROJECT_ID, REGION, CONNECTOR_NAME) bằng các giá trị đã lưu khi bạn tạo những tài nguyên đó trước đó. Đối với phiên bản Memorystore, hãy nhớ sử dụng HOST (không phải RESERVED_IP) và PORT. Sau đây là cách nhanh chóng để lấy HOSTPORT bằng dòng lệnh, giả sử tên phiên bản là demo-msREGIONus-central1:

$ gcloud redis instances describe demo-ms --region us-central1 \
    --format "value(host,port)"
10.251.161.51   6379

Nếu địa chỉ IP của phiên bản Redis mẫu là 10.10.10.10 sử dụng cổng 6379 trong dự án my-project nằm ở khu vực us-central1 với tên trình kết nối VPC là demo-vpc, thì các phần này trong app.yaml sẽ có dạng như sau:

env_variables:
    REDIS_HOST: '10.10.10.10'
    REDIS_PORT: '6379'

vpc_access_connector:
    name: projects/my-project/locations/us-central1/connectors/demo-vpc

Tạo hoặc cập nhật appengine_config.py

Thêm tính năng hỗ trợ cho các thư viện tích hợp sẵn của bên thứ ba

Tương tự như những gì chúng ta đã làm với app.yaml trước đó, hãy thêm cách sử dụng các thư viện grpciosetuptools. Sửa đổi appengine_config.py để hỗ trợ các thư viện tích hợp sẵn của bên thứ ba. Nếu bạn thấy quen thuộc, thì đó là vì bạn cũng phải làm việc này trong Mô-đun 2 khi di chuyển từ App Engine ndb sang Cloud NDB. Bạn cần thêm thư mục lib vào nhóm setuptools.pkg_resources đang hoạt động:

4140b3800694f77e.png

*Điểm khác biệt của Python 3

Đây là phần không bắt buộc và chỉ áp dụng nếu bạn đang chuyển sang Python 3. Một trong những thay đổi đáng chú ý của App Engine thế hệ thứ hai là bạn không cần sao chép (đôi khi được gọi là "vendoring") các gói của bên thứ ba (không phải gói tích hợp sẵn) và tham chiếu các gói của bên thứ ba tích hợp sẵn trong app.yaml nữa, tức là bạn có thể xoá toàn bộ tệp appengine_config.py.

6. Cập nhật tệp ứng dụng

Chỉ có một tệp ứng dụng, main.py, nên mọi thay đổi trong phần này chỉ ảnh hưởng đến tệp đó. Chúng tôi đã cung cấp hình ảnh minh hoạ về những thay đổi mà chúng tôi sẽ thực hiện để di chuyển ứng dụng này sang Cloud Memorystore. Hình ảnh này chỉ mang tính minh hoạ và không nhằm mục đích để bạn phân tích kỹ lưỡng. Mọi thao tác đều nằm trong những thay đổi mà chúng ta thực hiện đối với mã.

5d043768ba7be742.png

Hãy giải quyết từng phần một, bắt đầu từ phần trên cùng.

Cập nhật các lệnh nhập

Phần nhập trong main.py cho Mô-đun 12 sử dụng Cloud NDB và Cloud Tasks; sau đây là các mục nhập của chúng:

TRƯỚC:

from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb

Để chuyển sang Memorystore, bạn cần đọc các biến môi trường, tức là bạn cần mô-đun Python os cũng như redis, ứng dụng khách Python Redis. Vì Redis không thể lưu các đối tượng Python vào bộ nhớ đệm, hãy sắp xếp danh sách các lượt truy cập gần đây nhất bằng cách sử dụng pickle, vì vậy hãy nhập cả danh sách đó. Một lợi ích của Memcache là quá trình chuyển đổi tuần tự đối tượng diễn ra tự động, trong khi Memorystore có phần "tự làm" hơn. Cuối cùng, hãy nâng cấp từ App Engine ndb lên Cloud NDB bằng cách thay thế google.appengine.ext.ndb bằng google.cloud.ndb. Sau những thay đổi này, các nội dung nhập của bạn sẽ có dạng như sau:

SAU:

import os
import pickle
from flask import Flask, render_template, request
from google.cloud import ndb
import redis

Cập nhật quá trình khởi tạo

Việc khởi tạo Mô-đun 12 bao gồm việc tạo bản sao cho đối tượng ứng dụng Flask app và thiết lập một hằng số cho giá trị bộ nhớ đệm trong một giờ:

TRƯỚC KHI:

app = Flask(__name__)
HOUR = 3600

Việc sử dụng Cloud API yêu cầu một ứng dụng, vì vậy, hãy tạo một phiên bản ứng dụng Cloud NDB ngay sau Flask. Tiếp theo, hãy lấy địa chỉ IP và số cổng cho phiên bản Memorystore từ các biến môi trường mà bạn đã thiết lập trong app.yaml. Với thông tin đó, hãy tạo thực thể ứng dụng Redis. Sau đây là giao diện mã của bạn sau khi cập nhật:

SAU:

app = Flask(__name__)
ds_client = ndb.Client()
HOUR = 3600
REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
REDIS_PORT = os.environ.get('REDIS_PORT', '6379')
REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)

*Di chuyển Python 3

Phần này là không bắt buộc và chỉ dành cho những bạn bắt đầu từ phiên bản Python 3 của ứng dụng Mô-đun 12. Nếu vậy, bạn cần thực hiện một số thay đổi bắt buộc liên quan đến việc nhập và khởi tạo.

Trước tiên, vì Memcache là một dịch vụ đi kèm của App Engine, nên việc sử dụng dịch vụ này trong một ứng dụng Python 3 yêu cầu App Engine SDK, cụ thể là bao bọc ứng dụng WSGI (cũng như cấu hình cần thiết khác):

TRƯỚC:

from flask import Flask, render_template, request
from google.appengine.api import memcache, wrap_wsgi_app
from google.appengine.ext import ndb

app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
HOUR = 3600

Vì chúng tôi đang di chuyển sang Cloud Memorystore (không phải là dịch vụ đi kèm App Engine như Memcache), nên bạn phải xoá việc sử dụng SDK. Việc này rất đơn giản vì bạn chỉ cần xoá toàn bộ dòng nhập cả memcachewrap_wsgi_app. Xoá cả dòng gọi wrap_wsgi_app(). Những nội dung cập nhật này khiến phần này của ứng dụng (thực ra là toàn bộ ứng dụng) giống hệt với phiên bản Python 2.

SAU:

import os
import pickle
from flask import Flask, render_template, request
from google.cloud import ndb
import redis

app = Flask(__name__)
ds_client = ndb.Client()
HOUR = 3600
REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
REDIS_PORT = os.environ.get('REDIS_PORT', '6379')
REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)

Cuối cùng, hãy xoá việc sử dụng SDK khỏi app.yaml (xoá dòng: app_engine_apis: true) và requirements.txt (xoá dòng: appengine-python-standard).

Di chuyển sang Cloud Memorystore (và Cloud NDB)

Mô hình dữ liệu của Cloud NDB được thiết kế để tương thích với ndb của App Engine, tức là định nghĩa về các đối tượng Visit vẫn giữ nguyên. Mô phỏng quá trình di chuyển Mô-đun 2 sang Cloud NDB, tất cả lệnh gọi kho dữ liệu trong store_visit()fetch_visits() đều được tăng cường và nhúng vào một khối with mới (vì bạn phải sử dụng trình quản lý bối cảnh Cloud NDB). Sau đây là những lệnh gọi trước khi có thay đổi đó:

TRƯỚC:

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

Thêm một khối with ds_client.context() vào cả hai hàm và đặt các lệnh gọi Datastore vào bên trong (và thụt lề). Trong trường hợp này, bạn không cần thay đổi gì đối với chính các lệnh gọi:

SAU:

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    with ds_client.context():
        Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    with ds_client.context():
        return Visit.query().order(-Visit.timestamp).fetch(limit)

Tiếp theo, hãy xem các thay đổi về việc lưu vào bộ nhớ đệm. Dưới đây là hàm main() trong Mô-đun 12:

TRƯỚC:

@app.route('/')
def root():
    'main application (GET) handler'
    # check for (hour-)cached visits
    ip_addr, usr_agt = request.remote_addr, request.user_agent
    visitor = '{}: {}'.format(ip_addr, usr_agt)
    visits = memcache.get('visits')

    # register visit & run DB query if cache empty or new visitor
    if not visits or visits[0].visitor != visitor:
        store_visit(ip_addr, usr_agt)
        visits = list(fetch_visits(10))
        memcache.set('visits', visits, HOUR)  # set() not add()

    return render_template('index.html', visits=visits)

Redis có các lệnh gọi "get" và "set", giống như Memcache. Tất cả những gì chúng ta cần làm là hoán đổi các thư viện ứng dụng tương ứng, đúng không? Gần đúng rồi. Như đã đề cập trước đó, chúng ta không thể lưu vào bộ nhớ đệm danh sách Python bằng Redis (vì danh sách này cần được chuyển đổi tuần tự trước, điều mà Memcache tự động xử lý), vì vậy, trong lệnh gọi set(), hãy "pickle" các lượt truy cập thành một chuỗi bằng pickle.dumps(). Tương tự, khi truy xuất lượt truy cập từ bộ nhớ đệm, bạn cần phải huỷ chọn lượt truy cập bằng pickle.loads() ngay sau get(). Sau đây là trình xử lý chính sau khi triển khai những thay đổi đó:

SAU:

@app.route('/')
def root():
    'main application (GET) handler'
    # check for (hour-)cached visits
    ip_addr, usr_agt = request.remote_addr, request.user_agent
    visitor = '{}: {}'.format(ip_addr, usr_agt)
    rsp = REDIS.get('visits')
    visits = pickle.loads(rsp) if rsp else None

    # register visit & run DB query if cache empty or new visitor
    if not visits or visits[0].visitor != visitor:
        store_visit(ip_addr, usr_agt)
        visits = list(fetch_visits(10))
        REDIS.set('visits', pickle.dumps(visits), ex=HOUR)

    return render_template('index.html', visits=visits)

Đến đây là kết thúc những thay đổi cần thiết trong main.py để chuyển đổi việc sử dụng Memcache của ứng dụng mẫu sang Cloud Memorystore. Còn mẫu HTML và việc chuyển sang Python 3 thì sao?

Cập nhật tệp mẫu HTML và chuyển sang Python 3?

Ngạc nhiên chưa! Bạn không cần làm gì ở đây vì ứng dụng được thiết kế để chạy trên cả Python 2 và 3 mà không cần thay đổi mã cũng như thư viện tương thích. Bạn sẽ thấy main.py. giống nhau trên các thư mục "FINISH" mod13a (2.x) và mod13b (3.x). Điều này cũng áp dụng cho requirements.txt , ngoài mọi khác biệt về số phiên bản (nếu có). Vì giao diện người dùng không thay đổi nên templates/index.html cũng không có bản cập nhật.

Mọi thứ cần thiết để chạy ứng dụng này trên App Engine Python 3 đã được hoàn tất trước đó trong quá trình định cấu hình: các chỉ thị không cần thiết đã bị xoá khỏi app.yaml và cả appengine_config.py cũng như thư mục lib đều bị xoá vì chúng không được dùng trong Python 3.

7. 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

Bước kiểm tra cuối cùng là luôn triển khai ứng dụng mẫu. Nhà phát triển Python 2: xoá và cài đặt lại lib bằng các lệnh bên dưới. (Nếu đã cài đặt cả Python 2 và 3 trên hệ thống, bạn có thể phải chạy pip2 một cách rõ ràng.)

rm -rf ./lib
pip install -t lib -r requirements.txt

Giờ đây, cả nhà phát triển Python 2 và 3 đều nên triển khai ứng dụng của họ bằng:

gcloud app deploy

Vì bạn chỉ cần điều chỉnh lại các thành phần bên trong cho một dịch vụ lưu vào bộ nhớ đệm hoàn toàn khác, nên bản thân ứng dụng sẽ hoạt động giống hệt như ứng dụng trong Mô-đun 12:

Ứng dụng visitme trong Mô-đun 7

Bước này hoàn tất lớp học lập trình. Bạn nên so sánh ứng dụng mẫu đã cập nhật của mình với một trong hai thư mục của Mô-đun 13, mod13a (Python 2) hoặc mod13b (Python 3).

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/images
  • console.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_ID và *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:

Hướng dẫn này liên quan đến việc sử dụng 4 sản phẩm của Cloud:

  • App Engine
  • Lưu trữ dữ liệu trên đám mây
  • Cloud Memorystore
  • VPC trên đám mây

Dưới đây là hướng dẫn để giải phóng các tài nguyên này và tránh/giảm thiểu các khoản phí thanh toán.

Tắt phiên bản Memorystore và trình kết nối VPC

Đây là những sản phẩm không có hạng dịch vụ miễn phí, vì vậy, bạn đang phải trả phí ngay bây giờ. Nếu không tắt dự án trên đám mây (xem phần tiếp theo), bạn phải xoá cả phiên bản Memorystore và trình kết nối VPC để ngừng tính phí. Tương tự như khi tạo các tài nguyên này, bạn cũng có thể phát hành chúng từ Cloud Console hoặc dòng lệnh.

Trên Cloud Console

Để xoá phiên bản Memorystore, hãy quay lại trang tổng quan Memorystore rồi nhấp vào mã nhận dạng phiên bản:

2b09baf1aa2e0a25.png

Sau khi truy cập vào trang thông tin chi tiết của phiên bản đó, hãy nhấp vào "Xoá" rồi xác nhận:

f9d9eb1c1d4c6107.png

Để xoá trình kết nối VPC, hãy chuyển đến trang tổng quan của trình kết nối, chọn hộp đánh dấu bên cạnh trình kết nối mà bạn muốn xoá, sau đó nhấp vào "Xoá" rồi xác nhận:

ca5fbd9f4c7c9b60.png

Từ dòng lệnh

Cặp lệnh gcloud sau đây sẽ xoá cả phiên bản Memorystore và trình kết nối VPC:

  • gcloud redis instances delete INSTANCE --region REGION
  • gcloud compute networks vpc-access connectors delete CONNECTOR --region REGION

Nếu chưa đặt mã dự án bằng gcloud config set project, bạn có thể phải cung cấp --project PROJECT_ID. Nếu phiên bản Memorystore của bạn có tên là demo-ms và trình kết nối VPC có tên là demo-vpc, đồng thời cả hai đều ở khu vực us-central1, hãy phát hành cặp lệnh sau và xác nhận:

$ gcloud redis instances delete demo-ms --region us-central1
You are about to delete instance [demo-ms] in [us-central1].
Any associated data will be lost.

Do you want to continue (Y/n)?

Delete request issued for: [demo-ms]
Waiting for operation [projects/PROJECT/locations/REGION/operations/operation-aaaaa-bbbbb-ccccc-ddddd] to complete...done.
Deleted instance [demo-ms].
$
$ gcloud compute networks vpc-access connectors delete demo-vpc --region us-central1
You are about to delete connector [demo-vpc] in [us-central1].
Any associated data will be lost.

Do you want to continue (Y/n)?

Delete request issued for: [demo-vpc]
Waiting for operation [projects/PROJECT/locations/REGION/operations/aaaaa-bbbb-cccc-dddd-eeeee] to complete...done.
Deleted connector [demo-vpc].

Mỗi yêu cầu mất vài phút để chạy. Bạn không bắt buộc phải thực hiện các bước này nếu chọn tắt toàn bộ dự án trên đám mây như mô tả trước đó, tuy nhiên, bạn vẫn phải thanh toán cho đến khi quy trình tắt hoàn tất.

Các bước tiếp theo

Ngoài hướng dẫn này, bạn nên cân nhắc các mô-đun di chuyển khác tập trung vào việc chuyển từ các dịch vụ cũ đi kèm, bao gồm:

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

App Engine không còn là nền tảng duy nhất không cần máy chủ trên Google Cloud nữa. Nếu bạn có một ứng dụng App Engine nhỏ hoặc một ứng dụng có chức năng hạn chế và muốn biến ứng dụng đó thành một vi dịch vụ độc lập, hoặc bạn muốn chia một ứng dụng nguyên khối thành nhiều thành phần có thể dùng lại, thì đây là những lý do chính đáng để cân nhắc việc chuyển sang Cloud Functions. Nếu việc tạo 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 là nếu quy trình này bao gồm một quy trình CI/CD (tích hợp liên tục/phân phối liên tục hoặc triển khai liên tục), hãy cân nhắc việc di chuyển sang Cloud Run. Các trường hợp này được đề cập trong các mô-đun sau:

  • Di chuyển từ App Engine sang Cloud Functions: xem Mô-đun 11
  • Di chuyển từ App Engine sang Cloud Run: xem Mô-đun 4 để đóng gói ứng dụng của bạn bằng Docker hoặc Mô-đùn 5 để thực hiện việc này mà không cần vùng chứa, kiến thức về Docker hoặc Dockerfile

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. Bạn nên cân nhắc những 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 thực hiện bất kỳ thay đổi nào.

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 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ở. README của kho lưu trữ này cũng cung cấp hướng dẫn về những hoạt động di chuyển cần cân nhắc và "thứ tự" liên quan của các Mô-đun di chuyển.

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 repo cho Mô-đun 12 (BẮT ĐẦU) và Mô-đun 13 (KẾT THÚC) trong bảng bên dưới. Bạn cũng có thể truy cập vào các hướng dẫn này trong kho lưu trữ cho tất cả các hoạt động di chuyển codelab App Engine. Bạn có thể sao chép hoặc tải tệp ZIP xuống.

Lớp học lập trình

Python 2

Python 3

Mô-đun 12

code

code

Học phần 13 (lớp học lập trình này)

code

code

Tài liệu tham khảo 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:

App Engine

NDB App Engine và NDB trên đám mây

App Engine Memcache và Cloud Memorystore

VPC trên đám mây

Thông tin khác về Cloud

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.