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

3c1dabeca90e44e5.png

如果您是第一次启动 Cloud Shell,系统会显示一个介绍其功能的过渡页面。如果您看到了过渡页面,请点击继续

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

这个虚拟机已加载了所需的所有开发工具。它提供了一个持久的 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 API、Cloud Build API 和 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 编辑器按钮:

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! 消息的浏览器窗口。

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

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

现在,您可以在 Web 浏览器中打开服务网址,使用您的应用:

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 通用许可授权。