GCE实例关闭时如何生成webhook?
How to generate webhook when GCE instance shuts down?
我有一个系统,它在启动时将动态创建的具有临时 IP 地址的实例添加到 GCP 云 DNS。但是,我需要在它们关闭时将它们从 DNS 中删除,无论是通过 GCP 自己的 APIs,还是通过其他方法。
我现在能想到的最好的是:
- 轮询 GCE API
- 优点:万无一失;几乎可以保证工作;不需要 webhook 的端点
- 缺点:资源扩展问题;如果编写不智能,很容易达到 API 请求配额
- 使用 API monitoring 到 Stackdriver/StackMonitor 并创建网络钩子通知
- 优点:只在需要时 运行 编码;简单的网络钩子实现;没有轮询;没有误报
- 缺点:无法监控意外关机(即不是 API 调用)。
- 使用 uptime monitoring 到 Stackdriver/StackMonitor
- 优点:适用于意外关机
- 缺点:Stackdriver 将跟踪许多其他未使用的指标;在发送正常运行时间通知之前至少需要 5 分钟;基于 CPU/Memory 统计数据,这可能意味着机器只是被冻结或日志可执行文件已崩溃,而不是机器真正关闭。
还有其他方法吗?
我知道有两种方法可以做到这一点。两者仍然需要 Stackdriver Logging 服务,但它不应该像正常运行时间监控那样需要记录无关数据,它应该捕获给定 GCP 项目中发生的每个 GCE 实例关闭,无论它是如何发生的。 我个人比较喜欢第二种方法(Pub/Sub).
第一种方法是通过 Stackdriver 服务。以下步骤假定您已经设置了 Stackdriver 帐户并将其连接到您要监控的项目。
Stackdriver 方法
- 转到 Stackmonitor viewer 您想要的项目
在过滤器文本字段的最右侧,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"
在页面顶部点击 Create Metric
,然后为其命名和描述,并提交您的新指标
- 在继续之前,请务必创建您的 webhook in the Stackdriver notification settings. A good testbed is http://bin.mailgun.net/(但请记住它是公开访问的,因此您不应该 post 任何敏感内容 and/or 您应该删除完成后立即粘贴。
- 现在,前往
Log-based Metrics
page。在 User-defined Metrics
下,您现在应该可以看到新创建的指标
- 点击最右边的下拉菜单,select
Create alert from metric
。这应该会将您带到 Stackdriver 警报面板,其中已填写大部分正确信息
- 将
THRESHOLD
值更改为 0
,将 FOR
值更改为 most recent value
。然后点击Save Condition
.
- 选择你想要的通知(至少应该包括你的 webhook)
- 命名并保存您的警报策略
- 启动和停止机器进行测试
上述方法的缺点是您需要为 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.
- 转到 Stackmonitor viewer 您想要的项目
在过滤器文本字段的最右侧,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"
在页面顶部点击Create Export
,给它一个接收器名称,选择Cloud Pub/Sub
作为接收器服务,然后选择或创建一个Pub/Sub话题
- 查看 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.
我有一个系统,它在启动时将动态创建的具有临时 IP 地址的实例添加到 GCP 云 DNS。但是,我需要在它们关闭时将它们从 DNS 中删除,无论是通过 GCP 自己的 APIs,还是通过其他方法。
我现在能想到的最好的是:
- 轮询 GCE API
- 优点:万无一失;几乎可以保证工作;不需要 webhook 的端点
- 缺点:资源扩展问题;如果编写不智能,很容易达到 API 请求配额
- 使用 API monitoring 到 Stackdriver/StackMonitor 并创建网络钩子通知
- 优点:只在需要时 运行 编码;简单的网络钩子实现;没有轮询;没有误报
- 缺点:无法监控意外关机(即不是 API 调用)。
- 使用 uptime monitoring 到 Stackdriver/StackMonitor
- 优点:适用于意外关机
- 缺点:Stackdriver 将跟踪许多其他未使用的指标;在发送正常运行时间通知之前至少需要 5 分钟;基于 CPU/Memory 统计数据,这可能意味着机器只是被冻结或日志可执行文件已崩溃,而不是机器真正关闭。
还有其他方法吗?
我知道有两种方法可以做到这一点。两者仍然需要 Stackdriver Logging 服务,但它不应该像正常运行时间监控那样需要记录无关数据,它应该捕获给定 GCP 项目中发生的每个 GCE 实例关闭,无论它是如何发生的。 我个人比较喜欢第二种方法(Pub/Sub).
第一种方法是通过 Stackdriver 服务。以下步骤假定您已经设置了 Stackdriver 帐户并将其连接到您要监控的项目。
Stackdriver 方法
- 转到 Stackmonitor viewer 您想要的项目
在过滤器文本字段的最右侧,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"
在页面顶部点击
Create Metric
,然后为其命名和描述,并提交您的新指标- 在继续之前,请务必创建您的 webhook in the Stackdriver notification settings. A good testbed is http://bin.mailgun.net/(但请记住它是公开访问的,因此您不应该 post 任何敏感内容 and/or 您应该删除完成后立即粘贴。
- 现在,前往
Log-based Metrics
page。在User-defined Metrics
下,您现在应该可以看到新创建的指标 - 点击最右边的下拉菜单,select
Create alert from metric
。这应该会将您带到 Stackdriver 警报面板,其中已填写大部分正确信息 - 将
THRESHOLD
值更改为0
,将FOR
值更改为most recent value
。然后点击Save Condition
. - 选择你想要的通知(至少应该包括你的 webhook)
- 命名并保存您的警报策略
- 启动和停止机器进行测试
上述方法的缺点是您需要为 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.
- 转到 Stackmonitor viewer 您想要的项目
在过滤器文本字段的最右侧,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"
在页面顶部点击
Create Export
,给它一个接收器名称,选择Cloud Pub/Sub
作为接收器服务,然后选择或创建一个Pub/Sub话题- 查看 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.