GCE实例关闭时如何生成webhook?

How to generate webhook when GCE instance shuts down?

我有一个系统,它在启动时将动态创建的具有临时 IP 地址的实例添加到 GCP 云 DNS。但是,我需要在它们关闭时将它们从 DNS 中删除,无论是通过 GCP 自己的 APIs,还是通过其他方法。

我现在能想到的最好的是:

  1. 轮询 GCE API
    • 优点:万无一失;几乎可以保证工作;不需要 webhook 的端点
    • 缺点:资源扩展问题;如果编写不智能,很容易达到 API 请求配额
  2. 使用 API monitoring 到 Stackdriver/StackMonitor 并创建网络钩子通知
    • 优点:只在需要时 运行 编码;简单的网络钩子实现;没有轮询;没有误报
    • 缺点:无法监控意外关机(即不是 API 调用)。
  3. 使用 uptime monitoring 到 Stackdriver/StackMonitor
    • 优点:适用于意外关机
    • 缺点:Stackdriver 将跟踪许多其他未使用的指标;在发送正常运行时间通知之前至少需要 5 分钟;基于 CPU/Memory 统计数据,这可能意味着机器只是被冻结或日志可执行文件已崩溃,而不是机器真正关闭。

还有其他方法吗?

我知道有两种方法可以做到这一点。两者仍然需要 Stackdriver Logging 服务,但它不应该像正常运行时间监控那样需要记录无关数据,它应该捕获给定 GCP 项目中发生的每个 GCE 实例关闭,无论它是如何发生的。 我个人比较喜欢第二种方法(Pub/Sub).

第一种方法是通过 Stackdriver 服务。以下步骤假定您已经设置了 Stackdriver 帐户并将其连接到您要监控的项目。

Stackdriver 方法

  1. 转到 Stackmonitor viewer 您想要的项目
  2. 在过滤器文本字段的最右侧,select 高级模式并输入以下内容(其中 my-project 是您的项目名称):

    resource.type="gce_instance" logName="projects/my- project/logs/compute.googleapis.com%2Factivity_log" (jsonPayload.event_subtype:"compute.instances.stop" OR jsonPayload.event_subtype:"compute.instances.guestTerminate") jsonPayload.event_type:"GCE_OPERATION_DONE"

  3. 在页面顶部点击 Create Metric,然后为其命名和描述,并提交您的新指标

  4. 在继续之前,请务必创建您的 webhook in the Stackdriver notification settings. A good testbed is http://bin.mailgun.net/(但请记住它是公开访问的,因此您不应该 post 任何敏感内容 and/or 您应该删除完成后立即粘贴。
  5. 现在,前往 Log-based Metrics page。在 User-defined Metrics 下,您现在应该可以看到新创建的指标
  6. 点击最右边的下拉菜单,select Create alert from metric。这应该会将您带到 Stackdriver 警报面板,其中已填写大部分正确信息
  7. THRESHOLD 值更改为 0,将 FOR 值更改为 most recent value。然后点击Save Condition.
  8. 选择你想要的通知(至少应该包括你的 webhook)
  9. 命名并保存您的警报策略
  10. 启动和停止机器进行测试

上述方法的缺点是您需要为 Stackdriver 高级帐户付费才能使用 webhooks 等功能。 pricing on that is worth it. On the flip side, the method below (using GCP Pub/Sub) costs nothing from Stackdriver 是否适用于免除和非免除日志由您决定。当然,您仍然需要支付因使用该服务而产生的任何 Pub/Sub 费用。

Pub/Sub方法

第二种方法类似,但不一定需要高级 Stackdriver 帐户(您应该可以在免费 Stackdriver 层上执行所有这些操作)。在此方法中,您使用 Google Pub/Sub。可以找到很多相关文档 here.

  1. 转到 Stackmonitor viewer 您想要的项目
  2. 在过滤器文本字段的最右侧,select 高级模式并输入以下内容(其中 my-project 是您的项目名称):

    resource.type="gce_instance" logName="projects/my- project/logs/compute.googleapis.com%2Factivity_log" (jsonPayload.event_subtype:"compute.instances.stop" OR jsonPayload.event_subtype:"compute.instances.guestTerminate") jsonPayload.event_type:"GCE_OPERATION_DONE"

  3. 在页面顶部点击Create Export,给它一个接收器名称,选择Cloud Pub/Sub作为接收器服务,然后选择或创建一个Pub/Sub话题

  4. 查看 Google Pub/Sub 文档 push subscriptions. Pub/Sub alternatively allows for polling (i.e. pull subscriptions) and batching messages

我个人更喜欢Pub/Sub方法。它似乎更符合目的,并且(至少在理论上)比 Stackdriver 方法更便宜。

可能有一种方法可以通过 GCP API 以编程方式完成这一切,但我还没有深入研究。如果我找到任何相关文档,那么我也会使用该信息更新此答案。

您是否考虑过向实例添加 shutdown script?您可以将该脚本 POST 用于任何您想要的 URL。无需涉及 Stackdriver 或 Pub/Sub.