Website monitoring with statuscake and terraform

As part of operation ‘make my infrastructure look like an adult operates it’ I needed to add some basic uptime/availability checks to a few simple sites. After some investigation I came up with three options, Pingdom, which I’d used before in production and was comfortable with, and two I’d not used in the past Uptime Robot and Status Cake.

By coincidence I was also doing my quarterly check of which AWS resources Terraform supported and I noticed that a StatusCake Provider had recently been added so I decided to experiment with the two of them together.

Once you’ve installed terraform, which is well documented on their site, you’ll want to set up a statuscake account and note your apikey. First we’ll set up our credentials:

    $ mkdir config
    $ cd config

    cat <<EOF > config/secrets.tfvars
    username = "my_username"
    apikey = "MYSECUREKEY"
    EOF

These should be kept private and not checked in to public version control. We’ll now declare the variables we’ll need to create the resources.

    cat <<EOF > config/variables.tf
    variable "username" {}
    variable "apikey"   {}
    EOF

Finally we’ll add a statuscake_test resource to create our monitoring. In this example we’ll check www.puppetcookbook.com once every 5 minutes.

    cat <<EOF > config/websites.tf
    provider "statuscake" {
        username = "${var.username}"
        apikey = "${var.apikey}"
    }

    resource "statuscake_test" "puppetcookbook" {
        website_name = "www.puppetcookbook.com homepage"
        website_url = "www.puppetcookbook.com"
        test_type = "HTTP"
        check_rate = 300
    }
    EOF

With all our config written we can run terraform to see what it’ll do.

    $ terraform plan -var-file="config/secrets.tfvars" config/


    statuscake_test.puppetcookbook: Refreshing state... (ID: 34)

    + statuscake_test.puppetcookbook.com
        check_rate:   "" => "300"
        paused:       "" => "0"
        test_id:      "" => "<computed>"
        test_type:    "" => "HTTP"
        timeout:      "" => "<computed>"
        website_name: "" => "www.puppetcookbook.com homepage"
        website_url:  "" => "www.puppetcookbook.com"

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

and then to apply the changes

terraform apply config/

Now when you login to your statuscake dashboard you’ll be able to see your new, automated, availability monitoring. It’d be nice to see Terraform providers added for some other related services, like UptimeRobot and Pingdom but this is a very welcome first step.