Hello Cloud Run(使用 Python)

1. 简介

96d07289bb51daa7.png

Cloud Run 是一个代管式计算平台,供您运行可通过 HTTP 请求调用的无状态容器。它在 Knative 开源项目的基础上构建而成,支持跨平台移植工作负载。Cloud Run 采用无服务器设计:您不用管理基础架构,因此可全力专注于最重要的工作,即构建出色的应用。

本教程的目标是创建一个简单的 Web 应用并将其部署到 Cloud Run。

2. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时对其进行更新。
  • 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用 PROJECT_ID 标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。
  • 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除项目。Google Cloud 新用户符合参与 300 美元免费试用计划的条件。

启动 Cloud Shell

虽然 Google Cloud 可以通过笔记本电脑远程运行,但在本教程中,您将使用 Cloud Shell,这是一个在云端运行的命令行环境。

激活 Cloud Shell

  1. 在 Cloud Console 中,点击激活 Cloud Shell853e55310c205094

3c1dabeca90e44e5

如果这是您第一次启动 Cloud Shell,系统会显示一个中间屏幕,说明它是什么。如果您看到中间屏幕,请点击继续

9c92662c6a846a5c

预配和连接到 Cloud Shell 只需花几分钟时间。

9f0e51b578fecce5

这个虚拟机装有所需的所有开发工具。它提供了一个持久的 5 GB 主目录,并在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。您在此 Codelab 中的大部分(即使不是全部)工作都可以通过浏览器完成。

在连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设为您的项目 ID。

  1. 在 Cloud Shell 中运行以下命令以确认您已通过身份验证:
gcloud auth list

命令输出

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. 在 Cloud Shell 中运行以下命令,以确认 gcloud 命令了解您的项目:
gcloud config list project

命令输出

[core]
project = <PROJECT_ID>

如果不是上述结果,您可以使用以下命令进行设置:

gcloud config set project <PROJECT_ID>

命令输出

Updated property [core/project].

3. 启用 API

在 Cloud Shell 中,启用 Artifact Registry、Cloud Build 和 Cloud Run API:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com

这会输出如下所示的成功消息:

Operation "operations/..." finished successfully.

现在,您可以开始工作并编写应用了...

4. 编写应用

在此步骤中,您将构建一个基于 Flask 的简单 Python 应用来响应 HTTP 请求。

工作目录

使用 Cloud Shell 创建一个名为 helloworld-python 的工作目录并切换到该目录:

mkdir ~/helloworld-python
cd ~/helloworld-python

main.py

创建一个名为 main.py 的文件:

touch main.py

使用您偏好的命令行编辑器(nano、vim 或 emacs)修改文件,或点击 Cloud Shell Editor 按钮:

10af7b1a6240e9f4.gif

如需使用 Cloud Shell Editor 直接修改文件,请使用以下命令:

cloudshell edit main.py

main.py

from flask import Flask, request

app = Flask(__name__)


@app.get("/")
def hello():
    """Return a friendly HTTP greeting."""
    who = request.args.get("who", default="World")
    return f"Hello {who}!\n"


if __name__ == "__main__":
    # Development only: run "python main.py" and open http://localhost:8080
    # When deploying to Cloud Run, a production-grade WSGI HTTP server,
    # such as Gunicorn, will serve the app.
    app.run(host="localhost", port=8080, debug=True)

此代码会创建一个基本 Web 服务,以友好的消息的形式响应 HTTP GET 请求。

requirements.txt

添加一个名为 requirements.txt 的文件以定义依赖项:

touch requirements.txt

如需使用 Cloud Shell Editor 直接修改文件,请使用以下命令:

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/flask
Flask==3.0.2

# https://pypi.org/project/gunicorn
gunicorn==21.2.0

Procfile

最后,添加一个名为 Procfile 的文件,以指定提供应用的方式:

touch Procfile

如需使用 Cloud Shell Editor 直接修改文件,请使用以下命令:

cloudshell edit Procfile

Procfile

web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

确保所有文件都位于工作目录下:

ls

其中应列出以下文件:

main.py  Procfile  requirements.txt

您的应用已准备好进行部署,但我们先对其进行测试...

5. 测试应用

如需测试应用,请创建一个虚拟环境:

virtualenv venv

激活此虚拟环境:

source venv/bin/activate

安装依赖项:

pip install -r requirements.txt

您应该会收到如下所示的确认消息:

...
Successfully installed Flask ... gunicorn ...

启动应用:

python main.py

日志显示您处于开发模式:

 * Serving Flask app 'main'
 * Debug mode: on
   WARNING: This is a development server.
   Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Running on http://localhost:8080
   Press CTRL+C to quit
...

在 Cloud Shell 窗口中,点击 Web Preview 图标并选择 Preview on port 8080

6c9ff9e5c692c58e.gif

这应该会打开一个显示 Hello World! 消息的浏览器窗口。

您还可以打开另一个 Cloud Shell 会话(新的终端标签页),方法是点击 + 图标并向本地运行的应用发送 Web 请求:

curl localhost:8080

您应该会收到以下解答:

Hello World!

完成后,返回 Cloud Shell 主会话并使用 CTRL+C 停止 python main.py 命令。

退出虚拟环境:

deactivate

最后,移除虚拟环境目录:

rm -r venv/

您的应用运行正常:我们来部署它...

6. 部署到 Cloud Run

Cloud Run 是区域级的,这意味着运行 Cloud Run 服务的基础架构位于特定区域并由 Google 托管,以便在该区域内的所有可用区以冗余方式提供。定义将用于部署的区域,例如:

REGION="europe-west9"

确保您仍在工作目录中:

ls

其中应列出以下文件:

main.py  Procfile  requirements.txt

将应用部署到 Cloud Run:

gcloud run deploy helloworld-python \
  --source . \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated
  • 您可以使用以下命令定义默认区域:gcloud config set run/region $REGION
  • 您还可以使用以下命令将 Cloud Run 设为默认托管:gcloud config set run/platform managed
  • --allow-unauthenticated 选项可公开提供该服务。为避免出现未经身份验证的请求,请改用 --no-allow-unauthenticated

第一次,您会收到创建 Artifact Registry 代码库的提示。点按 Enter 键即可验证:

Deploying from source requires an Artifact Registry Docker repository to store
built containers. A repository named [cloud-run-source-deploy] in region [REGION]
will be created.

Do you want to continue (Y/n)?

这会启动将源代码上传到 Artifact Registry 代码库并构建容器映像的过程:

Building using Buildpacks and deploying container ...
* Building and deploying new service... Building Container.           
  OK Creating Container Repository...
  OK Uploading sources...
  * Building Container... Logs are available at ...

然后,等待部署完成。成功部署后,命令行中便会显示该服务的网址:

...
OK Building and deploying new service... Done.
  OK Creating Container Repository...
  OK Uploading sources...
  OK Building Container... Logs are available at ...
  OK Creating Revision... Creating Service.
  OK Routing traffic...
  OK Setting IAM Policy...
Done.
Service [SERVICE]... has been deployed and is serving 100 percent of traffic.
Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app

您可以通过以下命令获取服务网址:

SERVICE_URL=$( \
  gcloud run services describe helloworld-python \
  --platform managed \
  --region $REGION \
  --format "value(status.url)" \
)
echo $SERVICE_URL

显示的内容应如下所示:

https://helloworld-python-PROJECTHASH-REGIONID.a.run.app

现在,您可以通过在网络浏览器中打开该服务网址来使用您的应用:

c836b93e5601e2cf.gif

您还可以从 Cloud Shell 调用应用:

curl $SERVICE_URL?who=me

这应该会显示预期的问候语:

Hello me!

恭喜!您刚刚向 Cloud Run 部署了一个应用。Cloud Run 可以对您的容器映像进行自动横向扩容以处理收到的请求,并在需求减少时缩容。您只需为在处理请求期间消耗的 CPU、内存和网络付费。

7. 清理

虽然 Cloud Run 不会对未在使用中的服务收费,但您可能仍然需要为在 Artifact Registry 中存储容器映像付费。为避免产生费用,您可以删除代码库或删除 Cloud 项目。删除 Cloud 项目后,系统即会停止对该项目中使用的所有资源计费。

如需删除容器映像存储库,请执行以下操作:

gcloud artifacts repositories delete cloud-run-source-deploy \
  --location $REGION

如需删除 Cloud Run 服务,请执行以下操作:

gcloud run services delete helloworld-python \
  --platform managed \
  --region $REGION

如需删除您的 Google Cloud 项目,请执行以下操作:

  1. 检索当前的项目 ID:
PROJECT_ID=$(gcloud config get-value core/project)
  1. 确保这是您要删除的项目:
echo $PROJECT_ID
  1. 删除项目:
gcloud projects delete $PROJECT_ID

8. 恭喜!

96d07289bb51daa7.png

您创建了一个简单的 Web 应用并将其部署到 Cloud Run!

了解详情

许可

此作品已获得 Creative Commons Attribution 2.0 通用许可授权。