我在Terraform中尝试了一下对Uptime Robot进行的设置

这是什么?

这是关于使用 Terraform 配置 Uptime Robot 的外形监视的故事。这次我们尝试使用 terraform-provider-uptimerobot!

我想做的事情 (wǒ zuò de

在前一篇文章中,我创建了一个Redmine的主题,现在我决定在Heroku上建立一个演示环境。

这次,我们想要将外形监控集成到这个演示环境中。

你为什么要做这个?

如果30分钟没有访问,它就会进入睡眠状态。

演示环境使用的是Heroku的免费计划。
如果在Heroku应用上使用免费计划,没有30分钟的访问活动(或者没有动作),它会进入休眠状态。

    https://devcenter.heroku.com/articles/how-heroku-works#runtime

使用免费的dyno类型的应用程序在30分钟的闲置后会进入休眠状态。如果进行多个Web dyno或选择不同的dyno类型进行扩展,将会避免此问题。

实际上,是通过 Docker 镜像启动容器,但这个容器会进入休眠状态。

经过30分钟以上后进行访问时,不会使用之前的容器,而是会基于新的镜像来启动容器,因此初始启动速度也会变慢。
此外,如果不将上传的图片和数据持久化保存在外部,它们会消失。

有几种方法可以进行处理,一是增加应用程序的数量(扩展规模),二是改变计划,另外还可以使用附加组件的方法。

趁着定期访问的机会,顺便进行监视。

这一次,我突然想到说:“我们需要定期发生访问吗?”然后我决定:“顺便试试外观监控也不错!”所以,我决定设置Uptime Robot。 (如果不进行监控,只通过cron从外部进行适度的访问设置,也可以避免睡眠)

首先,创建一个Uptime Robot的账户。

Uptime Robot是一项简单的外观监控服务。
即使是免费计划,也可以使用基本功能。
在Qiita的文章中,有一些关于Heroku和Uptime Robot组合的文章,如果从Web界面进行设置,可以参考这些文章。

HEROKU_URL が効かず Hubot がアイドル状態になる問題の対策(@uasiさま)

Herokuでアイドルさせないようにした際のメモ (@udon242さま)

获取API密钥

为了使用Terraform进行测试而不是使用Web UI进行设置,首先我们需要获取MAIN API密钥。

main-api-key.png

准备Terraform的提供者。

使用 terraform-provider-uptimerobot

首先,按照 terraform-provider-uptimerobot 的README指南,尝试添加配置文件。

设定文件

就像这样子。

provider "uptimerobot" {
  api_key = "${var.UPTIMEROBOT_API_KEY}"
}

data "uptimerobot_account" "account" {}

data "uptimerobot_alert_contact" "default_alert_contact" {
  friendly_name = "${data.uptimerobot_account.account.email}"
}

variable "UPTIMEROBOT_API_KEY" {
  type = string
  description = "API key for Uptime Robot."
}

variable "SLACK_WEBHOOK_URL" {
  type = string
  description = "Webhook url for slack"
}

resource "uptimerobot_alert_contact" "slack" {
  friendly_name = "Slack #精神と時の部屋"
  type          = "slack"
  value         = "${var.SLACK_WEBHOOK_URL}"
}

resource "uptimerobot_monitor" "main" {
  friendly_name = "Kodomo Redmine Midori Monitor"
  type          = "http"
  url           = "https://kodomo-redmine-midori.herokuapp.com"
  # pro allows 60 seconds / free plan 5min
  interval      = 300

  alert_contact {
    id = "${uptimerobot_alert_contact.slack.id}"
    # threshold  = 0  # pro only
    # recurrence = 0  # pro only
  }

  alert_contact {
    id = "${data.uptimerobot_alert_contact.default_alert_contact.id}"
  }
}

# Status Pageも作ってみよう!
resource "uptimerobot_status_page" "main" {
  friendly_name  = "Kodomo Redmine Midori Status Page"
  sort           = "down-up-paused"
  monitors       = ["${uptimerobot_monitor.main.id}"]
}

当你尝试去执行的时候….?

我們將使用環境變數來傳遞Slack的Webhook URL和Uptime Robot的API Key。

export TF_VAR_SLACK_WEBHOOK_URL='https://hooks.slack.com/services/xxxxx'
export TF_VAR_UPTIMEROBOT_API_KEY='xxxxxxxxxxxxx'

# とりあえず通知先のslack設定を追加してみます
terraform plan -target=uptimerobot_alert_contact.slack

最后,没有插件导致出现了错误!

Error: Could not satisfy plugin requirements


Plugin reinitialization required. Please run "terraform init".

Plugins are external binaries that Terraform uses to access and manipulate
resources. The configuration provided requires plugins which can't be located,
don't satisfy the version constraints, or are otherwise incompatible.

Terraform automatically discovers provider requirements from your
configuration, including providers used in child modules. To see the
requirements and constraints from each module, run "terraform providers".



Error: provider.uptimerobot: no suitable version installed
  version requirements: "(any version)"
  versions installed: none

添加terraform-provider-uptimerobot

这个插件似乎还没有被添加到官方网站上,所以你需要把它放在本地环境中。

尝试过后我才注意到

    • GitHubのリポジトリからソースコードをとってくるのではダメ

 

    実際はGo言語なのでコンパイルしてOSに合ったバイナリをプラグインとして組み込まないといけない

大概就是这样。

配置步骤: 前往发布页面

首先,转到以下新闻发布页面。

    https://github.com/louy/terraform-provider-uptimerobot/releases

由于二进制文件被附加在其中,所以我下载了 terraform-provider-uptimerobot_0.4.3_darwin_amd64.tar.gz。

    • terraform-provider-uptimerobot_0.4.3_darwin_amd64.tar.gz

 

    • を展開

 

    • Terraformの作業用フォルダに terraform.d というディレクトリを作成

 

    plugins 以下に展開したファイルを配置
tree terraform.d/
terraform.d/
└── plugins
    └── darwin_amd64
        ├── CHANGELOG.md
        ├── LICENSE
        ├── README.md
        └── terraform-provider-uptimerobot

2 directories, 4 files

# バイナリです
file terraform-provider-uptimerobot
terraform-provider-uptimerobot: Mach-O 64-bit executable x86_64

# 動かしてみると、「これはプラグインだよ!」というメッセージが
./terraform-provider-uptimerobot
This binary is a plugin. These are not meant to be executed directly.
Please execute the program that

经过配置后,再次执行 terraform plan。
这次似乎成功了!!


terraform plan -target=uptimerobot_alert_contact.slack
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # uptimerobot_alert_contact.slack will be created
  + resource "uptimerobot_alert_contact" "slack" {
      + friendly_name = "Slack #精神と時の部屋"
      + id            = (known after apply)
      + status        = (known after apply)
      + type          = "slack"
      + value         = "https://hooks.slack.com/services/xxxxxxxxx"
    }

Plan: 1 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

Releasing state lock. This may take a few moments...

按顺序试试应用

因为看起来可以顺利运行,所以我会按顺序逐个应用。
我将逐个对目标资源进行执行。

    • uptimerobot_alert_contact.slack (Slackの通知設定追加)

 

    • uptimerobot_monitor.main (Herokuのアプリケーションの監視追加)

 

    uptimerobot_status_page.main (StatusPageの追加)

terraform apply -target=uptimerobot_alert_contact.slack
terraform apply -target=uptimerobot_monitor.main
terraform apply -target=uptimerobot_status_page.main

....

# うまくいった模様
uptimerobot_status_page.main: Creating...
uptimerobot_status_page.main: Creation complete after 1s [id=180831]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

我来确认是否已经完成。

我会检查一下Uptime Robot是否已经准备好了。

设置Slack的通知

虽然在表达中出现了乱码,但实际上已经完成了!

notification-slack.png

监视配置

这也被添加了!

main-monitor-added.png

状态页

同样也做到了!

StatusPage-setting.png

确认Heroku的一侧。

我会在Heroku上检查是否有对目标应用程序的访问。

heroku logs -t  -a kodomo-redmine-midori

.... [中略] ....

2020-05-27T04:29:08.396035+00:00 heroku[router]: at=info method=HEAD path="/" host=kodomo-redmine-midori.herokuapp.com request_id=xxxxx fwd="xxxxx" dyno=web.1 connect=0ms service=60ms status=200 bytes=865 protocol=https
2020-05-27T04:29:37.309943+00:00 heroku[router]: at=info method=HEAD path="/" host=kodomo-redmine-midori.herokuapp.com request_id=xxxxx fwd="xxxxx"  dyno=web.1 connect=1ms service=32ms status=200 bytes=865 protocol=https

在Uptime Robot的免费计划中,通过使用HEAD方法进行访问。
您可以清楚地知道是否有访问到来。

尝试关闭Heroku应用程序。

为了确认监视是否正常运作并接收通知,我会把Heroku应用程序关闭一下进行测试。

heroku maintenance:on -a kodomo-redmine-midori
Enabling maintenance mode for ⬢ kodomo-redmine-midori... done

有个通知来了!

当应用切换到维护模式时,Heroku将返回503错误。过了一会儿,收到了Slack的通知!

Slack-result.png

画面变成什么样子了?

因为我也收到了Slack的通知,所以我确认屏幕上显示为“Down”。
现在,我会将维护模式关闭并重新启动应用程序。

heroku maintenance:on -a kodomo-redmine-midori
Enabling maintenance mode for ⬢ kodomo-redmine-midori... done

过了一会儿,屏幕也显示了”下->上”!

monitor-up-down.png

如果再次开启的话,根据设置,Slack会给你发送通知。

请尝试打开状态页面。

公共访问的状态页面是这样的。
数据似乎也成功采集了。
太感谢了!

StatusPage-view.png

最后

由于定期访问的发生,它似乎一直在运行而没有休眠,这真是太好了!

观察调料

我看到它是可以动的,但我想知道它是如何制造的,它使用了哪些API。首先,我会先观察这个方面。

    https://github.com/louy/terraform-provider-uptimerobot/tree/master/uptimerobot

似乎Uptime Robot的API正在使用v2版本。

    • https://github.com/louy/terraform-provider-uptimerobot/blob/cdb6af763b95e39a82c1aa2830f807187d4fb900/uptimerobot/api/client.go#L27

 

    https://uptimerobot.com/api

大部分的功能都已涵盖,只有维护窗口的设置似乎没有涵盖,但这似乎不是很重要,而且对于参与开源软件的初学者来说是一个不错的起始问题,所以他们接受拉取请求!

    Support for maintenance windows

下一件想做的事情

这仅仅是一个尝试的文章,但最终结果包括了关于二进制布局的内容,也出现了一些需要学习的新事物。

希望能够通过支持库的作者以及可能的帮助事项,更多地学习并进一步成长!