Terraformは、HCL(Hashicorp Config Language)を使用し、設定ファイルを通じてクラウドおよびオンプレミスのリソースを定義、管理するための、強力な「コードとしてのオブザーバビリティ」ツールです。しかし、HCL構文を使いこなすのは難しいため、Terraformを使用して、New Relic内の既存のダッシュボードを更新したり、新たなウィジェットを追加することが難しい場合があります。

幸いなことに、JSONテンプレートを使用すれば、HCL構文に変換することなく、TerraformでプロビジョニングされたNew Relicダッシュボードをより簡単に管理できるようになります。JSONテンプレートを使うことにより、New RelicのUIですべての編集が可能となり、その設定をTerraformのプロジェクトにエクスポートできます。また、JSONテンプレートでは、一連の色やY軸のスケールを指定する機能など、New Relicダッシュボードの拡張機能を使用することもできます。

このブログでは、TerraformでJSONテンプレートを使用し、New Relicダッシュボードを作成する方法について解説します。今回は3部シリーズの第1部になります。

前提条件

注意:TerraformでJSONテンプレートを使用してNew Relicダッシュボードを作成するには、プロバイダーバージョン3.4.0以上を使用する必要があります。

このチュートリアル内のサンプルコードを試すには、Terraformがインストールされている必要があります。Terraformのインストール手順とサンプルの実行方法に関するガイダンスは、GitHubのリポジトリ(nr-terraform-json-dashboard-examples)をご覧ください。

JSONを使用してダッシュボードを作成する

はじめに、New RelicでダッシュボードのJSON設定を確認します。このJSONはこのチュートリアルにのみ使用するので、どのダッシュボードを選択してもかまいません。既存のダッシュボードを探すか、またはNew Relic UIを使用して新たなダッシュボードを作成し、ダッシュボード右上のCopy JSON to clipboardアイコンを選択します。 

Terraformプロジェクトにdashboardというディレクトリを作成し、クリップボードからdashboard.jsonという新しいファイルにJSONをペーストします。最初にdashboard.json内の"name"属性をアップデートして、ソースとして使用したダッシュボードとこれを区別する必要があります。

次に、このdashboard.jsonをインプットとして使用するために、Terraformの設定をセットアップする必要があります。そのために、dash_basic.tfというファイルを作成し、以下のHCLコードを入力します。

resource "newrelic_one_dashboard_json" "basic_dashboard" {
     json = file("${path.module}/dashboards/dashboard.json")
}

resource "newrelic_entity_tags" "basic_dashoard" {
	guid = newrelic_one_dashboard_json.basic_dashboard.guid
	tag {
    	     key    = "terraform"
    	     values = [true]
	}
}

output "basic_dashboard" {
      value = newrelic_one_dashboard_json.basic_dashboard.permalink
}

最初のブロックが、dashboard.jsonnewrelic_one_dashboard_jsonリソースに送ります。

2番目のブロックが、ダッシュボードをタグ付けし、これがTerraformで管理されていることを示します。これがベストプラクティスです。このケースでは、タグの値は以下の通りです。

tag {
    	     key    = "terraform"
    	     values = [true]
	}

最後に、3番目のブロックが、ダッシュボードのパーマリンクをコンソールに出力して見つけやすくします。

自身のTerraformを適用し、ダッシュボードが想定通りに作成されていることを確認します。

ダッシュボードのアップデート

ダッシュボードの作成はいたってシンプルですが、アップデートはどうすれば良いでしょうか。手順を確認しましょう。

単体のダッシュボード

このフローチャートは、単体のダッシュボードの管理プロセスを示しています。

New Relic UIで簡便にダッシュボードを編集し、新たなJSON設定をクリップボードにコピーしてプロジェクト内のdashboard.json fileをアップデートし、Terraform を再適用します。

複数使用のダッシュボード

ダッシュボードでもっと多くのことがしたい場合はどうでしょうか?たとえば、テンプレートのダッシュボードを使って、各ダッシュボードでコンテキスト上の変更がある度にデプロイを行うケースも考えられます。

ソリューションのひとつは、New Relic UIで管理する「テンプレート」ダッシュボードを作成することです。デプロイしたダッシュボードを変更したい場合、テンプレートダッシュボードを編集し、JSONをdashboard.jsonファイルにコピーしてから再適用します。

以下のフローチャートは、このプロセスの詳細を示しています。

デプロイされた各ダッシュボードへの変更が、appNameやアカウントIDなどの小さなものであれば、Terraformのreplace()機能を使用して、ソーステンプレートの値をデプロイされたダッシュボードの新たな値に置き換えることができます。

たとえば、以下のdash_replacer.tfのTerraformコードのサンプルは、ダッシュボード名を変更し、アカウントIDを設定します。

resource "newrelic_one_dashboard_json" "replacer_dashboard" {
   json = replace(
  	replace(    # This changes the dashboard name
    	    file("./dashboards/dashboard.json"),
    	    "by Terraform"
    	    ,"renamed by Terraform"
  	),
	"1234567",  # This is the value in the source file
	"2233445"   # This is the value it will be changed to
	)
}

この方法の良い点は、ダッシュボードのアップデートが必要な際にはいつでも、テンプレートのダッシュボードを編集し、JSONをテンプレートファイルにコピー&ペーストして再適用すればよいということです。 

デプロイメント時に、テンプレートに多くの変更を行いたい場合は、変更の管理がしやすいTerraformのtemplatefileを使用できます。ただし、Terraformのtemplatefileとの互換性を持たせるため、設定をアップデートする必要が出てきます。example repo内のdash_templatefile.tfファイルは、稼働中のこの例を示しています。

ご覧の通り、このように新たなダッシュボードを作成する、またはいくつかの調整でダッシュボードを再デプロイする方法はかなりシンプルです。しかし、ダッシュボードを動的に作成するなど、もっと複雑なことをしたい場合はどうすればよいでしょうか?その方法は、本シリーズの第2部をご覧ください。