1. 简介
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. 设置和要求
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。
- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用
PROJECT_ID
标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。 - 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除项目。Google Cloud 新用户符合参与 300 美元免费试用计划的条件。
启动 Cloud Shell
虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此教程中,您将使用 Cloud Shell,这是一个在云端运行的命令行环境。
激活 Cloud Shell
- 在 Cloud 控制台中,点击激活 Cloud Shell
如果您是首次启动 Cloud Shell,系统会显示一个中间屏幕,其中描述了 Cloud Shell 的用途。如果您看到了中间屏幕,请点击继续。
预配和连接到 Cloud Shell 只需花几分钟时间。
这个虚拟机已加载了所需的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证。只需使用一个浏览器即可完成本 Codelab 中的大部分工作。
连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID。
- 在 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`
- 在 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 编辑器按钮来修改文件:
如需使用 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
:
这应该会打开一个浏览器窗口,显示 Hello World! 👋🌎
标题。
尝试填写您的姓名,并测试屏幕上的两个按钮!
完成后,返回到主 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 浏览器中打开服务网址,使用您的应用:
恭喜!您刚刚将应用部署到了 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 项目,请执行以下操作:
- 检索当前项目 ID:
PROJECT_ID=$(gcloud config get-value core/project)
- 请确保这是您要删除的项目:
echo $PROJECT_ID
- 删除项目:
gcloud projects delete $PROJECT_ID
8. 恭喜!
您已创建“Hello World”Streamlit Web 应用并将其部署到 Cloud Run!
所学内容
- 如何创建 Streamlit“Hello World”应用。
- 在部署之前运行 Streamlit 应用来测试应用。
- Cloud Buildpack 以及
requirements.txt
中存在streamlit
如何实现无需 Dockerfile。 - 将 Streamlit 应用部署到 Cloud Run。
了解详情
- 查看 Cloud Run 文档
- 完成使用 Cloud Run 轻松实现从开发到生产的三步流程,探索更多选项
- 完成 Cloud Run 上的 Django,以创建 Cloud SQL 数据库、使用 Secret Manager 管理凭据并部署 Django
- 查看更多 Cloud Run Codelab…