この記事では、terraform-provider-mackerel で既存環境をはじめてimportするときに気になりそうな、ささやかなTipsをまとめます。 importについては、Terraformに慣れない人でもぱっと試せるように簡単な手順も記載します。
terraform-provider-mackerel とは?
Terraform Registry に Mackerel 用の Terraform Provider を公開されています。 これを利用するとMackerelのWebコンソールの設定をIaC化することができます。
実際の 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で取得できます。
- アラートグループ -> アラートグループ設定の一覧API
- AWSインテグレーション -> AWSインテグレーション設定の一覧API
- 監視ルール -> 監視ルールの一覧API
- ダウンタイム -> ダウンタイムの一覧API
- 通知チャンネル -> 通知チャンネルの一覧API
- 通知グループ -> 通知グループの一覧取得API
terrafomerを使うこともできる
社内でつくったという話は聞いてないし、terraformerないだろうなと思いながら念の為探したらありました。 見ると、Mackerelユーザーの方がつくってくださったようです。ありがたい!
これを利用すると、tfファイルなどが生成されますし、もしそのまま使わないとしてもAPIで一つずつIdを集めてくるという手間が不要になるので、だいぶ楽ができそうです。
通知グループでチェック監視の通知先振り分けを行っている場合の注意
通知グループでチェック監視を通知対象として指定している場合、設定チェック監視の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" ]
オートスケールする環境など、頻繁にイメージからサーバーを作り直す環境などでは、こうした指定を行っている場合もあります。 この状態で、Webコンソールの設定をIaCにしてしまうと、mackerel-agent.confを修正した場合に、設定に差分が出てしまう場合があります。 Webコンソール以外でもサービス・ロールを管理している場合は、無理にIaC化をしないことも選択の一つです。
チェック監視同様、設定がサーバー上にある類のものは、IaC化が難易度が高い部分です。 IaC化を優先するのであれば、なるべくサーバー上に設定を持たない工夫が必要になります。
以上です。 Terraformの玄人の方や、Mackerelの設定を含めバリバリIaC化されている方はもっと有益なTipsをお持ちだと思うので、ヒアリングできる機会があればそういった情報もシェアしていければよいなと思います。
参考にしたもの
自分がTerraformまだまだなのでいつも雰囲気でHandson環境つくったりしてましたが、あらためて前から積んでいた以下の書籍読んでいろいろ理解が深まりました。