1. 概览
本实验将向您展示如何限制对 Cloud Run 服务的访问,并仅允许来自本地运行的工作负载或项目 VPC 中运行的工作负载的请求。您可以使用两层访问权限控制:入站流量设置和 Identity and Access Management (IAM) 政策。

入站流量设置
通过 Ingress 设置,您可以根据请求的网络来源(内部或外部)过滤请求。默认情况下,系统允许所有请求通过,包括来自公共互联网的请求。
IAM 政策
借助 IAM 政策,您可以根据发送者的身份过滤请求,并且通常使用 IAM 政策对服务到服务的请求进行身份验证。
在本实验中,您将学习如何以及何时使用入站设置。
本地主机通过 VPC 进行连接
在本实验中,我们将模拟本地工作负载。如需将本地主机连接到 Cloud Run,您需要配置 适用于本地主机的专用 Google 访问通道。这包括在 VPC 网络中设置 Cloud VPN 网关,如下所示。

使用 VPC 中的跳跃服务器模拟本地工作负载
在本实验中,您将通过从 VPC 中的 Compute Engine 虚拟机发送请求来模拟从本地主机发送请求,如图所示。

您将用作跳转服务器的 Compute Engine 虚拟机与 Cloud VPN 网关具有相同的网络来源,因此您可以使用该虚拟机来模拟从本地工作负载发送请求。
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 USD 免费试用计划的条件。
环境设置
- 设置一个环境变量,用于存储项目 ID,以便在后续命令中使用:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ZONE=us-central1-a
- 启用执行本实验所需的 API。
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
compute.googleapis.com \
artifactregistry.googleapis.com
- 克隆示例应用代码库并前往相应目录
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
cd cymbal-eats/partner-registration-service
- 为 Compute Engine 和 Cloud Run 设置默认地区和可用区
gcloud config set compute/region ${REGION}
gcloud config set run/region ${REGION}
gcloud config set compute/zone ${ZONE}
3. 部署服务
您将首先部署服务,并使其可公开访问。在您验证可以从浏览器发送请求后,我们会锁定服务,仅允许来自内部网络来源的请求。
运行以下命令时,请遵循以下说明:
- 源代码位置信息 (...):验证您是否位于 partner-registration-service 目录中,然后按 Enter 键接受默认设置
- 服务名称 (partner-registration-service):按 Enter 键接受默认值
- 是否允许未经身份验证的调用 [partner-registration-service] (y/N)?是
gcloud run deploy
此命令完成后,系统会列出 Cloud Run 服务的网址。输出将类似于以下列表:
Service [partner-registration-service] revision [partner-registration-service-00001-haz] has been deployed and is serving 100 percent of traffic. Service URL: https://partner-registration-service-ssssssssss-uc.a.run.app
在浏览器中打开服务网址。您应该会看到以下输出:
Partner registration service: RUNNING
将服务设置为仅允许内部请求
现在,您将使用 Cloud Run 服务的入站流量设置,以仅允许来自内部来源的请求。内部来源包括与 Cloud Run 服务位于同一项目(或 VPC Service Controls 边界)内的 VPC 网络中的资源,这非常适合我们的使用情形。
此外,来自其他 Google Cloud 产品的请求会被视为内部请求,即使这些产品不属于 VPC。这些产品包括 Pub/Sub 和 Workflows 等。
来自这些来源的请求会保留在 Google 网络中,即使它们通过 run.app 网址访问您的服务也是如此,并且禁止公开访问。
更新服务以仅允许内部请求:
gcloud run services update partner-registration-service --ingress=internal
如果您再次打开服务网址,系统会显示“Error: Forbidden - Access is forbidden”(错误:禁止 - 禁止访问)
由于浏览器是从外部网络来源(而非 Google Cloud 项目的内部来源)发送请求,因此这正是您预期的行为。您的服务现在更安全了。
4. 创建 Compute Engine 虚拟机作为跳转服务器
下一步是通过 Cloud VPN 网关模拟来自本地服务器的请求,方法是在 VPC 中创建一个 Compute Engine 实例作为跳板服务器:
gcloud compute instances create jump-server --scopes=https://www.googleapis.com/auth/cloud-platform
此命令的输出应类似于以下内容:
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS jump-server us-central1-a n1-standard-1 10.128.0.10 34.170.108.8 RUNNING
从 Compute Engine 实例向服务发送请求
现在,您将在虚拟机上打开一个终端,并直接从 VPC 网络中的虚拟机发送请求。
如果以下命令提示您在 Cloud Shell 中设置 SSH,请按照说明操作:
gcloud compute ssh jump-server
使用以下命令获取 Cloud Run 服务的网址:
gcloud run services describe partner-registration-service --region us-central1
输出的前几行应如下所示:
✔ Service partner-registration-service in region us-central1 URL: https://partner-registration-service-ssssssssss-uc.a.run.app Ingress: internal
现在,复制该网址,然后使用 curl 从 Compute Engine 实例发送请求。此请求应会成功,因为虚拟机实例在项目的 VPC 网络中运行,属于内部来源。
export SERVICE_URL=https://
curl ${SERVICE_URL}
输出应如下所示:
Partner registration service: RUNNING
5. 基于 IAM 的访问权限控制呢?
本实验介绍了如何以及何时使用入站设置。如果您要将本地工作负载连接到 Cloud Run,那么 Ingress 设置是个不错的开端。
基于 IAM 的访问权限控制需要付出更多实现工作,尤其是在您从本地主机进行调用时:
- IAM 要求您在宿主上管理长期有效的服务账号凭据
- IAM 需要进行代码更改,才能使用服务账号凭据对请求进行签名。
Google 建议采用多层访问权限控制方法。使用入站流量设置将访问权限限制为仅限内部主机,这是很好的第一步,但不要止步于此!
6. 恭喜!
恭喜,您已完成此 Codelab!
后续步骤:
探索其他 Cymbal Eats Codelab:
- 使用 Eventarc 触发 Cloud Workflows
- 触发 Cloud Storage 中的事件处理
- 从 Cloud Run 连接到专用 CloudSQL
- 从 Cloud Run 连接到全代管式数据库
- 使用 Identity Aware Proxy (IAP) 保护无服务器应用
- 使用 Cloud Scheduler 触发 Cloud Run 作业
- 安全地部署到 Cloud Run
- 从 GKE Autopilot 连接到专用 AlloyDB
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
若要避免产生费用,最简单的方法是删除您为本教程创建的项目。
实用参考
以下是一些有助于您详细了解 Cloud Run 上两层访问权限控制的其他资源。