terraform-provider-mackerel で既存環境をimportするときのTips

この記事では、terraform-provider-mackerel で既存環境をはじめてimportするときに気になりそうな、ささやかなTipsをまとめます。 importについては、Terraformに慣れない人でもぱっと試せるように簡単な手順も記載します。

terraform-provider-mackerel とは?

Terraform Registry に Mackerel 用の Terraform Provider を公開されています。 これを利用するとMackerelのWebコンソールの設定をIaC化することができます。

mackerel.io

実際の Terraform Registry はこちらです。

既存環境をIaCに移行するにはimportを使う

おそらく、既存の設定を持っている人がほとんどだと思うので、ここでは既存環境をIaCに移行することを想定したTipsを書いていきます。 既存環境の移行には、基本的にはimportを使っていくことになります。

importの流れ

terraformの設定を書いていくディレクトリと、main.tfを作成します。

> mkdir terraform-mackerel-settings
> touch main.tf

main.tfに以下のようにterraform、terraform-provider-mackerelのバージョンを記載します。

terraform {
  required_version = ">= 1.1.0"

  required_providers {
    mackerel = {
      source  = "mackerelio-labs/mackerel"
      version = ">= 0.0.1"
    }
  }
}

importコマンドを実行します。 監視ルールの例を記載します。

> terraform import mackerel_monitor.connectivity <monitorId>

一回目は以下のようにエラーが出力されます。

Error: resource address "mackerel_monitor.connectivity" does not exist in the configuration.

Before importing this resource, please create its configuration in the root module. For example:

resource "mackerel_monitor" "connectivity" {
  # (resource arguments)
}

exampleに従って、main.tfに以下のように空のresourceを追記します。

resource "mackerel_monitor" "connectivity" {
  # (resource arguments)
}

再度importを実行します。

❯ terraform import mackerel_monitor.connectivity <monitorId>
mackerel_monitor.connectivity: Importing from ID "<monitorId>"...
mackerel_monitor.connectivity: Import prepared!
  Prepared mackerel_monitor for import
mackerel_monitor.connectivity: Refreshing state... [id=<monitorId>]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.

terraform state showコマンドを実行すると設定の中身が見られるので、それを参考にmain.tfに設定を追記します。

❯ terraform state show mackerel_monitor.connectivity
# mackerel_monitor.connectivity:
resource "mackerel_monitor" "connectivity" {
    is_mute               = false
    name                  = "connectivity"
    notification_interval = 0

    connectivity {
        exclude_scopes = []
        scopes         = []
    }
}

terraform planを実行し、差分がなければimport成功です。

❯ terraform plan                           
mackerel_monitor.connectivity: Refreshing state... [id=<monitorId>]

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no
differences, so no changes are needed.

Idの取得方法

importの実行にはMackerelの設定に払いだされている各種Idが必要になります。

各種IdはMackerelの公開APIを利用すると取得することができます。 例えば、監視ルールのIdを取得したい場合は以下のようにcurlなどを実行します。

> curl -GsS \
     -X GET \
     -H 'X-Api-Key: '<YOUR_MACKEREL_APIKEY> \
     -H 'Content-Type: application/json' \
     https://api.mackerelio.com/api/v0/monitors | jq '.monitors[] | [.name,.id]'

取得したIdをimportコマンドに渡してあげれば実行することができます。

> terraform import mackerel_monitor.example <monitorId>

その他必要なId類は以下APIで取得できます。

terrafomerを使うこともできる

社内でつくったという話は聞いてないし、terraformerないだろうなと思いながら念の為探したらありました。 見ると、Mackerelユーザーの方がつくってくださったようです。ありがたい!

これを利用すると、tfファイルなどが生成されますし、もしそのまま使わないとしてもAPIで一つずつIdを集めてくるという手間が不要になるので、だいぶ楽ができそうです。

github.com

通知グループでチェック監視の通知先振り分けを行っている場合の注意

通知グループでチェック監視を通知対象として指定している場合、設定チェック監視のIdを指定する必要があります。 既存環境の移行の場合は、通知グループのimportを行うと現在指定されているチェック監視のIdは設定に含まれるので困ることはありません。

ですのでこれは、IaCでの運用が始まって新しいチェック監視を通知グループに指定したい場合などのTipsです。

チェック監視はその他の監視ルールと違い、監視ルールの一覧APIの結果には含まれません。

チェック監視のIdは、監視ステータスの一覧API で取得することができます。 このAPIは該当のチェック監視が設定されたホストIdを指定して実行することができます。

curl -GsS \
     -X GET \
     -H 'X-Api-Key: '<YOUR_MACKEREL_APIKEY> \
     -H 'Content-Type: application/json' \
     https://api.mackerelio.com/api/v0/hosts/<hostId>/monitored-statuses | jq '.monitoredStatuses[] | select(.detail.type == "check")'

(ただし、結果にはチェック監視名が表示されませんので、messageの内容で識別するなど工夫が必要です。残念ながらmonitorIdを指定して、チェック監視名を取得するAPIなどは現在用意されていません。)

サービス・ロールをIaCにする際は注意が必要

サービス・ロールは、Webコンソール以外にもmackerel-agent.conf上でも以下のように指定することができます。

roles = [ "My-Service:app", "Another-Service:db" ]

mackerel.io

オートスケールする環境など、頻繁にイメージからサーバーを作り直す環境などでは、こうした指定を行っている場合もあります。 この状態で、Webコンソールの設定をIaCにしてしまうと、mackerel-agent.confを修正した場合に、設定に差分が出てしまう場合があります。 Webコンソール以外でもサービス・ロールを管理している場合は、無理にIaC化をしないことも選択の一つです。

チェック監視同様、設定がサーバー上にある類のものは、IaC化が難易度が高い部分です。 IaC化を優先するのであれば、なるべくサーバー上に設定を持たない工夫が必要になります。

以上です。 Terraformの玄人の方や、Mackerelの設定を含めバリバリIaC化されている方はもっと有益なTipsをお持ちだと思うので、ヒアリングできる機会があればそういった情報もシェアしていければよいなと思います。

参考にしたもの

自分がTerraformまだまだなのでいつも雰囲気でHandson環境つくったりしてましたが、あらためて前から積んでいた以下の書籍読んでいろいろ理解が深まりました。