Terraformは、クラウドおよびオンプレミスのリソースを定義、管理するための強力なツールですが、HCL(HashiCorp Configuration Language)を使いこなすのは、とりわけ動的に生成されるダッシュボードを作成する場合には簡単ではないことがあります。 このシリーズの第1部では、TerraformでJSONテンプレートを使用し、New Relicダッシュボードを作成、管理する方法についてご紹介しています。今回は、シンプルな入力データから複雑なダッシュボードを構築し、次にデータ生成を自動化してダッシュボードを自動的にアップデートできるようにする方法について学びます。本シリーズ第3部の、TerraformでのNRQLクエリによるNew Relicダッシュボードの作成では、NRQLクエリを用いたTerraformの使用方法について学び、クエリの結果にもとづく動的なNew Relicダッシュボードを作成できるようにします。

今回の例では、すべてのアカウントで無料で使用できるグローバルなAPIデータを使用して、多様なメトリクスを表示するためのダッシュボードを作成します。NRQLクエリを使用して、Amazon Web Services、Google、Microsoft、FacebookへのAPIコールに関するデータを表示するダッシュボードを構築していきます。ダッシュボードは、合計APIコール、スループット、レイテンシを含む各APIサービス向けの一連のデータのウィジェットで構成されます。完了すると、以下のようなダッシュボードが動的に作成されます。

通常、同じ設定のウィジェットを何度も構成するのは面倒ですが、テンプレートがあれば、各ウィジェットごとに設定詳細を繰り返さずにダッシュボードを作成することができます。

前提条件

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

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

1. ダッシュボードのレイアウトを構築する

最初のタスクでは、ウィジェットの1行の表示を構築します。完成サンプルには以下が含まれます。

  • API名を表示する全角のMarkdownテキスト行
  • 合計APIコール数を表示する大きなビルボードウィジェット
  • 追加メトリクスの小さなビルボード
  • 2つの時系列チャート
  • 時系列チャートにカスタムカラーを含む、カスタマイズされたウィジェット

以下の画像は、ダッシュボードの行がどう表示されるかを示しています。

独自のダッシュボードを作成したい場合は、ウィジェット行を構築してみてください。もしくは、このサンプルに従って進めたい場合には、以下のサンプルコードからサンプルのダッシュボードテンプレートを使用できます。dashboards/composed_widgets.json.src

ダッシュボードの1行目を作成したら、JSONをクリップボードにコピーし(もしくはサンプルコードを使用し)、ダッシュボードフォルダ内の composed_widgets.json.tftplというファイルに保存します。ファイルを確認してみると、作成したウィジェット列がwidgets配列に含まれているのがわかります。

{
  "name": "Dashboard Name",
  "description": null,
  "permissions": "PUBLIC_READ_ONLY",
  "pages": [
	{
  	"name": "Page Name",
  	"description": null,
  	"widgets": [ …YOUR-WIDGETS-HERE… ]
	}
  ]
}

2. 入力設定を定義する

次に、入力を設定する必要があります。最初のステップでは、ダッシュボードに表示させたいサービスのリストを保持するデータタイプを定義します。これをdash_composed.tfファイルの冒頭に加えます。

variable "config" {
	type = list(object({
    		name = string
    		domain = string
  }))
}

次に、 terraform.tfvarsファイル内にサービスのリストを作成します。これが変数を別のファイルに入力するベストプラクティスです。これを行うことで、それらの確認と更新がしやすくなります。ここで、以前のコードスニペットで定義されたデータタイプの値を提供します。

config = [
  {
    name = "Amazon Web Services"
    domain = "amazonaws.com"
  },
  {
    name = "Google APIs"
    domain = "googleapis.com"
  },
  {
    name = "Microsoft"
    domain = "microsoft.com"
  },
  {
    name = "facebook.com"
    domain = "facebook.com"
  },
]

次のステップでは、このリストで各サービスのウィジェット行を動的に作成します。

3. ダッシュボードウィジェットを作成する

terraform.tfvarsからの設定を、dash_composed.tfのダッシュボードテンプレートファイルと組み合わせる必要があります。以下のコードサンプルで示されているtemplatefile()機能を使用してください。これをローカル変数に保管しておくと、すぐに参照ができます。以下が、 dash_composed.tf内のコードです。

locals {
  template_render = templatefile(
    "${path.module}/dashboards/composed_widgets.json.tftpl",
    {
      ACCOUNTID = var.accountId
      CONFIG = var.config
    }
  )
}

CONFIGは、APIドメインのリストとすでに定義した名称を保持する設定オブジェクトへの参照です。次のステップでは、CONFIG項目のリストを反復し、それぞれのダッシュボード行を作成します。これは、以下のようなtemplate  syntaxを使用して、JSONテンプレート内で行います。

[..outer container code here…]

%{~ for index, api in CONFIG  ~}
%{ if index!=0 },
%{ endif }

[WIDGET CODE HERE]

%{ endfor ~}

[...Outer container code continues here...]

このコードをCONFIGオブジェクトで反復します。それぞれの反復の際に、2つの変数が使用されます。

  • index:これは項目のインデックスで、反復が終了した後でループを終了するために使用します。JSON配列は、末尾カンマをつけず、有効である必要があります。
  • api:これは反復させる現在の設定項目で構成され、domainnameキーの値のペアが含まれます。api.domainapi.nameがダッシュボードの値に入力されます。

次に、New Relicダッシュボード向けの行を動的に作成する必要があります。New Relicダッシュボードは、列と行のグリッドで配置されています。ダッシュボードの各ウィジェットには、ページのどこに配置されるかを定義する列と行の値があります。もしそれぞれのウィジェットでこれを手動で設定すると、多くのコードを反復することになります。その代わりに、これを動的に行い、コードの繰り返しをしないで済むようにしましょう。

各サービスが、4行の高さのレイアウトでメトリクスを持ちます。1行目はサービス名です。2行目から4行目がメトリクスで構成されます。ここでひとつ、例をあげて解説しましょう。

項目のindexを使用すると、これを動的に表示させることができます。最初の項目は、インデックスがゼロのため、1行目から4行目を占めます。次に、各項目に4行が必要であるため、 (index * 4)という関数を使用して、項目を4倍にする必要があります。そのため、各項目の最初の行は(index * 4) + 1、2行目は(index * 4) + 2という形になっていきます。

以下が、タイトルウィジェットのレイアウトの例です。

"layout": {
	"column": 1,
	"row": ${(index * 4) + 1 },
	"width": 12,
	"height": 1
},

各行をどのように動的に作成するか、また各ウィジェットの静的な列のレイアウトの詳細については、テンプレートファイルのサンプルをご覧ください。

レイアウトが動的なものとなったので、今から各サービスのメトリクスも動的に作成していきましょう。 以下が、ダッシュボードが使用するNRQLクエリの例です。

"query": "SELECT count(*) as 'API Calls (last hour)' from Public_APICall where api='amazonaws.com' since 1 hour ago"

このクエリは機能しますが、これは“amazonaws.com”にハードコードされています。これを動的なものにするため、文字列の挿入を使用して、ハードコードされた値をCONFIG オブジェクトからの値に置換することができます。

"query": "SELECT count(*) as 'API Calls (last hour)' from Public_APICall where api='${api.domain}' since 1 hour ago"

ここで、api='amazonaws.com'が、api='${api.domain}'に更新されていることにご注目ください。ここではクエリが再利用でき、またループでそれぞれを反復するため、正しいNRQLクエリが各ドメイン名に作成されます。テンプレートファイルでサンプルをご参照ください。

また、API名が表示されるようにMarkdownウィジェットのコンテンツを変更する必要もあります。以下のようにハードコードされているものを、

"text": "# Amazon Web Services (amazonaws.com)"

ここでも、文字列の挿入を使用して動的なものにします。 

"text": "# ${api.name} (${api.domain})"

テンプレートファイルのサンプルで、これが変更されたことを確認できます。

4. ダッシュボードのリソースを作成する

次に、Terraformのリソースを追加し、テンプレートファイルのレンダリングされたアウトプットを使用してダッシュボードを作成します。次のコードがdash_composed.tfにあります。

resource "newrelic_one_dashboard_json" "composed_dashboard" {
     json = local.template_render
}

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

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

次に、Terraformの設定を適用します。ダッシュボードが、設定ファイル内の各APIのウィジェット行を表示するようになります。

5. 設定エラーのデバッグを行う

もしエラーが起こってダッシュボード作成が失敗したら、それはおそらくtemplatefileが無効なJSONコンテンツを作成したためです。特に、末尾カンマもしくはカンマの欠如に注意してみてください。レンダリングされたテンプレートファイルを画面に抽出してみることで、デバッグができます。これを検証して、そのカンマの欠如を見つけることができます。

これを行うためには、レンダリングされたtemplatefileへのdash_composed.tfに、以下を追加してください。

output "composed_dashboard_src" {
      value = local.template_render
}

Terraformでシンプルな設定から動的なNew Relicダッシュボードを作成する方法をご理解いただいたので、シンプルな入力で新しいダッシュボードをすばやく作成するのはさらに簡単だということがお分かりいただけると思います。しかし、上位5位のAPIを表示するダッシュボードを作成したい場合には、どうすればいいのでしょうか?これは少し話が違ってきます。行がつねに変動するからです。第3部では、変動するソースデータにもとづき動的なダッシュボードを生成する方法について学びましょう。