電気ひつじ牧場

技術メモ

TerraformerでNewRelicのリソースをTerraformに取り込めるようにした

あるプロダクトの監視にはNewRelicを使っているが、手作業で作られたNewRelicのアラートが大量に放置されていた。 そのため、どのアラートが作成されているのかがわからない、不要なものもわからない、レビューがやりにくいといった問題があった。

そこでTerraformerを使ってそれらを取り込みコード化することができたので、方法を記載する。

Terraformer

github.com

リソースからTerraformのコード+tfstateを自動で生成するツール。

Terraformerを使わなくてもterraform importコマンドを使うことでリソースを取り込むことはできるが、Terraformerを使うことのメリットは次の通り。

  • tfstateとコードを両方生成してくれる。対してterraform importはtfstateのみ生成。
  • 複数のリソースを一括で取り込める。対してterraform importは1リソースだけ。

リソースをTerraformで作成するときと同様、取り込みたいリソースのprovider pluginが必要となる。

TerraformerはNewRelicに対応しているはずだったが、いざ試してみると依存しているNewRelicクライアントが古すぎて失敗したため、新しいクライアントで入れ替えた。

github.com

このPRがマージされたコードが先日リリースされたため、誰でもNewRelicリソースを取り込めるようになった。やったぜ。

brew installするなりgithubのreleaseから取ってくるなりして利用できる。

リソース取り込み

Terraformerは残念ながらTerraform 0.13にしか対応していないため、まずtfenvを使ってバージョンを下げる。

$ tfenv install 0.13.0
$ tfenv use 0.13.0

NewRelicのprovider pluginを.terraform.d/plugins/<system>に配置する。 これをやらないとfork/exec : no such file or directoryみたいなエラーが出て動かない。

M1 Macならこんな感じになる。

$ cd .terraform.d/plugins/darwin_arm64
$ curl -LO https://github.com/newrelic/terraform-provider-newrelic/releases/download/v2.45.1/terraform-provider-newrelic_2.45.1_darwin_arm64.zip
$ unzip terraform-provider-newrelic_2.45.1_darwin_arm64.zip

リソースを取り込んでみる。今のところ対応しているのはalert, infra, syntheticsの3種類。

$ terraformer import newrelic -r alert,infra,synthetics --api-key=$API_KEY --account-id=$ACCOUNT_ID

generated/newrelicに各種リソースのコードが生成された。

.
└── generated
    └── newrelic
        ├── alert
        │   ├── alert_channel.tf
        │   ├── alert_policy.tf
        │   ├── nrql_alert_condition.tf
        │   ├── outputs.tf
        │   ├── provider.tf
        │   └── terraform.tfstate
        ├── infra
        │   ├── provider.tf
        │   └── terraform.tfstate
        └── synthetics
            ├── outputs.tf
            ├── provider.tf
            ├── synthetics_monitor.tf
            └── terraform.tfstate

それぞれの./generated/newrelic/<resource>にnewrelicの設定を記述する。

provider "newrelic" {
  region     = "US"
  account_id = var.nr_account_id
  api_key    = var.nr_api_key
}

variable "nr_account_id" {}

variable "nr_api_key" {}

planしてみて差分が出なければ取り込み完了。

$ export TF_VAR_nr_account_id=$ACCOUNT_ID
$ export TF_VAR_nr_api_key=$API_KEY
$ terraform 0.13upgrade .
$ terraform init
$ terraform plan

取り込んだ後はTerraformの最新バージョンを使うことができるので、公式のUpgrade Guideを見ながらちまちまアップグレードする。