Datadogの外形監視を行う(Terraformでもやってみた)

## 概要
[Datadog Synthetics API Tests](https://docs.datadoghq.com/synthetics/api_tests/?tab=httptest)の設定方法をまとめました。Terraformでの構築についても記載しています。

## API Tests
[Datadog Synthetics API Tests](https://docs.datadoghq.com/synthetics/api_tests/?tab=httptest)には下記の通り記載されています。

Google翻訳

> APIテストは、APIエンドポイントを監視し、失敗したり遅すぎたりした場合に警告するのに役立ちます。これらのチェックは、アプリケーションが要求に応答していること、および応答時間、HTTPステータスコード、ヘッダーまたは本文の内容など、ユーザーが定義した条件を満たしていることを確認します。

API Testには、`HTTP`と`SSL`の2種類があります。
今回は、`HTTP`のAPIのテストを行います。

`SSL`タイプについては、下記の記事で手順が詳しく説明されていますので、掲載させていただきます。
[Datadog Synthetics API Tests でSSL証明書期限を監視できるようになりました！  #datadog ｜ DevelopersIO](https://dev.classmethod.jp/etc/datadog-synthetics-api-test-certificate/)

また、AWS ACMを利用している場合、ACM発行の証明書の自動更新条件は下記より確認できますので、参考にしてみてください。
[ACM の Amazon が発行する証明書のマネージド型更新](https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/managed-renewal.html)

## 手順
`Synthetics` > `Get Started` > `New API Test`を選択します。
<img width="1057" alt="スクリーンショット 2019-06-14 18.04.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206741/9ff2f6a8-b22b-cb4a-8138-c841541a7c00.png">


今回は、下記の値を設定します。URLは必要に応じて変更してください。

| 項目 | 値 |
| --- | --- |
| request type | HTTP |
| URL | GET https://example.com |
| Advanced Options | - |
| Name | Test on example.com |
| Select your tags | - |


`Test URL` をクリックします。
<img width="659" alt="スクリーンショット 2019-06-14 18.17.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206741/82987795-1ef7-0386-07b0-9cdff0111f42.png">

アラートの条件が自動で設定されています。
アサーションに失敗した場合にアラートが通知されます。
<img width="713" alt="スクリーンショット 2019-06-14 18.32.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206741/e35e6195-9b23-ac4e-3215-aaee03de79c8.png">

また、画面の右側にテストしたRequestとResponseのプレビューが表示されます。
![スクリーンショット 2019-06-14 18.31.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206741/bc12f0aa-6604-0c3d-41b6-cbc14489ab03.png)

最後に、`Notify your team`にアラートのメッセージと通知先を指定します。
今回は、既にSlack integrationsの設定が完了しているので、通知先にはSlackのchannnelを設定しました。
![スクリーンショット 2019-06-14 18.39.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206741/2f4bf0cf-3a5f-34cc-c431-1b52fd395ce1.png)

`Create Test`をクリックして、テストの設定は完了です。

## テストの確認
テストの状況は画面から確認することができます。

### Properties
![スクリーンショット 2019-06-14 18.49.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206741/a79d88b0-8bd2-f716-2ebe-7a70bca8d8c4.png)

### History
<img width="1258" alt="スクリーンショット 2019-06-14 18.52.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206741/88174dec-142e-12d7-c847-177189529f60.png">

### Test Results
正常時
<img width="1259" alt="スクリーンショット 2019-06-14 18.53.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206741/d39f70fb-daa3-c113-9866-521f6170cd90.png">

エラー時
<img width="1272" alt="スクリーンショット 2019-06-14 19.02.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206741/e6237cf6-e93a-0a25-a456-0ecbe2c208d8.png">
![スクリーンショット 2019-06-14 19.00.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206741/96bfe0a4-1f44-3179-fcaf-a2ebecf969d2.png)

## Slackへの通知
テストが失敗した場合、Slackへの通知は下記の通りです。
![スクリーンショット 2019-06-14 18.57.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206741/491ac371-9f7e-3bf7-fdcf-55f279a344e5.png)
![スクリーンショット 2019-06-15 0.01.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206741/6168b268-1f23-0b44-f472-123404e1dd5d.png)

## Terraformで構築
[datadog_synthetics_test](https://www.terraform.io/docs/providers/datadog/r/synthetics.html)で構築します。

上記の手順で作成したAPI TestをTerraformで構築すると下記の通りとなります。

```
resource "datadog_synthetics_test" "api_test" {
  type = "api"

  request = {
    method = "GET"
    url    = "https://${var.api_test_url}"
  }

  assertions = [
    {
      type     = "statusCode"
      operator = "is"
      target   = "200"
    },
    {
      type     = "header"
      property = "content-type"
      operator = "is"
      target   = "application/json"
    },
    {
      type     = "responseTime"
      operator = "lessThan"
      target   = "2000"
    },
  ]

  locations = ["aws:ap-northeast-1"]

  options = {
    tick_every = 60
  }

  name    = "An API test on ${var.api_test_url}"
  message = "Test on ${var.api_test_url} @${var.slack_channel_name}"

  tags   = []
  status = "live"
}
```

なお、SSLタイプについてはTerraformではまだ対応されていないようです。(2019/6/1６時点では)
https://github.com/terraform-providers/terraform-provider-datadog/issues/229

## 参考記事
下記を参考にさせていただきました。
[Synthetics API Tests（外形監視）機能を使ってみた #datadog ｜ DevelopersIO](https://dev.classmethod.jp/etc/datadog-synthetics-api-test/)