发送 Google Cloud 事件的通知


本教程适用于希望在有重要 Google Cloud 事件推送到其协作平台(Google ChatSlackMicrosoft Teams)时收到通知的 DevOps 团队。通知功能让团队不必定期登录 Google Cloud Console 即可检查是否有事件更新。

作为本教程的示例,系统会在您截取磁盘快照后生成通知。截取磁盘快照会备份您的区域永久性磁盘或地区永久性磁盘中的数据。您可以修改本教程,以在发生其他重要 Google Cloud 事件(例如创建或删除虚拟机 (VM) 实例)时自动将通知推送到协作系统。

GitHub 代码库中提供了本教程的代码。

本教程适用于精通 DevOps 和云技术的工程师。此外,还假设您熟悉 Cloud Logging、Pub/Sub 和 Cloud Functions。

DevOps 现状报告确定了可提高软件交付方面表现的功能。本教程将帮助您使用以下功能:

架构

下图显示了您在本教程中使用的不同组件。

在截取磁盘快照后推送通知的系统架构。

首先,您可以创建永久性磁盘并截取磁盘快照。然后,您可以过滤与成功的磁盘快照对应的日志事件,然后通过将事件发布到 Pub/Sub 主题来导出这些事件。Cloud Functions 函数会从主题中读取消息并向网络钩子发送推送通知。对于本教程,此网络钩子由 Cloud Functions 函数表示。

目标

  • 设置 Cloud Logging 以将所选事件导出到 Pub/Sub,这样 Cloud Functions 就可以使用所选事件。
  • 部署一个 Cloud Functions 函数,该函数使用 Cloud Logging 导出的事件,然后触发网络钩子。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

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

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  2. 确保您的 Google Cloud 项目已启用结算功能

  3. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    您将使用 Cloud Shell 运行本教程中的所有命令。

  4. 启用 Compute Engine、Cloud Logging、Cloud Functions 和 Pub/Sub API:

    gcloud services enable \
        compute.googleapis.com \
        logging.googleapis.com \
        cloudfunctions.googleapis.com \
        pubsub.googleapis.com
    

准备环境

  1. 在 Cloud Shell 中,为要用于本教程的 Compute Engine 地区和区域设置 gcloud 默认值:

    gcloud config set compute/region us-central1
    gcloud config set compute/zone us-central1-a
    

    本教程使用 us-central1 地区和 us-central1-a 区域。您可以更改地区和区域以满足您的需要。如需了解详情,请参阅地理位置和地区

  2. 定义本教程中所使用的环境变量:

    PROJECT=$(gcloud config get-value project)
    PUBSUB_TOPIC="gce-snapshots-events"
    DISK="my-disk-1"
    WEBHOOK_NAME="webhookEmulator"
    WEBHOOK_URL="https://$(gcloud config get-value compute/region)-$PROJECT.cloudfunctions.net/$WEBHOOK_NAME"
    

创建资源

在本部分中,您将为本教程创建以下 Google Cloud 资源:

  • Pub/Sub 主题
  • Cloud Logging 接收器
  • Cloud Functions 函数

创建 Pub/Sub 主题

  • 在 Cloud Shell 中,创建 Pub/Sub 主题作为事件消息的发布目标:

    gcloud pubsub topics create $PUBSUB_TOPIC
    

创建以 Pub/Sub 为目标的 Cloud Logging 接收器

Cloud Logging 可让您存储、搜索和分析 Google Cloud 产生的事件。您可以过滤这些日志并将其导出到 Cloud StorageBigQueryPub/Sub

  1. 在 Cloud Shell 中,将由磁盘快照生成的日志导出到 Pub/Sub:

    gcloud logging sinks create gce-events-sink \
        pubsub.googleapis.com/projects/$PROJECT/topics/$PUBSUB_TOPIC \
        --log-filter='resource.type="gce_disk"
    jsonPayload.event_type="GCE_OPERATION_DONE"
    jsonPayload.event_subtype="compute.disks.createSnapshot"'
    

    输出包含服务账号的电子邮件地址,Cloud Logging 在将日志发布到您之前创建的 Pub/Sub 主题时会使用该地址。此电子邮件地址的格式为 SERVICE_ACCOUNT_NAME@gcp-sa-logging.iam.gserviceaccount.com

  2. 复制服务账号的电子邮件地址。您将在下一部分中用到该地址。

设置权限

  • 在 Cloud Shell 中,向服务账号授予 Pub/Sub Publisher IAM 角色 (roles/pubsub.publisher),以便它可以将消息发布到 Pub/Sub 主题:

    gcloud beta pubsub topics add-iam-policy-binding $PUBSUB_TOPIC \
        --member='serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS' \
        --role='roles/pubsub.publisher'
    

    SERVICE_ACCOUNT_EMAIL_ADDRESS 替换为您在上一部分中复制的电子邮件地址。

创建网络钩子

通常在生产环境中,您是通过发送到协作平台的推送通知来接收重要的 Google Cloud 事件通知。其中大多数平台都提供网络钩子。在本教程中,您将创建一个 Cloud Functions 函数来模拟来自其中一个平台的网络钩子。此 Cloud Functions 函数是通过 HTTP 触发,可输出已收到的消息内容。

默认情况下,任何用户或服务都可以调用 HTTP Cloud Functions 函数。您可以在 HTTP 函数上配置 Identity and Access Management (IAM) 以限制此行为,以便您的 HTTP 函数只能通过在请求中提供身份验证凭据进行调用。

  1. 在 Cloud Shell 中,克隆包含教程代码的 Git 代码库:

    git clone https://github.com/GoogleCloudPlatform/gcf-notification-forwarding
    
  2. 切换到工作目录:

    cd gcf-notification-forwarding/
    
  3. 使用 HTTP 触发器来部署 Cloud Functions 函数 webhookEmulator 网络钩子:

    gcloud functions deploy $WEBHOOK_NAME \
        --runtime=nodejs8 \
        --trigger-http \
        --allow-unauthenticated \
        --source=webhook/
    

    此命令可能需要长达两分钟才能完成。

创建 Cloud Functions 函数以推送通知

您将创建一个 Cloud Functions 函数以订阅您之前在推送模式中创建的 Pub/Sub 主题。然后,每当 Cloud Logging 将事件导出(或推送)到 Pub/Sub 主题时,都会触发此 Cloud Functions 函数。此函数将接收事件,处理事件,然后将事件推送到您之前创建的网络钩子的 HTTP 端点。

  • 在 Cloud Shell 中,部署 Cloud Functions 函数:

    gcloud functions deploy pushEventsToWebhook \
        --runtime=nodejs8 \
        --trigger-topic=$PUBSUB_TOPIC \
        --set-env-vars=WEBHOOK_URL=$WEBHOOK_URL \
        --allow-unauthenticated \
        --source=push_notification/
    

测试设置

如需测试此设置,您可以截取磁盘快照并检查网络钩子是否收到磁盘快照生成的事件日志。

  1. 在 Cloud Shell 中,创建区域永久性磁盘。默认为 500 GB 标准普通硬盘。

    gcloud compute disks create $DISK \
        --zone=$(gcloud config get-value compute/zone)
    
  2. 针对您之前创建的磁盘,触发创建磁盘快照的操作:

    gcloud compute disks snapshot $DISK \
        --zone=$(gcloud config get-value compute/zone) \
        --storage-location=$(gcloud config get-value compute/region)
    

    此命令可能需要长达两分钟才能完成。截取快照后,将生成管理员活动日志条目。事件日志会由系统过滤并推送到 Pub/Sub 主题。订阅的 Cloud Functions 函数将提取事件日志,设置事件日志格式,然后将事件日志推送到网络钩子的 HTTP 端点。

  3. 几分钟后,请检查网络钩子是否收到了事件日志:

    gcloud beta functions logs read $WEBHOOK_NAME \
        --region=$(gcloud config get-value compute/region) \
        --limit=10
    

    输出类似于以下内容:

    {
      data:[
         {
            "type":'disk',
            "url":'https://console.cloud.google.com/compute/disksDetail/zones/us-central1-a/disks/my-disk-1?project=$PROJECT&supportedpurview=project',
            "name":'my-disk-1'
         },
         {
            "type":'project',
            "project_id":'$PROJECT',
            "project_url":'https://console.cloud.google.com/?project=$PROJECT'
         },
         {
            "zone":'us-central1-a'
         },
         {
            "date_time":'2020-04-15T09:07:21.205-06:00'
         }
      ]
    }
    

    输出会显示网络钩子收到了关于已截取磁盘快照的通知。

清除数据

为避免支付费用,最简单的方法是删除您为本教程创建的项目。

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤