Hello Cloud Run(使用 Python [Streamlit])

1. 简介

96d07289bb51daa7.png

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

本教程的目标是创建一个“Hello World”Streamlit Web 应用并将其部署到 Cloud Run。

学习内容

  • 如何创建 Streamlit“Hello World”应用。
  • 在部署之前运行 Streamlit 应用来测试应用。
  • Cloud Buildpack 以及 requirements.txt 中存在 streamlit 如何实现无需 Dockerfile。
  • 如何将 Streamlit 应用部署到 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 控制台中,点击激活 Cloud Shell

3c1dabeca90e44e5.png

如果您是首次启动 Cloud Shell,系统会显示一个中间屏幕,其中描述了 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. 撰写申请

在此步骤中,您将构建一个“Hello World”Streamlit Python 应用,用于响应 HTTP 请求。

工作目录

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

mkdir ~/helloworld-streamlit && cd ~/helloworld-streamlit

main.py

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

touch main.py

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

10af7b1a6240e9f4.gif

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

cloudshell edit main.py

main.py

import streamlit as st

st.title("Hello World! 👋🌎")
st.markdown(
    """
    This is a demo Streamlit app.

    Enter your name in the text box below and press a button to see some fun features in Streamlit.
    """
)

name = st.text_input("Enter your name:")

# Use columns to create buttons side by side
col1, col2 = st.columns(2)

with col1:
    if st.button("Send balloons! 🎈"):
        st.balloons()
        st.write(f"Time to celebrate {name}! 🥳")
        st.write("You deployed a Streamlit app! 👏")

with col2:
    if st.button("Send snow! ❄️"):
        st.snow()
        st.write(f"Let it snow {name}! 🌨️")
        st.write("You deployed a Streamlit app! 👏")

此代码创建了一个基本 Web 服务,用于响应 HTTP GET 请求并返回一条友好的消息。

requirements.txt

重新打开终端,然后添加一个名为 requirements.txt 的文件来定义依赖项:

touch requirements.txt

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

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/streamlit
streamlit==1.47.0

Streamlit 应用已准备好部署,但我们先来测试一下...

5. 测试应用

如需测试应用,请使用 Cloud Shell 中预安装的 uv(Python 的极速软件包和项目管理器)。

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

uv venv

安装依赖项:

uv pip install -r requirements.txt

使用 streamlit run 启动应用(为进行测试而停用 --server.enableCORS,因为该标志会干扰 Cloud Shell):

uv run streamlit run main.py --server.port=8080 --server.enableCORS=false

日志将显示 Streamlit 应用正在运行:

You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8080
  Network URL: http://10.1.0.1:8080
  External URL: http://34.37.7.94:8080

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

6c9ff9e5c692c58e.gif

这应该会打开一个浏览器窗口,显示 Hello World! 👋🌎 标题。

helloworld-streamlit-app.png

尝试填写您的姓名,并测试屏幕上的两个按钮!

完成后,返回到主 Cloud Shell 会话,然后使用 CTRL+C 停止 Streamlit 应用。

应用运行正常:现在可以部署了...

6. 部署到 Cloud Run

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

REGION=europe-west1

确保您仍位于工作目录中:

ls

这应列出以下文件:

main.py  requirements.txt

在部署之前,请创建一个包含 .venv/.gcloudignore 文件。这样可以防止 Cloud Run 部署包含在本地测试期间从 uv 创建的虚拟环境。

使用以下命令创建 .gcloudignore

echo ".venv/" > .gcloudignore

将应用部署到 Cloud Run:

gcloud run deploy helloworld-streamlit \
  --source . \
  --region $REGION \
  --allow-unauthenticated
  • --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-streamlit \
  --region $REGION \
  --format "value(status.address.url)" \
)
echo $SERVICE_URL

这应该会显示类似以下内容:

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

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

helloworld-streamlit.gif

恭喜!您刚刚将应用部署到了 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-streamlit \
  --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

您已创建“Hello World”Streamlit Web 应用并将其部署到 Cloud Run!

所学内容

  • 如何创建 Streamlit“Hello World”应用。
  • 在部署之前运行 Streamlit 应用来测试应用。
  • Cloud Buildpack 以及 requirements.txt 中存在 streamlit 如何实现无需 Dockerfile。
  • 将 Streamlit 应用部署到 Cloud Run。

了解详情