Thông tin về lớp học lập trình này
1. Giới thiệu
Tại sao việc quản lý ứng dụng lại khó?
Một lý do lớn là các nhà phát triển thường phải là quản trị viên hệ thống bán thời gian. Hãy xem xét (một phần) danh sách các vấn đề cần quan tâm này để phát triển, triển khai và quản lý ứng dụng web hiện đại ở cấp độ sản xuất :
Tôi không biết bạn thế nào, nhưng đây là tất cả những việc tôi không muốn lo lắng! Điều tôi thực sự muốn nghĩ đến là logic ứng dụng:
Tóm lại, đây là mục đích của Cloud Run – mang lại cho bạn khả năng tập trung vào ứng dụng của mình và để bên khác quản lý và bảo trì cho bên khác, cụ thể là Google, những người đã đầu tư hàng triệu giờ để tinh chỉnh và hoàn thiện kỹ năng của mình trong miền này.
Ngoài những thách thức về quản trị nêu trên, bạn cũng phải đối phó với:
- Phần phụ thuộc – Môi trường mà ứng dụng của bạn chạy (bất cứ khi nào có thể) phải khớp chính xác với môi trường mà ứng dụng được kiểm thử. Quá trình này có thể bao gồm một số phương diện, trong đó có hệ điều hành, thư viện hỗ trợ, trình phiên dịch hoặc trình biên dịch ngôn ngữ, cấu hình phần cứng và nhiều yếu tố khác.
- Phân phối – Việc chuyển từ phiên bản cục bộ của một ứng dụng sang phiên bản được chia sẻ rộng rãi trên Internet thường đòi hỏi phải có sự thay đổi về môi trường thời gian chạy, bước nhảy vọt về mức độ phức tạp và đường cong học tập khó khăn.
Cloud Run giải quyết những vấn đề này và nhiều mối lo ngại khác cho bạn. Nhưng thay vì thực hiện theo lời tôi nói, hãy cùng nhau xây dựng một ứng dụng và xem việc chuyển đổi từ môi trường phát triển cục bộ sang ứng dụng đám mây cấp phát hành công khai dễ dàng như thế nào chỉ qua vài bước đơn giản.
Bạn sẽ thực hiện...
- Bạn sẽ tạo một ứng dụng web đơn giản và xác minh rằng ứng dụng đó chạy như mong đợi trong môi trường phát triển của bạn.
- Sau đó, bạn sẽ chuyển sang phiên bản vùng chứa của cùng một ứng dụng. Ngoài ra, bạn sẽ khám phá ý nghĩa của việc sử dụng vùng chứa và tại sao việc này lại hữu ích đến vậy.
- Cuối cùng, bạn sẽ triển khai ứng dụng lên đám mây và bạn sẽ thấy việc quản lý dịch vụ Cloud Run bằng dòng lệnh và Google Cloud Console dễ dàng như thế nào.
Kiến thức bạn sẽ học được...
- Cách tạo một ứng dụng máy chủ web đơn giản bằng Python
- Cách đóng gói ứng dụng vào một vùng chứa Docker để chạy ở mọi nơi
- Cách triển khai ứng dụng lên đám mây để ai cũng có thể dùng thử tác phẩm mới của bạn
- Cách đơn giản hoá các bước trên hơn nữa bằng cách sử dụng Buildpack
- Cách sử dụng công cụ dòng lệnh Google Cloud và giao diện người dùng web của Cloud Console
Bạn cần...
- Trình duyệt web
- Tài khoản Google
Phòng thí nghiệm này nhắm đến nhà phát triển ở mọi cấp độ, kể cả người mới bắt đầu. Mặc dù bạn sẽ sử dụng Python, nhưng bạn không cần phải quen thuộc với lập trình Python để hiểu điều gì đang xảy ra vì chúng tôi sẽ giải thích tất cả các mã bạn sử dụng.
2. Bắt đầu thiết lập
Phần này bao gồm mọi việc bạn cần làm để bắt đầu với phòng thí nghiệm này.
Thiết lập môi trường theo tiến độ riêng
- Đăng nhập vào Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. (Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.)
Xin lưu ý rằng mã dự án là một tên riêng biệt trong tất cả dự án Google Cloud (tên ở trên đã được sử dụng nên sẽ không phù hợp với bạn!). Lớp này sẽ được đề cập sau trong lớp học lập trình này là PROJECT_ID
.
- Tiếp theo, bạn sẽ cần bật tính năng thanh toán trong Cloud Console để sử dụng tài nguyên của Google Cloud.
Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" sẽ tư vấn cho bạn cách tắt tài nguyên để bạn không phải chịu thanh toán ngoài hướng dẫn này. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.
Khởi động Cloud Shell
Trong phòng thí nghiệm này, bạn sẽ thực hiện phiên Cloud Shell, đây là phiên dịch lệnh được lưu trữ bởi một máy ảo chạy trên đám mây của Google. Dù bạn có thể dễ dàng chạy phần này trên máy tính của mình, nhưng việc sử dụng Cloud Shell sẽ giúp mọi người có thể tiếp cận trải nghiệm có thể tái tạo trong một môi trường nhất quán. Sau phòng thí nghiệm này, bạn có thể thử lại phần này trên máy tính của mình.
Kích hoạt Cloud Shell
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell
.
Nếu trước đây bạn chưa từng khởi động Cloud Shell, thì bạn sẽ thấy một màn hình trung gian (dưới màn hình đầu tiên) mô tả về ứng dụng này. Nếu trường hợp đó xảy ra, hãy nhấp vào Tiếp tục (và bạn sẽ không thấy thông báo đó nữa). Màn hình một lần đó sẽ có dạng như sau:
Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.
Máy ảo này chứa tất cả các công cụ phát triển mà bạn cần. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trong Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Trong lớp học lập trình này, đa số mọi người đều có thể thực hiện chỉ bằng một trình duyệt hoặc Chromebook.
Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án đã được đặt thành mã dự án.
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list
Kết quả lệnh
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project
Kết quả lệnh
[core] project = <PROJECT_ID>
Nếu chưa, bạn có thể thiết lập chế độ này bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Kết quả lệnh
Updated property [core/project].
Thiết lập một số biến môi trường trong thiết bị đầu cuối của bạn để giúp cuộc sống dễ dàng hơn trong các bước tiếp theo:
export PROJ=$GOOGLE_CLOUD_PROJECT export APP=hello export PORT=8080 export REGION="us-central1" export TAG="gcr.io/$PROJ/$APP"
Bật các API
Trong các bước sau, bạn sẽ biết những dịch vụ này cần thiết ở đâu (và lý do cần đến những dịch vụ này). Nhưng bây giờ, hãy chạy lệnh này để cấp cho dự án của bạn quyền truy cập vào các dịch vụ Cloud Build, Container Registry và Cloud Run:
gcloud services enable cloudbuild.googleapis.com \ containerregistry.googleapis.com \ run.googleapis.com
Thao tác này sẽ tạo ra một thông báo thành công tương tự như thông báo sau:
Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.
3. Tạo ứng dụng web đơn giản
Bắt đầu bằng cách nhấp vào nút Open Editor
ở đầu bảng điều khiển Cloud Shell. Thông báo sẽ có dạng như sau:
Sau đó, bạn sẽ vào một môi trường IDE tương tự như Visual Studio Code. Tại đây, bạn có thể tạo dự án, chỉnh sửa mã nguồn, chạy chương trình, v.v. Nếu màn hình quá hẹp, bạn có thể mở rộng hoặc thu nhỏ đường phân chia giữa bảng điều khiển và cửa sổ chỉnh sửa/cửa sổ kết thúc bằng cách kéo thanh ngang giữa hai vùng đó, được làm nổi bật tại đây:
Bạn có thể chuyển đổi qua lại giữa Trình chỉnh sửa và Cửa sổ dòng lệnh bằng cách nhấp vào nút Open Editor
và Open Terminal
tương ứng. Thử chuyển đổi qua lại giữa hai môi trường này ngay bây giờ.
Tiếp theo, hãy tạo một thư mục để lưu trữ công việc của bạn cho phòng thí nghiệm này bằng cách chọn Tệp->Thư mục mới, nhập hello
rồi nhấp vào OK
. Tất cả tệp bạn tạo trong phòng thí nghiệm này và mọi thao tác bạn thực hiện trong Cloud Shell đều sẽ diễn ra trong thư mục này.
Bây giờ, hãy tạo một tệp requirements.txt
. Điều này cho Python biết ứng dụng của bạn phụ thuộc vào những thư viện nào. Đối với ứng dụng web đơn giản này, bạn sẽ sử dụng một mô-đun Python phổ biến để xây dựng các máy chủ web có tên là Flask
và khung máy chủ web có tên là gunicorn
. Trong cửa sổ Cloud Editor, nhấp vào menu Tệp->Tệp mới để tạo tệp mới. Khi được nhắc nhập tên của tệp mới, hãy nhập requirements.txt
rồi nhấn nút OK
. Hãy đảm bảo tệp mới nằm trong thư mục dự án hello
.
Nhập các dòng sau vào tệp mới để chỉ định rằng ứng dụng của bạn phụ thuộc vào gói Python Flask và máy chủ web gunicorn.
Flask gunicorn
Bạn không cần phải lưu tệp này một cách rõ ràng vì Cloud Editor sẽ tự động lưu các thay đổi cho bạn.
Phiên bản 1: Xin chào mọi người!
Sử dụng chính kỹ thuật đó, tạo một tệp mới khác có tên main.py
. Đây sẽ là tệp nguồn Python chính (và duy nhất) của ứng dụng. Một lần nữa, hãy đảm bảo tệp mới nằm trong thư mục dự án hello
.
Chèn mã sau vào tệp này:
from flask import Flask
import os
import random
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from the environment.
# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
@app.route("/", methods=["GET"])
def say_hello():
html = "<h1>Hello world!</h1>"
return html
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
Quay lại cửa sổ dòng lệnh rồi thay đổi vào thư mục dự án bằng lệnh sau:
cd hello
Chạy lệnh sau để cài đặt các phần phụ thuộc của dự án:
pip3 install -r requirements.txt
Bây giờ, hãy chạy ứng dụng của bạn bằng cách chạy lệnh sau trong cửa sổ dòng lệnh:
python3 main.py
Tại thời điểm này, ứng dụng của bạn đang chạy trên máy ảo dành riêng cho phiên sử dụng Cloud shell. Cloud shell bao gồm cơ chế proxy giúp bạn có thể truy cập vào các máy chủ web (như máy chủ bạn vừa khởi động) đang chạy trên máy ảo của bạn từ bất kỳ đâu trên Internet toàn cầu.
Nhấp vào nút web preview
rồi nhấp vào mục trong trình đơn Preview on Port 8080
như sau:
Thao tác này sẽ mở ra một thẻ trình duyệt web cho ứng dụng đang chạy của bạn, thẻ này có dạng như sau:
Phiên bản 2: Lặp lại đường dẫn URL
Quay lại Cloud Editor (qua nút Open Editor
) và thêm tính năng hỗ trợ lặp lại hậu tố URL không bắt buộc bằng cách cập nhật tệp main.py
của bạn như sau:
from flask import Flask
import os
import random
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from environment.
# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"]) # ← NEW
def say_hello(name="world"): # ← MODIFIED
html = f"<h1>Hello {name}!</h1>" # ← MODIFIED
return html
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
Quay lại Cửa sổ dòng lệnh (qua nút Open Terminal
) và nhập control-C
(giữ phím điều khiển trong khi nhấn "C") để dừng ứng dụng đang chạy rồi khởi động lại bằng cách nhập:
python3 main.py
Một lần nữa, nhấp vào nút web preview
rồi nhấp vào mục trong trình đơn Preview on Port 8080
để mở thẻ trình duyệt web cho ứng dụng đang chạy. Bạn sẽ lại thấy thông báo "Hello world!" nhưng bây giờ hãy thay thế văn bản URL sau ký tự dấu gạch chéo bằng bất kỳ chuỗi nào bạn chọn (ví dụ: /your-name
) và xác minh rằng bạn thấy giống như sau:
Phiên bản 3: Màu ngẫu nhiên
Giờ đây, hãy thêm tính năng hỗ trợ cho màu nền ngẫu nhiên bằng cách quay lại Cloud Editor (thông qua nút Open Editor
) và cập nhật tệp main.py
của bạn như sau:
from flask import Flask
import os
import random
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from the environment.
# This function decides whether foreground text should be
# displayed in black or white, to maximize fg/bg contrast.
def set_text_color(rgb): # ← NEW
sum = round( # ← NEW
(int(rgb[0]) * 0.299) # ← NEW
+ (int(rgb[1]) * 0.587) # ← NEW
+ (int(rgb[2]) * 0.114) # ← NEW
) # ← NEW
return "black" if sum > 186 else "white" # ← NEW
# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
# To verify each new invocation of these requests, the HTML document
# includes CSS styling to produce a randomly colored background.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])
def say_hello(name="world"):
bg = random.sample(range(1, 255), 3) # ← NEW
hex = (int(bg[0]) * 256) + (int(bg[1]) * 16) + int(bg[2]) # ← NEW
fg_color = set_text_color(bg) # ← NEW
bg_color = f"#{hex:06x}" # ← NEW
style = f"color:{fg_color}; background-color:{bg_color}" # ← NEW
html = f'<h1 style="{style}">Hello {name}!</h1>' # ← MODIFIED
return html
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
Quay lại Cửa sổ dòng lệnh (qua nút Open Terminal
) và nhập control-C
(giữ phím điều khiển trong khi nhấn "C") để dừng ứng dụng đang chạy rồi khởi động lại bằng cách nhập:
python3 main.py
Một lần nữa, nhấp vào nút web preview
rồi nhấp vào mục trong trình đơn Preview on Port 8080
để mở thẻ trình duyệt web cho ứng dụng đang chạy. Bạn sẽ thấy văn bản được tạo, với bất kỳ hậu tố cụ thể nào hoặc dòng chữ mặc định "Xin chào thế giới!" được hiển thị trước một nền được tô màu ngẫu nhiên, như sau:
Tải lại trang vài lần để xem màu nền ngẫu nhiên thay đổi mỗi lần bạn truy cập vào ứng dụng này.
Vậy là ứng dụng của bạn đã hoàn tất. Xin chúc mừng! Trong bước tiếp theo, bạn sẽ tìm hiểu cách đóng gói ứng dụng vào một vùng chứa và lý do việc này là hữu ích.
4. Mở rộng vùng chứa ứng dụng
Vùng chứa là gì?
Các vùng chứa nói chung và Docker nói riêng cho phép chúng ta tạo một hộp mô-đun để chạy ứng dụng với tất cả các phần phụ thuộc của ứng dụng đó được kết hợp với nhau. Chúng tôi gọi kết quả này là hình ảnh vùng chứa. Trong phần này, bạn sẽ tạo một hình ảnh vùng chứa mà bạn sẽ dùng để đóng gói ứng dụng cũng như tất cả phần phụ thuộc của ứng dụng.
Đề cập về phần phụ thuộc, ở bước trước, khi chạy ứng dụng trong môi trường dành cho nhà phát triển, bạn phải chạy pip3 install -r requirements.txt
và đảm bảo tệp yêu cầu chứa tất cả thư viện phần phụ thuộc và phiên bản tương ứng. Với vùng chứa, bạn sẽ cài đặt các yêu cầu đó khi tạo hình ảnh vùng chứa, vì vậy, người dùng vùng chứa không cần phải lo lắng về việc cài đặt bất cứ thứ gì.
Hình ảnh vùng chứa này sẽ tạo thành thành phần cơ bản để triển khai ứng dụng của bạn trên Cloud Run. Vì các vùng chứa có thể được sử dụng trên hầu hết mọi máy chủ ảo hoặc thực, điều này giúp chúng tôi có một cách thức để triển khai ứng dụng của bạn ở bất cứ nơi nào bạn muốn và di chuyển ứng dụng của bạn từ nhà cung cấp dịch vụ này sang nhà cung cấp dịch vụ khác hoặc từ cơ sở hạ tầng riêng sang Đám mây.
Vùng chứa giúp ứng dụng của bạn:
- có thể tái tạo – vùng chứa độc lập và hoàn chỉnh
- di động – vùng chứa là các thành phần liên ngành, cho phép di chuyển ứng dụng giữa các nhà cung cấp dịch vụ đám mây và môi trường
Tóm lại, vùng chứa cung cấp khả năng "viết một lần và chạy ở mọi nơi" cuối cùng. Có một ngoại lệ đối với quy tắc đó là vùng chứa đã tạo bị buộc phải chạy trên loại bộ xử lý mà bạn đã tạo nó, nhưng cũng có cách tạo phiên bản vùng chứa cho các cấu hình phần cứng khác.
Nói đủ rồi, hãy làm một vùng chứa! Bạn sẽ sử dụng một công nghệ cụ thể để tạo một vùng chứa có tên là Docker.
Trong Cloud Editor, hãy tạo một tệp mới có tên là Dockerfile
. Tệp này là sơ đồ thiết kế để dựng hình ảnh của bạn. Nó cho Docker biết về môi trường điều hành và mã nguồn của bạn, cách cài đặt các phần phụ thuộc, xây dựng ứng dụng và chạy mã.
# Use an official lightweight Python image.
FROM python:3.9-slim
# Copy local code to the container image.
WORKDIR /app
COPY main.py .
COPY requirements.txt .
# Install dependencies into this container so there's no need to
# install anything at container run time.
RUN pip install -r requirements.txt
# Service must listen to $PORT environment variable.
# This default value facilitates local development.
ENV PORT 8080
# Run the web service on container startup. Here you use the gunicorn
# server, with one worker process and 8 threads. For environments
# with multiple CPU cores, increase the number of workers to match
# the number of cores available.
CMD exec gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 main:app
Trong Cloud Terminal, hãy tạo hình ảnh vùng chứa bằng Cloud Build bằng cách chạy lệnh sau:
gcloud builds submit --tag $TAG
Sau khi được đẩy vào sổ đăng ký, bạn sẽ thấy thông báo SUCCESS
chứa tên hình ảnh, có dạng như sau: gcr.io/<project-id>/hello
. Hình ảnh hiện được lưu trữ trong Google Container Registry và có thể được sử dụng lại bất cứ khi nào và bất cứ nơi nào bạn muốn.
Bạn có thể liệt kê tất cả hình ảnh vùng chứa được liên kết với dự án hiện tại của mình bằng lệnh sau:
gcloud container images list
Bây giờ, hãy chạy và kiểm thử ứng dụng cục bộ từ Cloud Shell bằng lệnh docker
sau:
docker run -p $PORT:$PORT -e PORT=$PORT $TAG
Tuỳ chọn -p $PORT:$PORT
yêu cầu Docker liên kết cổng bên ngoài $PORT
(được đặt thành 8080 ở trên) trong môi trường máy chủ lưu trữ vào cùng số cổng bên trong vùng chứa đang chạy. Điều này giúp cuộc sống trở nên dễ dàng hơn vì mã máy chủ bạn viết và số cổng bên ngoài mà bạn kết nối khi kiểm thử ứng dụng sẽ giống nhau (8080), nhưng bạn có thể dễ dàng sử dụng tùy chọn -p để ánh xạ mọi cổng bên ngoài tuỳ ý trên máy chủ đến bất kỳ cổng nội bộ mong muốn nào bên trong vùng chứa.
Tuỳ chọn -e PORT=$PORT
yêu cầu Docker cung cấp biến môi trường $PORT
(được đặt thành 8080 ở trên) cho ứng dụng chạy bên trong vùng chứa.
Bây giờ, bạn đã sẵn sàng kiểm thử ứng dụng của mình bằng cách trỏ một trình duyệt web đến đoạn mã Python chạy bên trong vùng chứa. Trong cửa sổ Cloud Shell, nhấp vào "Bản xem trước trên web" và chọn "Xem trước trên cổng 8080", như bạn đã làm trong bước trước.
Kết quả trông quen thuộc – bạn sẽ thấy văn bản được tạo trước nền được tô màu ngẫu nhiên, giống như khi bạn chạy ứng dụng ngay trong thiết bị đầu cuối Cloud Shell. Tải lại trang vài lần để xem màu nền ngẫu nhiên thay đổi mỗi lần bạn truy cập vào ứng dụng này.
Xin chúc mừng! Bạn hiện đã chạy một phiên bản ứng dụng trong vùng chứa. Trong phần tiếp theo, mà không cần chạm vào dòng mã, bạn sẽ biến hình ảnh vùng chứa của mình thành ứng dụng web chất lượng sản xuất.
5. Lên đám mây...
Giờ đây, khi bạn đã tạo vùng chứa ứng dụng của mình, bạn sẽ muốn chia sẻ điều tuyệt vời này với mọi người, vì vậy, đã đến lúc triển khai ứng dụng lên Đám mây. Nhưng bạn thực sự muốn làm nhiều hơn là chỉ chia sẻ. Bạn cần đảm bảo rằng tài khoản của mình:
- chạy đáng tin cậy - bạn nhận được khả năng chấp nhận lỗi tự động trong trường hợp máy tính chạy ứng dụng của bạn gặp sự cố
- tự động mở rộng – ứng dụng của bạn sẽ bắt kịp lưu lượng truy cập lớn và tự động giảm mức sử dụng khi không dùng đến
- giảm thiểu chi phí của bạn bằng cách không tính phí cho những tài nguyên mà bạn không sử dụng - bạn chỉ bị tính phí cho tài nguyên được tiêu thụ trong khi phản hồi lưu lượng truy cập
- có thể truy cập qua tên miền tuỳ chỉnh – bạn có quyền truy cập vào giải pháp chỉ cần một lần nhấp để chỉ định tên miền tuỳ chỉnh cho dịch vụ của mình
- cung cấp thời gian phản hồi tuyệt vời – quy trình khởi động nguội có tính phản hồi hợp lý, nhưng bạn có thể tinh chỉnh bằng cách chỉ định cấu hình thực thể tối thiểu
- hỗ trợ mã hoá hai đầu bằng cách sử dụng giao thức bảo mật web SSL/TLS tiêu chuẩn – khi triển khai một dịch vụ, bạn sẽ nhận được tính năng mã hoá web tiêu chuẩn cũng như các chứng chỉ bắt buộc tương ứng, miễn phí và tự động
Khi triển khai ứng dụng trên Google Cloud Run, bạn sẽ có được tất cả những lợi ích nêu trên và nhiều lợi ích khác.
Triển khai ứng dụng lên Cloud Run
Trước tiên, hãy sửa đổi ứng dụng của bạn để bạn có thể nhận biết bản sửa đổi mới với bản sửa đổi cũ. Hãy làm việc này bằng cách sửa đổi tệp main.py
sao cho thông báo mặc định thay đổi từ "Hello world!" đến "Hello from Cloud Run!" (Xin chào từ Cloud Run!) Nói cách khác, hãy thay đổi dòng này trong main.py
từ thế này:
def say_hello(name="world"):
vào việc này:
def say_hello(name="from Cloud Run"):
Cloud Run mang tính khu vực, nghĩa là cơ sở hạ tầng chạy các dịch vụ Cloud Run được đặt ở một khu vực cụ thể và được Google quản lý để có thể sử dụng dự phòng trên tất cả các vùng trong khu vực đó. Trong phần "Thiết lập" ở trên, bạn đã xác định một khu vực mặc định thông qua biến môi trường REGION
.
Tạo lại hình ảnh vùng chứa và triển khai ứng dụng trong vùng chứa lên Cloud Run bằng lệnh sau:
gcloud builds submit --tag $TAG gcloud run deploy "$APP" \ --image "$TAG" \ --platform "managed" \ --region "$REGION" \ --allow-unauthenticated
- Bạn cũng có thể xác định khu vực mặc định bằng
gcloud config set run/region $REGION
. - Tuỳ chọn
--allow-unauthenticated
sẽ cung cấp dịch vụ công khai. Để tránh các yêu cầu chưa được xác thực, hãy sử dụng--no-allow-unauthenticated
.
Hình ảnh được chỉ định ở đây là hình ảnh Docker mà bạn đã tạo ở bước cuối cùng. Nhờ có dịch vụ Cloud Build, dịch vụ này lưu trữ hình ảnh kết quả trong Google Container Registry, dịch vụ Cloud Run có thể tìm thấy và triển khai hình ảnh cho bạn.
Hãy đợi vài phút cho đến khi quá trình triển khai hoàn tất. Khi thành công, dòng lệnh sẽ hiển thị URL dịch vụ:
Deploying container to Cloud Run service [hello] in project [PROJECT_ID... ✓ Deploying new service... Done. ✓ Creating Revision... Revision deployment finished. Waiting for health check... ✓ Routing traffic... ✓ Setting IAM Policy... Done. Service [hello] revision [hello-...] has been deployed and is serving 100 percent of traffic. Service URL: https://hello-....a.run.app
Bạn cũng có thể truy xuất URL dịch vụ của mình bằng lệnh sau:
gcloud run services describe hello \ --platform managed \ --region $REGION \ --format "value(status.url)"
Thao tác này sẽ hiển thị nội dung như:
https://hello-....a.run.app
Đường liên kết này là một URL chuyên dụng có bảo mật TLS, dành cho dịch vụ Cloud Run của bạn. Đường liên kết này là vĩnh viễn (miễn là bạn không tắt dịch vụ của mình) và có thể sử dụng được ở bất cứ đâu trên Internet. Dịch vụ này không sử dụng cơ chế proxy của Cloud Shell được đề cập trước đó. Cơ chế này phụ thuộc vào một máy ảo tạm thời.
Nhấp vào Service URL
được đánh dấu để mở thẻ trình duyệt web cho ứng dụng đang chạy. Kết quả sẽ hiện thông báo "Hello from Cloud Run!" (Xin chào từ Cloud Run!) trên nền được tô màu ngẫu nhiên.
Xin chúc mừng! Ứng dụng của bạn hiện đang chạy trong Đám mây của Google. Không cần phải bận tâm, ứng dụng của bạn sẽ xuất hiện công khai với tính năng mã hoá TLS (HTTPS) và tự động mở rộng theo quy mô lưu lượng truy cập đáng kinh ngạc.
Nhưng tôi cho rằng quá trình này có thể dễ dàng hơn nữa...
6. Tạo vùng chứa theo cách tự động
Điều này thật tuyệt, nhưng nếu tôi thậm chí không muốn nghĩ về Dockerfiles và vùng chứa. Điều gì sẽ xảy ra nếu, như hầu hết các nhà phát triển, tôi chỉ muốn tập trung vào việc viết mã xử lý ứng dụng của mình và để người khác lo lắng về việc chứa mã đó. Bạn thật may mắn vì Cloud Run hỗ trợ một tiêu chuẩn nguồn mở có tên là Buildpacks. Tiêu chuẩn này tồn tại vì lý do này: để tự động hoá quy trình sản xuất vùng chứa từ tập hợp các tệp nguồn.
Lưu ý rằng có một số trường hợp mà nhà phát triển có thể thích sử dụng một Dockerfile rõ ràng, chẳng hạn như nếu họ muốn có mức độ tuỳ chỉnh cao trong cách xây dựng vùng chứa của họ. Tuy nhiên, đối với những trường hợp phổ biến như bài tập thể dục này, các gói bản dựng hoạt động tốt và tránh được việc phải tạo Dockerfile
theo cách thủ công. Hãy sửa đổi mã nguồn của bạn để sử dụng các gói bản dựng.
Trước tiên, hãy sửa đổi ứng dụng của bạn để bạn có thể nhận biết bản sửa đổi mới với bản sửa đổi cũ. Hãy làm việc này bằng cách sửa đổi tệp main.py
sao cho thông báo mặc định thay đổi từ "Hello from Cloud Run!" (Xin chào từ Cloud Run!) đến "Xin chào từ Cloud Run with Buildpacks!". Nói cách khác, hãy thay đổi dòng này trong main.py
từ thế này:
def say_hello(name="from Cloud Run"):
vào việc này:
def say_hello(name="from Cloud Run with Buildpacks"):
Bây giờ, hãy tận dụng các gói bản dựng bằng cách tạo một tệp mới có tên Procfile
. Hãy tiếp tục và tạo tệp đó trong Cloud Editor rồi chèn một dòng văn bản sau:
web: python3 main.py
Thao tác này cho hệ thống xây dựng lại biết cách chạy ứng dụng của bạn trong vùng chứa được tạo tự động. Với hướng dẫn đó, bạn thậm chí không cần Dockerfile nữa. Để xác minh điều này, hãy xoá Dockerfile của bạn và chạy lệnh sau trong Cloud Shell Terminal:
gcloud beta run deploy "$APP" \ --source . \ --platform "managed" \ --region "$REGION" \ --allow-unauthenticated
Lệnh này tương tự như lệnh mà bạn đã chạy để triển khai ứng dụng ở bước trước, nhưng lần này, bạn đã thay thế tuỳ chọn --image
bằng tuỳ chọn --source .
. Thao tác này sẽ cho lệnh gcloud
biết rằng bạn muốn sử dụng các gói bản dựng để tạo hình ảnh vùng chứa, dựa trên các tệp nguồn mà lệnh này tìm thấy trong thư mục hiện tại (dot
trong --source .
là viết tắt của thư mục hiện tại). Vì dịch vụ này ngầm xử lý hình ảnh vùng chứa, nên bạn không cần chỉ định hình ảnh trong lệnh gcloud
này.
Một lần nữa, hãy kiểm tra để đảm bảo quy trình triển khai này hoạt động hiệu quả bằng cách nhấp vào Service URL
được làm nổi bật để mở thẻ trình duyệt web cho ứng dụng đang chạy và đảm bảo dịch vụ của bạn hiện thông báo "Hello from Cloud Run with Buildpacks!" (Xin chào từ Cloud Run with Buildpacks!) ở trước nền được tô màu ngẫu nhiên.
Lưu ý rằng bằng cách sử dụng các gói bản dựng để tạo Dockerfile
, về cơ bản, bạn đã giảm bớt 3 bước đơn giản xuống còn 2 bước:
- Tạo một ứng dụng trong môi trường phát triển của bạn.
- Triển khai cùng một mã lên đám mây chỉ bằng một lệnh.
7. Tôi có phải sử dụng dòng lệnh không?
Không đâu! Giống như hầu hết các dịch vụ của Google Cloud, có ba cách để tương tác với Cloud Run:
- Công cụ dòng lệnh gcloud mà bạn vừa thấy.
- Giao diện người dùng web phong phú thông qua Cloud Console, hỗ trợ kiểu tương tác trỏ và nhấp trực quan.
- Sử dụng các thư viện ứng dụng của Google theo phương thức lập trình cho nhiều ngôn ngữ phổ biến, chẳng hạn như Java, C#, Python, Go, JavaScript, Ruby, C/C++ và các ngôn ngữ khác.
Hãy triển khai một phiên bản khác của ứng dụng Cloud Run bằng giao diện người dùng trên bảng điều khiển. Chuyển đến trang đích của Dịch vụ Cloud Run qua trình đơn ở phía trên bên trái:
Sau đó, bạn sẽ thấy một bản tóm tắt về các Dịch vụ Cloud Run của mình như sau:
Nhấp vào nút "Create Service" (Tạo dịch vụ) để bắt đầu quá trình triển khai:
Hãy nhập "xin chào một lần nữa" làm tên dịch vụ, lấy nền tảng và khu vực triển khai mặc định, rồi nhấp vào "Tiếp theo".
Nhập URL này cho hình ảnh vùng chứa: gcr.io/cloudrun/hello
, là vùng chứa do Google tạo cho mục đích thử nghiệm và nhấp vào "Cài đặt nâng cao" để xem một số trong số nhiều tùy chọn cài đặt cấu hình có sẵn cho bạn. Để chỉ ra một vài tính năng mà bạn có thể tuỳ chỉnh:
- số cổng và điểm vào vùng chứa (sẽ ghi đè điểm vào được chỉ định khi đóng vùng chứa)
- phần cứng: bộ nhớ và số CPU
- tỷ lệ: số thực thể tối thiểu và tối đa
- biến môi trường
- khác: cài đặt thời gian chờ yêu cầu, số lượng yêu cầu tối đa trên mỗi vùng chứa, HTTP/2
Nhấp vào nút "Tiếp theo" để chuyển hộp thoại lên. Hộp thoại tiếp theo cho phép bạn chỉ định cách dịch vụ của bạn được kích hoạt. Đối với "Lưu lượng truy cập", hãy chọn "cho phép tất cả lưu lượng truy cập", còn đối với "Xác thực", hãy chọn "Cho phép lưu lượng truy cập chưa được xác thực".
Đây là những chế độ cài đặt tự do nhất, trong đó cho phép mọi người truy cập vào ứng dụng Cloud Run của bạn ở bất cứ đâu trên Internet công cộng mà không cần chỉ định thông tin xác thực. Có thể bạn muốn có các chế độ cài đặt hạn chế hơn cho ứng dụng, nhưng hãy đơn giản hoá bài tập này.
Giờ hãy nhấp vào nút Create
để tạo dịch vụ Cloud Run của bạn. Sau vài giây, bạn sẽ thấy dịch vụ mới xuất hiện trong danh sách tóm tắt về các dịch vụ Cloud Run. Dòng tóm tắt cung cấp hoạt động triển khai gần đây nhất (ngày/giờ và người thực hiện) cùng với một số chế độ cài đặt cấu hình chính. Nhấp vào đường liên kết tên dịch vụ để xem chi tiết về dịch vụ mới của bạn.
Để xác minh dịch vụ của bạn, hãy nhấp vào URL xuất hiện gần đầu trang tóm tắt như được đánh dấu trong ví dụ dưới đây:
Bạn sẽ thấy như sau:
Hiện bạn đã triển khai dịch vụ Cloud Run mới, hãy chọn thẻ REVISIONS
để xem một số cách quản lý nhiều phiên bản triển khai.
Để triển khai các bản sửa đổi mới ngay trên bảng điều khiển, bạn có thể nhấp vào nút EDIT & DEPLOY NEW REVISION
, như được đánh dấu trong ảnh chụp màn hình ví dụ dưới đây:
Nhấp vào nút đó ngay bây giờ để tạo một bản sửa đổi mới. Gần URL vùng chứa, hãy nhấp vào nút SELECT
, như sau:
Trong hộp thoại bật lên, hãy tìm ứng dụng web đơn giản mà bạn đã triển khai từ Cloud Build bằng Buildpacks trước đó, sau đó nhấp vào Select (Chọn). Hãy nhớ chọn hình ảnh vùng chứa bên dưới
gcr.io/<project>/cloud-run-source-deploy
thư mục , như sau:
Sau khi chọn, hãy di chuyển xuống dưới cùng rồi nhấp vào nút DEPLOY
. Bạn hiện đã triển khai một bản sửa đổi mới cho ứng dụng của mình. Để xác minh, hãy truy cập lại URL dịch vụ của bạn và kiểm tra để chắc chắn rằng bạn hiện nhìn thấy dòng chữ "Hello from Cloud Run with Buildpacks!" (Xin chào từ Cloud Run với Buildpacks!) ứng dụng web.
Như bạn có thể thấy, thẻ bản sửa đổi cung cấp bản tóm tắt về mọi bản sửa đổi mà bạn đã triển khai và giờ đây, bạn sẽ thấy hai bản sửa đổi cho dịch vụ này. Bạn có thể chọn một bản sửa đổi cụ thể bằng cách nhấp vào nút chọn ở bên trái tên bản sửa đổi. Thao tác này sẽ hiển thị phần tóm tắt chi tiết bản sửa đổi ở bên phải màn hình. Bằng cách chọn các nút đó, bạn có thể thấy rằng hai bản sửa đổi của bạn được lấy từ hai hình ảnh vùng chứa khác nhau.
Nút MANAGE TRAFFIC
cho phép bạn sửa đổi việc phân phối các yêu cầu đến được gửi đến một bản sửa đổi nhất định. Khả năng tinh chỉnh mức lưu lượng truy cập được gửi đến một bản sửa đổi nhất định này cho phép một số trường hợp sử dụng có giá trị:
- canary thử nghiệm một phiên bản mới của ứng dụng với một phần nhỏ lưu lượng truy cập đầu vào
- hoàn nguyên lưu lượng truy cập từ một bản phát hành có vấn đề về một bản sửa đổi trước đó
- Thử nghiệm A/B
Tìm nút MANAGE TRAFFIC
tại đây:
Định cấu hình tỷ lệ phân chia lưu lượng truy cập 50/50 giữa hai bản sửa đổi bằng cách chỉ định tỷ lệ phân chia lưu lượng truy cập 50/50 như sau:
Bây giờ, hãy nhấp vào nút LƯU và xác minh tỷ lệ phân chia 50/50 bằng cách truy cập nhiều lần vào URL dịch vụ của bạn và kiểm tra để đảm bảo rằng trung bình một nửa số yêu cầu của bạn được phân phát bởi bản sửa đổi hiện tại ("Xin chào từ Cloud Run with Buildpacks!") và một nửa được bản sửa đổi trước đó phân phát ("Đây đang chạy!").
Các thẻ khác trên trang Chi tiết dịch vụ cho phép bạn theo dõi hiệu suất, lưu lượng truy cập và nhật ký, từ đó cung cấp thông tin chi tiết có giá trị về mức độ khó và mức độ hiệu quả của dịch vụ. Bạn cũng có thể tinh chỉnh quyền truy cập vào dịch vụ của mình thông qua mục "Quyền" . Hãy dành chút thời gian khám phá các thẻ trên trang này để tìm hiểu các chức năng ở đây.
Giao diện có lập trình
Như đã lưu ý trước đó, bạn cũng có thể tạo, triển khai và quản lý các dịch vụ Cloud Run theo phương thức lập trình. Đối với các tác vụ thủ công, chế độ này nâng cao hơn so với dòng lệnh hoặc bảng điều khiển web, nhưng đây chắc chắn là lựa chọn phù hợp để tự động hoá các dịch vụ của Cloud Run. Bạn có thể chọn sử dụng Thư viện ứng dụng của Google bằng một số ngôn ngữ lập trình phổ biến.
8. Kiểm thử ứng dụng
Trong bước cuối cùng này, bạn sẽ chạy kiểm thử tải nhân tạo để kiểm thử nghiêm ngặt ứng dụng và xem ứng dụng thay đổi như thế nào theo nhu cầu sắp tới. Bạn sẽ sử dụng một công cụ có tên hey được cài đặt sẵn trong Cloud Shell để cho phép chúng ta chạy các lượt kiểm thử tải và trình bày kết quả.
Chạy công cụ kiểm thử
Trong Cloud Shell Terminal, hãy chạy lệnh này để chạy quy trình kiểm thử tải:
hey -q 1000 -c 200 -z 30s https://hello-...run.app
Các đối số lệnh được diễn giải như sau:
-q 1000
– cố gắng tăng tải với khoảng 1.000 yêu cầu mỗi giây-c 200
– phân bổ 200 nhân viên chạy song song-z 30s
– chạy kiểm tra tải trong 30 giây- hãy nhớ sử dụng URL dịch vụ của bạn làm đối số cuối cùng trong dòng lệnh này
Kết quả kiểm thử của bạn sẽ có dạng như sau:
Summary:
Total: 30.2767 secs
Slowest: 3.3633 secs
Fastest: 0.1071 secs
Average: 0.1828 secs
Requests/sec: 1087.2387
Total data: 3028456 bytes
Size/request: 92 bytes
Response time histogram:
0.107 [1] |
0.433 [31346] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.758 [1472] |■■
1.084 [82] |
1.410 [4] |
...
Latency distribution:
...
50% in 0.1528 secs
75% in 0.1949 secs
90% in 0.2442 secs
95% in 0.4052 secs
99% in 0.7062 secs
Details (average, fastest, slowest):
...
req write: 0.0000 secs, 0.0000 secs, 0.0232 secs
resp wait: 0.1824 secs, 0.1070 secs, 3.2953 secs
resp read: 0.0000 secs, 0.0000 secs, 0.0010 secs
Status code distribution:
[200] 32918 responses
Bản tóm tắt này cho chúng tôi biết một số mục mà bạn quan tâm:
- Có 32.918 yêu cầu được gửi với tốc độ khoảng 1K/giây trong 30 giây.
- Không có lỗi (chỉ có 200 phản hồi HTTP).
- Độ trễ trung bình là 180 mili giây.
- Độ trễ tối thiểu là 107 mili giây, trường hợp xấu nhất là 3,3 giây
- Độ trễ của phân vị thứ 90 là 244 mili giây.
Nếu kiểm tra thẻ METRICS
trên bảng điều khiển Cloud Run, bạn có thể thấy phía máy chủ của câu chuyện hiệu suất:
9. Dọn dẹp
Mặc dù Cloud Run không tính phí khi dịch vụ không được sử dụng, nhưng bạn vẫn có thể bị tính phí khi lưu trữ hình ảnh vùng chứa đã tạo.
Bạn có thể xóa dự án GCP của mình để tránh phát sinh phí, sẽ ngừng thanh toán cho tất cả các tài nguyên được sử dụng trong dự án đó hoặc chỉ cần xóa hình ảnh vùng chứa của bạn bằng lệnh sau:
gcloud container images delete $TAG
Để xoá các dịch vụ Cloud Run, hãy dùng các lệnh sau:
gcloud run services delete hello --platform managed --region $REGION --quiet gcloud run services delete hello-again --platform managed --region $REGION --quiet
10. Bạn đã làm được!
Xin chúc mừng! Bạn đã tạo và triển khai thành công ứng dụng Cloud Run chính thức. Đồng thời, bạn đã tìm hiểu về vùng chứa và cách tạo vùng chứa của riêng mình. Bạn đã biết việc triển khai ứng dụng bằng Cloud Run dễ dàng như thế nào khi sử dụng cả công cụ dòng lệnh gcloud
và Cloud Console. Bây giờ, bạn đã biết cách chia sẻ tác phẩm tuyệt vời của mình với cả thế giới!
Tôi muốn cho bạn một câu hỏi quan trọng:
Sau khi ứng dụng hoạt động trong môi trường dành cho nhà phát triển, bạn phải sửa đổi bao nhiêu dòng mã để triển khai ứng dụng lên đám mây với tất cả thuộc tính cấp phát hành công khai do Cloud Run cung cấp?
Tất nhiên, câu trả lời là 0. :)
Các lớp học lập trình mà bạn nên tham khảo...
- Xây dựng Bot Slack bằng Node.js trên Cloud Run
- Kích hoạt Cloud Run bằng các sự kiện từ Eventarc
- Xin chào Cloud Run for Anthos Codelab
- Triển khai và chạy một vùng chứa bằng Cloud Run trên Node.js
- Các lớp học lập trình khác về Cloud Run
Khám phá các tính năng thú vị khác...
- Triển khai liên tục từ Git bằng Cloud Build
- Sử dụng các khoá bí mật trên Secret Manager
- Giới thiệu luồng hai chiều WebSockets, HTTP/2 và gRPC cho Cloud Run
- Các thực thể tối thiểu của Cloud Run: Giảm thiểu số lượt khởi động nguội không máy chủ
- Phân phát lưu lượng truy cập từ nhiều khu vực
Tài liệu tham khảo...
11. Kêu gọi hành động
Nếu bạn thích lớp học lập trình này và có thể sẽ dành nhiều thời gian hơn để thực hành Google Cloud, thì bạn nên Tham gia Google Cloud Innovators ngay hôm nay!
Google Cloud Innovators Miễn phí và bao gồm:
- Các buổi thảo luận trực tiếp, AMA và lộ trình học tập để trực tiếp tìm hiểu những thông tin mới nhất từ nhân viên của Google
- tin tức mới nhất về Google Cloud ngay trong hộp thư đến
- Huy hiệu kỹ thuật số và nền hội nghị truyền hình
- 500 tín dụng của các phòng thí nghiệm và học tập trên Skills Boost
Nhấp vào đây để đăng ký!