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

时间:2017-05-09 23:12:10

标签: google-cloud-platform google-compute-engine webhooks shutdown google-cloud-pubsub

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

Stackdriver方法

  1. 转到所需项目的Stackmonitor viewer
  2. 在过滤器文本字段的最右侧,选择高级模式并输入以下内容(其中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。一个好的测试平台是http://bin.mailgun.net/(但请记住,它是公共可访问的,因此您不应发布任何敏感内容和/或您应该在完成后立即删除pastebin)。
  5. 现在,转到Log-based Metrics page。在User-defined Metrics下,您现在应该会看到新创建的指标
  6. 点击最右侧的下拉菜单,选择Create alert from metric。这应该会带您进入Stackdriver警报面板,其中包含大部分正确的信息
  7. THRESHOLD值更改为0,将FOR值更改为most recent value。然后点击Save Condition
  8. 选择您想要的通知(至少应包括您的webhook)
  9. 命名并保存警报政策
  10. 启动并停止机器测试
  11. 上述方法的缺点是您需要支付Stackdriver高级帐户才能使用webhooks等功能。 pricing on that是否值得,取决于你。另一方面,下面的方法(使用GCP Pub / Sub)花费nothing from Stackdriver并使用免除和非免除日志。当然,您仍然需要支付因使用该服务而产生的任何Pub / Sub费用。

    发布/订阅方法

    第二种方法类似,但不一定需要高级Stackdriver帐户(你应该可以在Free Stackdriver层上完成所有这些工作)。在此方法中,您使用Google Pub / Sub。可以找到大部分相关文档here

    1. 转到所需项目的Stackmonitor viewer
    2. 在过滤器文本字段的最右侧,选择高级模式并输入以下内容(其中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作为接收服务,然后选择或创建发布/订阅主题

      < / LI>
    4. 查看{@ 3}}的Google Pub / Sub文档。 Pub / Sub或者允许push subscriptions
    5. 我个人更喜欢Pub / Sub方法。它似乎更适合用途,并且(至少在理论上)比Stackdriver方法便宜。

      可能有一种方法可以通过GCP API以编程方式执行此操作,但我并没有深入挖掘。如果我找到任何相关文档,那么我也会用这些信息更新这个答案。

答案 1 :(得分:0)

您是否考虑过向实例添加shutdown script?您可以将该脚本Table添加到所需的任何URL。无需参与Stackdriver或Pub / Sub。