在本教程中,您将使用 Cloud Run 服务中的 Google Cloud CLI 创建一系列 Cloud Run 服务。您可以先将在本教程学到的知识应用到现有的 Cloud 操作脚本或构建概念验证,再使用客户端库构建更稳健的服务。
在 Web 服务中,您可以像使用任何 Shell 脚本一样使用 gcloud CLI,例如,如 Shell 快速入门中所示。在 Cloud Run 上,这两个工具均会通过自动向 Cloud Run 服务身份进行身份验证来使用 Cloud de Confiance by S3NS服务。gcloud CLI 可使用为服务身份授予的所有权限。
gcloud CLI 能够广泛用于跨 Cloud de Confiance by S3NS 收集信息和管理资源,使得在 Web 服务中使用它的挑战可将调用者误用这些功能的风险降至最低。 如果没有安全控制,则通过允许无意或有意的恶意活动会对在同一项目中运行的其他服务或资源造成风险。这些风险的示例包括:
- 允许发现专用虚拟机的 IP 地址
- 从同一项目的数据库启用对私有数据的访问
- 允许删除其他正在运行的服务
本教程中的几个步骤展示了如何实施控制以最大限度地降低风险,例如指定要在代码中运行的 gcloud 命令,而不是打开以允许用户输入。
在 Cloud Run 服务中,使用命令行工具编写脚本类似于在本地使用命令行。主要区别在于应该围绕主要脚本逻辑添加的附加限制。
目标
- 使用 Dockerfile 编写并构建一个自定义容器
- 编写、构建并部署 Cloud Run 服务
- 在 Web 服务中安全地使用 gcloud CLI
- 生成 Cloud Run 服务报告并保存到 Cloud Storage
费用
在本文档中,您将使用 Cloud de Confiance by S3NS的以下收费组件:
准备工作
-
In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Cloud de Confiance project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. - 安装并初始化 gcloud CLI。
-
Cloud Build Editor (
roles/cloudbuild.builds.editor) -
Cloud Run Admin (
roles/run.admin) -
Create Service Accounts (
roles/iam.serviceAccountCreator) -
Project IAM Admin (
roles/resourcemanager.projectIamAdmin) -
Service Account User (
roles/iam.serviceAccountUser) -
Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer) -
Storage Admin (
roles/storage.admin)
所需的角色
如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
设置 gcloud 默认值
要配置您的 Cloud Run 服务的 gcloud 默认值,请执行以下操作:
设置默认项目:
gcloud config set project PROJECT_ID
将 PROJECT_ID 替换为您在本教程中创建的项目的名称。
为您选择的区域配置 gcloud:
gcloud config set run/region REGION
将 REGION 替换为您选择的受支持的 Cloud Run 区域。
Cloud Run 位置
Cloud Run 是区域级的,这意味着运行 Cloud Run 服务的基础架构位于特定区域,并且由 Google 代管,以便在该区域内的所有可用区以冗余方式提供。
选择用于运行 Cloud Run 服务的区域时,主要考虑该区域能否满足您的延迟时间、可用性或耐用性要求。通常,您可以选择距离用户最近的区域,但除此之外,您还应该考虑 Cloud Run 服务使用的其他 Cloud de Confiance产品的位置。跨多个位置使用 Cloud de Confiance 产品可能会影响服务的延迟时间和费用。
Cloud Run 可在以下区域使用:
基于层级 1 价格
asia-east1(台湾)asia-northeast1(东京)asia-northeast2(大阪)asia-south1(印度孟买)europe-north1(芬兰)二氧化碳排放量低
europe-north2(斯德哥尔摩)二氧化碳排放量低
europe-southwest1(马德里)二氧化碳排放量低
europe-west1(比利时)二氧化碳排放量低
europe-west4(荷兰)二氧化碳排放量低
europe-west8(米兰)europe-west9(巴黎)二氧化碳排放量低
me-west1(特拉维夫)northamerica-south1(墨西哥)us-central1(爱荷华)二氧化碳排放量低
us-east1(南卡罗来纳)us-east4(北弗吉尼亚)us-east5(哥伦布)us-south1(达拉斯)二氧化碳排放量低
us-west1(俄勒冈)二氧化碳排放量低
基于层级 2 价格
africa-south1(约翰内斯堡)asia-east2(香港)asia-northeast3(韩国首尔)asia-southeast1(新加坡)asia-southeast2(雅加达)asia-south2(印度德里)australia-southeast1(悉尼)australia-southeast2(墨尔本)europe-central2(波兰,华沙)europe-west10(柏林)europe-west12(都灵)europe-west2(英国伦敦)二氧化碳排放量低
europe-west3(德国法兰克福)europe-west6(瑞士苏黎世)二氧化碳排放量低
me-central1(多哈)me-central2(达曼)northamerica-northeast1(蒙特利尔)二氧化碳排放量低
northamerica-northeast2(多伦多)二氧化碳排放量低
southamerica-east1(巴西圣保罗)二氧化碳排放量低
southamerica-west1(智利圣地亚哥)二氧化碳排放量低
us-west2(洛杉矶)us-west3(盐湖城)us-west4(拉斯维加斯)
如果您已创建 Cloud Run 服务,可在Cloud de Confiance 控制台的 Cloud Run 信息中心内查看区域。
检索代码示例
如需检索可用的代码示例,请执行以下操作:
将示例应用代码库克隆到本地机器:
git clone https://github.com/GoogleCloudPlatform/cloud-run-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
切换到包含 Cloud Run 示例代码的目录:
cd cloud-run-samples/gcloud-report/
查看代码
本部分包含有关您检索到的代码示例的信息。
生成报告并将其上传到 Cloud Storage
此 Shell 脚本会在当前项目和区域中生成 Cloud Run 服务报告,并将结果上传到 Cloud Storage。它列出名称包含提供的字符串 search 参数的服务。
该脚本使用 gcloud run services list 命令、gcloud 高级格式选项和 gcloud 流式传输复制模式。
此脚本可以安全地作为服务运行,因为重复调用它会更新报告,而不会进一步增加代价高昂的流失。使用 gcloud CLI 的其他脚本在重复调用时费用可能较高(例如创建新的 Cloud 资源或执行费用高昂的任务)。幂等脚本会在重复调用中产生相同的结果,因此可以更安全地作为服务运行。
在 HTTP 请求中调用脚本
此 Go 代码将创建一个 Web 服务,该服务运行 shell 脚本以生成报告。由于搜索查询是用户输入,因此代码会进行验证以确保它仅包含字母、数字或连字符,以防止将恶意命令作为输入。这组字符集的范围足够小,可防止命令注入攻击。
Web 服务将搜索参数作为参数传递给 Shell 脚本。
go.mod 文件会在 go 模块中声明应用依赖项:
定义容器环境
Dockerfile 定义如何合并环境以用于服务。它与 helloworld-shell 快速入门中的 Dockerfile 类似,不同之处在于最终容器映像基于 gcloud Google Cloud CLI 映像。这样,您的服务便可以使用 gcloud,而无需执行 Google Cloud CLI 的自定义安装和配置步骤。
创建 Artifact Registry 标准制品库
创建 Artifact Registry 标准制品库以存储您的容器映像:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=REGION
您需要进行如下替换:
- 将 REPOSITORY 替换为制品库的唯一名称。
- 将 REGION 替换为 Artifact Registry 的 Cloud de Confiance by S3NS 区域。
设置 Cloud Storage 存储桶
创建一个 Cloud Storage 存储桶以上传报告:
gcloud storage buckets create gs://REPORT_ARCHIVE_BUCKET
将 REPORT_ARCHIVE_BUCKET 替换为全局唯一的存储桶名称。
设置服务身份
为了限制服务对其他基础架构所拥有的权限,您需要创建服务身份并自定义执行工作所需的特定 IAM 权限。
在本示例中,必需的权限是读取 Cloud Run 服务以及读取和写入 Cloud Storage 存储桶的权限。
创建服务账号:
gcloud iam service-accounts create gcloud-report-identity
向服务账号授予读取 Cloud Run 服务的权限:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:gcloud-report-identity@PROJECT_ID.s3ns.iam.gserviceaccount.com \ --role roles/run.viewer
向服务账号授予读取和写入 Cloud Storage 存储桶的权限:
gcloud storage buckets add-iam-policy-binding gs://REPORT_ARCHIVE_BUCKET \ --member=serviceAccount:gcloud-report-identity@PROJECT_ID.s3ns.iam.gserviceaccount.com \ --role=roles/storage.objectUser
此自定义服务身份的有限访问权限不允许服务访问其他 Cloud de Confiance by S3NS 资源。
交付服务
发布代码包含三个步骤:
- 使用 Cloud Build 构建容器映像
- 将容器映像上传到 Artifact Registry
- 将容器映像部署到 Cloud Run。
如需交付代码,请执行以下操作:
构建容器并将其发布到 Artifact Registry 上:
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/gcloud-report
您需要进行如下替换:
- 将 PROJECT_ID 替换为您的 Cloud de Confiance 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为 Artifact Registry 的 Cloud de Confiance by S3NS 区域。
gcloud-report是服务的名称。成功完成后,“成功”消息会显示 ID、创建时间和映像名称。该映像存储在 Artifact Registry 中,并可根据需要重复使用。
运行以下命令来部署您的服务:
gcloud run deploy gcloud-report \ --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/gcloud-report \ --update-env-vars GCLOUD_REPORT_BUCKET=REPORT_ARCHIVE_BUCKET \ --service-account gcloud-report-identity \ --no-allow-unauthenticated
您需要进行如下替换:
- 将 PROJECT_ID 替换为您的 Cloud de Confiance 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为服务的 Cloud de Confiance by S3NS 区域。
gcloud-report是容器名称和服务名称的一部分。容器映像会部署到您之前在设置 gcloud 下配置的服务和区域 (Cloud Run)。--no-allow-unauthenticated标志限制对服务的公开访问权限。通过将该服务保留为不公开状态,您可以依赖 Cloud Run 的内置身份验证来阻止未经授权的请求。如需详细了解基于 Identity and Access Management (IAM) 的身份验证,请参阅使用 IAM 管理访问权限。等待部署完成。此过程可能需要半分钟左右的时间。成功完成时,命令行会显示服务网址。
如果要将代码更新部署到该服务,请重复执行上述步骤。向服务执行的每次部署都会创建一个新的修订版本,该修订版本准备就绪后会自动开始处理流量。
如需了解如何授予 Cloud de Confiance 用户调用此服务的权限,请参阅使用 IAM 管理访问权限。项目编辑者和所有者自动拥有此权限。
生成报告
如需生成 Cloud Run 服务的报告,请执行以下操作:
使用 curl 发送经过身份验证的请求:
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL
完成部署后,将 SERVICE_URL 替换为 Cloud Run 提供的网址。
如果您创建了新项目并按照本教程进行操作,输出将类似于以下内容:
Wrote report to gs://REPORT_ARCHIVE_BUCKET/report-.-DATE.txt
文件名中的
.是源代码中包含的默认搜索参数。如需使用搜索功能,请在请求中添加
search参数:curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL?search=gcloud
此查询将返回如下所示的输出:
Wrote report to gs://REPORT_ARCHIVE_BUCKET/report-gcloud-DATE.txt
在本地使用 gcloud CLI 检索文件:
gcloud storage cp gs://REPORT_FILE_NAME .
此命令中的
.表示当前工作目录。将 REPORT_FILE_NAME 替换为上一步中的 Cloud Storage 对象名称输出。
打开该文件即可查看报告。该属性应如下所示:
提高稳健性以满足未来需要
如果您打算进一步开发此服务,请考虑采用更为完善的编程语言重写并使用 Cloud Run Admin API 和 Cloud Storage 客户端库。
您可以通过将 --log-http 添加到 gcloud CLI 命令来检查要进行的 API 调用(以及查看某些身份验证详细信息)。
自动执行此操作
现在,Cloud Run 服务报告可由 HTTP 请求触发,您可以在需要时使用自动化功能自动生成:
- 使用 Cloud Scheduler 按计划运行此服务
- 使用 Google Tasks 将报告创建为已加入队列的任务或安排在将来运行
清理
为避免您的 Cloud de Confiance by S3NS 账号产生额外费用,请删除您在本教程中部署的所有资源。
删除项目
如果您为本教程创建了一个新项目,请删除项目。 如果您使用的是某个现有项目,并且需要保留此项目但不保留在本教程中所做的更改,请删除为本教程创建的资源。
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
要删除项目,请执行以下操作:
- In the Cloud de Confiance console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
删除教程资源
删除您在本教程中部署的 Cloud Run 服务。Cloud Run 服务在收到请求之前不会产生费用。
如需删除 Cloud Run 服务,请运行以下命令:
gcloud run services delete SERVICE-NAME
将 SERVICE-NAME 替换为服务的名称。
您还可以通过Cloud de Confiance 控制台删除 Cloud Run 服务。
移除您在教程设置过程中添加的
gcloud默认区域配置:gcloud config unset run/region移除项目配置:
gcloud config unset project删除在本教程中创建的其他 Cloud de Confiance 资源:
后续步骤
- 通过使用 API 调用替换 gcloud CLI 命令来减少服务的依赖项:上传对象、Cloud Run Admin API 参考文档
- 通过使用网络入站流量控制限制对服务的访问,进一步增强安全性。
- 探索有关 Google Cloud 的参考架构、图表和最佳实践。查看我们的 Cloud 架构中心。