本文档适用于希望构建自动化流水线以在 Google Cloud 组织中使用 Active Assist 的企业架构师和软件开发者。本文是系列文章中的一篇,介绍了企业可以使用 Active Assist 大规模优化云基础架构的架构模式。该系列包含以下部分:
- 大规模使用 Active Assist 的模式
- 将无服务器流水线与 Active Assist 搭配使用(本文档)
- 将 GKE Enterprise 工具链与 Active Assist 搭配使用
本教程介绍了如何使用 Google Cloud 无服务器技术构建自动化流水线来检索和处理 Active Assist 建议。建议以企业设置的业务规则为基础。您在本教程中设置的自动化流水线可帮助您大规模使用 Active Assist,同时仍可维护团队领导的审核和执行流程。当您的企业希望扩大 Active Assist 产品组合的使用,但想控制团队中审核和执行流程时,这种方法非常有用。它提供了使用持续集成和持续交付 (CI/CD) 流水线的替代方案。
本教程中展示的架构是通用的,您可以对其进行扩展,使其与其他无服务器产品配合使用。本教程假定您熟悉以下 Google Cloud 技术:
要完成本教程,您必须拥有 Slack 或类似通知或工单处理工具的账号。该工具必须在您的机器上设置并可以使用。
架构
由于本教程中展示的架构采用模块化设计,因此您可以根据自己的业务需求调整通知组件。本教程演示如何生成通知并将其发送到 Slack。您还可以选择向 Pub/Sub 或任何其他通知或工单处理工具发送通知。
以下架构图展示了您在本教程中使用的组件:
该架构包含以下组件:
- 调度程序以固定时间间隔触发的 Cloud Run 服务。该服务通过读取在 Firestore 集合中定义和保存的元数据(项目 ID 和 Recommender 类型)来调用 Recommender API。
- 推送和处理 Active Assist 建议的 Pub/Sub 主题。
- 第二个解析 Active Assist 建议的 Cloud Run 服务。此服务确定如何根据您的企业定义的业务规则并将其存储在 Firestore 集合中来处理。
- 两个 Firestore 集合,用于存储业务元数据和业务规则。Firestore 集合的工作原理如下:
- 第一个集合存储与检索 Active Assist 建议相关的业务元数据。在本教程中,
recommendation type
、Google Cloud project IDs
和locations
特性用作业务元数据。这些特性由 Cloud Run 服务recommendation-collector
用来确定提取哪些建议类型。 - 第二个集合用于存储处理建议时应用的业务规则。
- 第一个集合存储与检索 Active Assist 建议相关的业务元数据。在本教程中,
目标
- 创建示例 Cloud Run 服务,检索示例项目的 Active Assist 建议并将其推送到 Pub/Sub 主题。
- 创建两个 Firestore 集合,以分别存储示例元数据和业务规则。
- 创建第二个 Cloud Run 服务,以按照本教程中定义的示例业务规则处理建议。
- 创建一个 Slack 频道,供 Cloud Run 服务向其发送示例 Active Assist 建议。
- 使用 Active Assist 建议示例测试端到端流水线。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
-
In the Google Cloud console, go to the project selector page.
-
Select or create a Google Cloud project.
- 记下推荐管理器项目的 Google Cloud 项目 ID。在下一部分设置环境时,您将需要此 ID。
-
Enable the Cloud Build, Firestore, App Engine,Pub/Sub, Cloud Run, Cloud Scheduler, and Cloud Source Repositories APIs.
在本教程中,您将使用默认的应用凭据。如果系统提示您在向项目添加凭据页面上创建凭据,请点击取消。 -
Make sure that billing is enabled for your Google Cloud project.
-
创建以下代码:
- Slack 频道示例。
- 接收名为
recommendation-rules-engine
的引擎生成的通知的 Slack 应用和传入的网络钩子示例。在本教程的后面部分,您将设置引擎。
创建 Slack 应用和传入的网络钩子网址后,请记下本教程稍后所需的网址。
构建无服务器流水线
在本部分中,您将创建构建无服务器流水线所需的组件。平台会根据使用模式和系统指标生成 Active Assist 建议。根据生成的建议,每个建议类别可能使用与过去不同的默认时间段来分析使用情况数据和指标。
如果您的示例 Google Cloud 项目已有资源和 Active Assist 建议,则可以在对提供的示例代码进行适当的更改后,运行流水线来处理这些建议。
创建 Firestore 集合
在本部分,您将创建两个 Firestore 集合。第一个是 activeassist-metadata
集合,用于存储与检索 Active Assist 建议相关的业务元数据。第二个是 activeassist-business-rules
集合,用于存储流水线处理建议时应用的业务规则。
根据 Firestore 集合中的业务规则解析 Active Assist 建议时,会生成并发送通知,或者自动将建议应用于相关的 Google Cloud 资源。
创建 activeassist-metadata
集合
在 Google Cloud 控制台中,前往 Firestore 页面。
如果您还没有 Firestore 数据库,请创建一个。如果您已有 Firestore 数据库,请跳到下一步。
创建数据库:
- 点击选择原生模式以激活 Firestore。
- 选择靠近您的 Cloud Run 服务运行区域的区域位置。
- 点击创建数据库。完成配置需要一些时间。
在 Firestore 页面上,点击开始收集。
在集合 ID 字段中,输入以下内容:
activeassist-metadata
。填充下表中显示的字段。如需添加下一个字段,请点击添加字段。
字段名称 字段类型 字段值 备注 project
string
Stub-Project-ID
本教程使用字段值桩。如果您要使用现有 Google Cloud 项目中的建议,请改为输入项目 ID。 locations
array
global
某些建议可能特定于区域或特定于可用区,例如虚拟机合理容量建议。其他建议是全球性的建议,例如 IAM 建议。 recommenderType
string
google.iam.policy.Recommender
不适用。 填写字段后,点击保存。
创建 activeassist-business-rules
集合
- 点击开始收集。
在集合 ID 字段中,输入以下内容:
activeassist-business-rules
。填充下表中显示的文档。如需添加下一个字段,请点击添加字段。
字段名称 字段类型 字段值 备注 action
string
Notify
将值设置为 Apply
会使服务应用建议并移除未使用的角色。projectId
string
Stub-Project-ID
本教程使用桩建议。如果您要使用现有 Google Cloud 项目中的建议,请改为输入项目 ID。 projectNumber
string
999999999
本教程使用桩建议。
如果您要使用现有 Google Cloud 项目中的建议,请改为输入项目编号。您可以在 Google Cloud 控制台欢迎页面中找到项目编号recommenderType
string
google.iam.policy.Recommender
不适用。 recommenderSubtype
string
REMOVE_ROLE
不适用。 slackWebhookURL
string
输入您在上一步中生成的 Slack 网络钩子网址。 网址如下所示:
https://hooks.slack.com/services/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
本教程介绍如何构建规则以确定是自动应用建议,还是生成通知并将其发送到 Slack 等平台。如需了解如何根据您设置的示例业务规则的评估自动应用建议,请参阅关联的代码库。
文档填充后,点击保存。
创建已安排的 Cloud Run 服务
在本部分,您将创建一个名为 recommendation-collector
的预定 Cloud Run 服务,该服务会调用 Recommender API 并检索有效建议。本教程使用 Identity and Access Management Recommender API 作为 Recommender API。该服务会从您创建的 Firestore 集合 activeassist-metadata
中读取元数据,来确定要检索哪些建议。
点击在 Cloud Shell 中打开,以打开推荐管理器项目的 Cloud Shell。
Cloud Shell 打开后,将执行以下命令:
- GitHub 代码库克隆命令。
- 切换目录命令。
出现在 Cloud Shell 中打开对话框时,选择信任,然后点击确认。
将当前建议管理器项目的项目 ID 和项目编号设置为变量:
export RECO_MGR_PROJECT=PROJECT_ID gcloud config set project $RECO_MGR_PROJECT export RECO_MGR_PROJECT_NUMBER=$(gcloud projects describe $DEVSHELL_PROJECT_ID --format='value(projectNumber)')
将
PROJECT_ID
替换为项目 ID。输入命令后,请在看到提示时点击授权。为部署区域设置变量:
export REGION=us-central1
虽然本教程使用
us-central1
区域,但您可以使用任何提供 Cloud Run 的区域。为 Docker 映像创建环境变量:
export RECOMMENDER_IMAGE=gcr.io/$RECO_MGR_PROJECT/recommendation-collector:1.0
构建 Docker 映像,并将其上传到 Container Registry:
gcloud builds submit --tag $RECOMMENDER_IMAGE
创建
recommendation-collector
服务账号以与流水线中的其他 Google Cloud 服务进行交互:gcloud iam service-accounts create recommendation-collector-sa \ --description "Service Account that the recommendation-collector service uses to invoke other Google Cloud services" \ --display-name "recommendation-collector-sa" \ --project $RECO_MGR_PROJECT
最好为服务账号分配预定义角色,从而向 Cloud Run 服务授予精细权限。如需了解详情,请参阅服务身份。
向
recommendation-collector
服务的服务账号授予对 Firestore 和 Recommender API 的访问权限:gcloud projects add-iam-policy-binding $RECO_MGR_PROJECT \ --member serviceAccount:recommendation-collector-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \ --role roles/datastore.user gcloud projects add-iam-policy-binding $RECO_MGR_PROJECT \ --member serviceAccount:recommendation-collector-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \ --role roles/pubsub.publisher
如果您使用克隆的代码库中提供的示例
stub
运行本教程,请跳至下一步。如果您使用为现有 Google Cloud 项目生成的建议构建本教程中的流水线,则必须将 IAM 权限分配给您创建用来运行两个 Cloud Run 服务的服务账号。
将环境变量
TEST_PROJECT_ID
设置为您在运行命令之前为其运行此流水线的项目的 ID:export TEST_PROJECT_ID=TEST_PROJECT_ID gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \ --member serviceAccount:recommendation-collector-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \ --role roles/recommender.iamAdmin gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \ --member serviceAccount:recommendation-collector-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \ --role roles/serviceusage.serviceUsageConsumer gcloud services enable recommender.googleapis.com --project $TEST_PROJECT_ID
确保您使用的项目 ID 与您在创建 Firestore 集合中输入的项目 ID 一致。
在本教程中,您将使用名为
STUB_RECOMMENDATIONS
的环境变量部署该服务。通过此变量,您可以使用桩来测试流水线。部署 Cloud Run 服务:
gcloud run deploy recommendation-collector \ --image=$RECOMMENDER_IMAGE \ --no-allow-unauthenticated \ --region $REGION \ --platform managed \ --service-account recommendation-collector-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \ --set-env-vars="STUB_RECOMMENDATIONS=true" \ --project $RECO_MGR_PROJECT \
接受所有系统提示。
如果您要使用为 Google Cloud 项目生成的 Active Assist 建议运行流水线,请先从命令中移除以下行,然后再进行部署:
--set-env-vars="STUB_RECOMMENDATIONS=true"
设置 Cloud Scheduler 作业以运行 recommender-collector service
在 Cloud Shell 中,为 Cloud Scheduler 作业创建用于运行
recommendation-collector
服务的服务账号:gcloud iam service-accounts create recommender-scheduler-sa \ --description "Service Account used by Cloud Scheduler to invoke the recommender-parser service" \ --display-name "recommender-scheduler-sa" \ --project $RECO_MGR_PROJECT
向服务账号授予
run/invoker
角色,使其能够调用 Cloud Run 服务:gcloud run services add-iam-policy-binding recommendation-collector \ --member=serviceAccount:recommender-scheduler-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \ --role=roles/run.invoker \ --region=$REGION \ --platform=managed
获取
recommendation-collector
服务网址:export RECOMMENDER_SERVICE_URI=`gcloud run services describe recommendation-collector \ --platform managed \ --project $RECO_MGR_PROJECT \ --region $REGION \ --format="value(status.url)"`/run
创建名为
recommender-iam-scheduler
的 Cloud Scheduler 作业:gcloud scheduler jobs create http recommender-iam-scheduler \ --project $RECO_MGR_PROJECT \ --time-zone "America/Los_Angeles" \ --schedule="0 */3 * * *" \ --uri=$RECOMMENDER_SERVICE_URI \ --description="Scheduler job to invoke recommendation pipeline" \ --oidc-service-account-email="recommender-scheduler-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com" \ --headers="Content-Type=application/json" \ --http-method="POST"
将时区设置为与您所在的地理位置相符。时区值格式基于 tz 数据库。
如需了解详情,请参阅 gcloud scheduler jobs create http。
您的 Cloud Scheduler 作业会调用
recommendation-collector
服务的/run
路由。设置
--schedule="0 */3 * * *"
标志会每三小时运行一次 Scheduler 作业。您可以根据需要更改此设置。如需了解详情,请参阅配置 Cron 作业时间表。
创建推荐规则引擎以处理推荐
在本部分中,您将创建第二个名为 recommendation-rules-engine
的 Cloud Run 服务,以处理 recommendation-collector
服务收集的建议。当有新的推荐推送到 activeassist-recommendations
主题时,Pub/Sub 会调用 recommendation-rules-engine
服务。
此服务会根据您在 activeassist-business-rules
集合中定义的业务规则解析建议。
在 Cloud Shell 中,打开
recommendation-rules-engine
目录:cd ../recommendation-rules-engine
为 Docker 映像创建环境变量:
export RULES_ENGINE_IMAGE=gcr.io/$RECO_MGR_PROJECT/recommendation-rules-engine:1.0
构建 Docker 映像,并将其上传到 Container Registry:
gcloud builds submit --tag $RULES_ENGINE_IMAGE
创建
recommendation-rules-engine
服务账号以与流水线中的其他 Google Cloud 服务进行交互:gcloud iam service-accounts create recommendation-rules-sa \ --description "Service Account that recommendation-rules-engine uses to invoke other Google Cloud services" \ --display-name "recommendation-rules-sa" \ --project $RECO_MGR_PROJECT
向
recommendation-rules-engine
服务账号授予对 Firestore 的访问权限:gcloud projects add-iam-policy-binding $RECO_MGR_PROJECT \ --member serviceAccount:recommendation-rules-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \ --role roles/datastore.user
如果您使用的是本教程提供的存根,请继续执行下一步。
如果您使用为 Google Cloud 项目生成的建议(而非为本教程提供的桩)来测试流水线,请运行以下命令以允许规则引擎服务账号访问您的项目:
gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \ --member serviceAccount:recommendation-rules-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \ --role roles/serviceusage.serviceUsageConsumer gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \ --member serviceAccount:recommendation-rules-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \ --role roles/recommender.iamAdmin gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \ --member serviceAccount:recommendation-rules-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \ --role roles/resourcemanager.projectIamAdmin
部署 Cloud Run 服务:
gcloud run deploy recommendation-rules-engine \ --image=$RULES_ENGINE_IMAGE \ --no-allow-unauthenticated \ --region $REGION \ --platform managed \ --service-account recommendation-rules-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \ --project $RECO_MGR_PROJECT
接受所有系统提示。
获取
recommendation-rules-engine
网址:export RECOMMENDER_SERVICE_RULES_URI=`gcloud run services describe recommendation-rules-engine \ --platform managed \ --project $RECO_MGR_PROJECT \ --region $REGION \ --format="value(status.url)"`/process
在下一步中创建的 Pub/Sub 主题可以使用新建议时,系统就会调用您在此步骤中检索的网址。
创建 Pub/Sub 主题以获取有效建议
在本部分中,您将为 recommender-collector
服务通过调用 Recommender API 检索的 Active Assist 建议创建一个 Pub/Sub 主题。
在 Cloud Shell 中,创建 Pub/Sub 主题:
gcloud pubsub topics create activeassist-recommendations
为 Pub/Sub 创建用于调用
recommendation-rules-engine
Cloud Run 服务的服务账号:gcloud iam service-accounts create recommendation-engine-sub-sa \ --description "Service Account used by Pub/Sub to push recommendations to the recommendation-rules-engine service" \ --display-name "recommendation-engine-sub-sa" \ --project $RECO_MGR_PROJECT
Pub/Sub 服务账号必须与发布消息和调用
recommendation-rules-engine
服务所需的角色相关联:gcloud projects add-iam-policy-binding $RECO_MGR_PROJECT \ --member serviceAccount:recommendation-engine-sub-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \ --role roles/run.invoker \ --project $RECO_MGR_PROJECT
为 Pub/Sub 主题创建订阅
为
recommendation-rules-engine
服务创建订阅:# grant Pub/Sub the permission to create tokens PUBSUB_SERVICE_ACCOUNT="service-$RECO_MGR_PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding $RECO_MGR_PROJECT \ --member="serviceAccount:$PUBSUB_SERVICE_ACCOUNT"\ --role='roles/iam.serviceAccountTokenCreator' # configure the subscription push identity gcloud pubsub subscriptions create active-assist-recommendations-for-rules-engine \ --topic=activeassist-recommendations \ --topic-project=$RECO_MGR_PROJECT \ --push-auth-service-account=recommendation-engine-sub-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \ --ack-deadline=60 \ --push-endpoint=$RECOMMENDER_SERVICE_RULES_URI
允许您创建的
recommendation-engine-sub-sa
服务账号调用recommendation-rules-engine
服务:gcloud run services add-iam-policy-binding recommendation-rules-engine \ --member=serviceAccount:recommendation-engine-sub-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \ --role=roles/run.invoker \ --region=$REGION \ --platform=managed
使用桩运行端到端测试
Active Assist 建议由平台根据使用模式和系统指标生成。根据生成的建议,每个建议类别可能使用过去的不同默认时间段来分析使用情况数据和指标。例如,IAM 建议是由平台根据过去 90 天的使用模式生成的。
如需测试端到端流水线,您为本教程克隆的代码库提供了用于运行端到端流水线的示例建议(桩)。
在本部分中,您将执行以下操作:
- 检查桩建议。
- 手动调用流水线。
- 检查是否已生成通知并将其发送到您创建的 Slack 频道。
查看代码库中提供的示例建议:
cat ../recommendation-collector/stub.json
此文件为名为
roles/gkehub.connect
的示例角色提供带有REMOVE
操作的示例建议。执行以下命令,让 Cloud Scheduler 立即运行作业,而不是等待下一次计划运行:
gcloud scheduler jobs run recommender-iam-scheduler
在 Cloud Scheduler 控制台页面上,在
recommender-iam-scheduler
作业的结果列上验证结果是否是成功。如需详细了解每项服务执行的步骤,您还可以查看 Cloud Run 服务日志(针对
recommendation-collector
服务和recommendation-rules-engine
服务)。您在本教程中构建的无服务器端到端流水线成功运行后,会生成一则 Slack 通知,其中有建议移除的角色绑定的详细信息。下面是您收到的通知示例:
Project xxxxxxxx\ **Impact**: SECURITY\ This role has not been used during the observation window.\ **Role**: roles/gkehub.connect\ **Member**: serviceAccount:sample-sa@recommendation-sample.iam.gserviceaccount.com\ **Action**: remove
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
后续步骤
- 了解如何为“基础架构即代码”使用建议。
- 详细了解 Google Cloud 无服务器技术。
- 了解如何将 Policy Intelligence 建议集成到 IaC 流水线中。