将无服务器流水线与 Active Assist 搭配使用

本文档适用于希望构建自动化流水线以在 Google Cloud 组织中使用 Active Assist 的企业架构师和软件开发者。本文是系列文章中的一篇,介绍了企业可以使用 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 typeGoogle Cloud project IDslocations 特性用作业务元数据。这些特性由 Cloud Run 服务 recommendation-collector 用来确定提取哪些建议类型。
    • 第二个集合用于存储处理建议时应用的业务规则。

目标

  • 创建示例 Cloud Run 服务,检索示例项目的 Active Assist 建议并将其推送到 Pub/Sub 主题。
  • 创建两个 Firestore 集合,以分别存储示例元数据和业务规则。
  • 创建第二个 Cloud Run 服务,以按照本教程中定义的示例业务规则处理建议。
  • 创建一个 Slack 频道,供 Cloud Run 服务向其发送示例 Active Assist 建议。
  • 使用 Active Assist 建议示例测试端到端流水线。

费用

本教程使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用量来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 在 Google Cloud Console 中,转到项目选择器页面。

    转到“项目选择器”

  2. 选择或创建 Google Cloud 项目。

  3. 记下推荐管理器项目的 Google Cloud 项目 ID。在下一部分设置环境时,您将需要此 ID。
  4. 启用 Cloud Build、Firestore、App Engine、Pub/Sub、Cloud Run、Cloud Scheduler 和 Cloud Source Repositories API。

    启用 API

    使用默认应用凭据教程。如果系统提示您在向项目添加凭据页面上创建凭据,请点击取消
  5. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  6. 创建以下代码:
    • Slack 频道示例。
    • 接收名为 recommendation-rules-engine 的引擎生成的通知的 Slack 应用和传入的网络钩子示例。在本教程的后面部分,您将设置引擎。
    如需了解详情,请参阅创建 Slack 频道使用传入的网络钩子发送消息

    创建 Slack 应用和传入的网络钩子网址后,请记下本教程稍后所需的网址。

构建无服务器流水线

在本部分中,您将创建构建无服务器流水线所需的组件。平台会根据使用模式和系统指标生成 Active Assist 建议。根据生成的建议,每个建议类别可能使用与过去不同的默认时间段来分析使用情况数据和指标。

如果您的示例 Cloud 项目已有资源和 Active Assist 建议,则可以在对提供的示例代码进行适当的更改后,运行流水线来处理这些建议。

创建 Firestore 集合

在本部分,您将创建两个 Firestore 集合。第一个是 activeassist-metadata 集合,用于存储与检索 Active Assist 建议相关的业务元数据。第二个是 activeassist-business-rules 集合,用于存储流水线处理建议时应用的业务规则。

根据 Firestore 集合中的业务规则解析 Active Assist 建议时,会生成并发送通知,或者自动将建议应用于相关的 Google Cloud 资源。

创建 activeassist-metadata 集合

  1. 在 Google Cloud Console 中,转到 Firestore 页面。

    打开 Firestore

  2. 如果您还没有 Firestore 数据库,请创建一个。如果您已有 Firestore 数据库,请跳到下一步。

    创建数据库:

    1. 点击选择原生模式以激活 Firestore。
    2. 选择靠近您的 Cloud Run 服务运行区域的区域位置。
    3. 点击创建数据库。完成配置需要一些时间。
  3. 在 Firestore 页面上,点击开始收集

  4. 集合 ID 字段中,输入以下内容:activeassist-metadata

  5. 填充下表中显示的字段。如需添加下一个字段,请点击添加字段

    字段名称 字段类型 字段值 备注
    project string Stub-Project-ID 本教程使用字段值桩。如果要使用现有 Cloud 项目中的建议,请输入项目 ID。
    locations array global 某些建议可能特定于区域或特定于可用区,例如虚拟机合理容量建议。其他建议是全球性的建议,例如 IAM 建议。
    recommenderType string google.iam.policy.Recommender 不适用。

  6. 填写字段后,点击保存

创建 activeassist-business-rules 集合

  1. 点击开始收集
  2. 集合 ID 字段中,输入以下内容:activeassist-business-rules

    填充下表中显示的文档。如需添加下一个字段,请点击添加字段

    字段名称 字段类型 字段值 备注
    action string Notify 将值设置为 Apply 会使服务应用建议并移除未使用的角色。
    projectId string Stub-Project-ID 本教程使用桩建议。如果要使用现有 Cloud 项目中的建议,请输入项目 ID。
    projectNumber string 999999999 本教程使用桩建议。

    如果您正在使用现有 Cloud 项目中的建议,请改为输入项目编号。您可以在 Cloud Console 信息中心找到项目编号
    recommenderType string google.iam.policy.Recommender 不适用。
    recommenderSubtype string REMOVE_ROLE 不适用。
    slackWebhookURL string 输入您在上一步中生成的 Slack 网络钩子网址。 网址如下所示:

    https://hooks.slack.com/services/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

    本教程介绍如何构建规则以确定是自动应用建议,还是生成通知并将其发送到 Slack 等平台。如需了解如何根据您设置的示例业务规则的评估自动应用建议,请参阅关联的代码库

  3. 文档填充后,点击保存

创建已安排的 Cloud Run 服务

在本部分,您将创建一个名为 recommendation-collector 的预定 Cloud Run 服务,该服务会调用 Recommender API 并检索有效建议。本教程使用 IAM Recommender API 作为 Recommender API。该服务会从您创建的 Firestore 集合 activeassist-metadata 中读取元数据,来确定要检索哪些建议。

  1. 点击在 Cloud Shell 中打开,以打开推荐管理器项目的 Cloud Shell。

    在 Cloud Shell 中打开

    Cloud Shell 打开后,将执行以下命令:

    出现在 Cloud Shell 中打开对话框时,选择信任,然后点击确认

  2. 将当前建议管理器项目的项目 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。输入命令后,请在看到提示时点击授权

  3. 为部署区域设置变量:

    export REGION=us-central1
    

    虽然本教程使用 us-central1 区域,但您可以使用任何提供 Cloud Run 的区域

  4. 为 Docker 映像创建环境变量:

    export RECOMMENDER_IMAGE=gcr.io/$RECO_MGR_PROJECT/recommendation-collector:1.0
    
  5. 构建 Docker 映像,并将其上传到 Container Registry

     gcloud builds submit --tag $RECOMMENDER_IMAGE
    
  6. 创建 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 服务授予精细权限。如需了解详情,请参阅服务身份

  7. 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
    
  8. 如果您使用克隆的代码库中提供的示例 stub 运行本教程,请跳至下一步。

    如果您使用为现有 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 一致。

  9. 在本教程中,您将使用名为 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 \
    

    接受所有系统提示。

    如果要使用为 Cloud 项目生成的 Active Assist 建议运行流水线,请在部署之前从命令中移除以下行:

    --set-env-vars="STUB_RECOMMENDATIONS=true"
    

设置 Cloud Scheduler 作业以运行 recommender-collector service

  1. 在 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
    
  2. 向服务帐号授予 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
    
  3. 获取 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
    
  4. 创建名为 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 集合中定义的业务规则解析建议。

  1. 在 Cloud Shell 中,打开 recommendation-rules-engine 目录:

    cd ../recommendation-rules-engine
    
  2. 为 Docker 映像创建环境变量:

    export RULES_ENGINE_IMAGE=gcr.io/$RECO_MGR_PROJECT/recommendation-rules-engine:1.0
    
  3. 构建 Docker 映像,并将其上传到 Container Registry

    gcloud builds submit --tag $RULES_ENGINE_IMAGE
    
  4. 创建 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
    
  5. 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
    

    如果您使用的是本教程提供的存根,请继续执行下一步。

    如果您使用为 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
    
  6. 部署 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
    

    接受所有系统提示。

  7. 获取 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 主题。

  1. 在 Cloud Shell 中,创建 Pub/Sub 主题:

    gcloud pubsub topics create activeassist-recommendations
    
  2. 为 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
    
  3. 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 主题创建订阅

  1. 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
    
  2. 允许您创建的 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 频道。
  1. 查看代码库中提供的示例建议:

    cat ../recommendation-collector/stub.json
    

    此文件为名为 roles/gkehub.connect 的示例角色提供带有 REMOVE 操作的示例建议。

  2. 执行以下命令,让 Cloud Scheduler 立即运行作业,而不是等待下一次计划运行:

    gcloud scheduler jobs run recommender-iam-scheduler
    
  3. Cloud Scheduler 控制台页面上,在 recommender-iam-scheduler 作业的结果列上验证结果是否是成功

    如需详细了解每项服务执行的步骤,您还可以查看 Cloud Run 服务日志(针对 recommendation-collector 服务和 recommendation-rules-engine 服务)。

  4. 您在本教程中构建的无服务器端到端流水线成功运行后,会生成一则 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 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

后续步骤