My External Storage

Dec 11, 2020 - 5 minute read - Comments - go terraform

TerraformでPixelaのグラフを宣言できるProviderを作った #pixela

PixelaのTerraform Providerを作った。

TL;DR

terraform {
  required_providers {
    pixela = {
      versions = ["0.0.5"]
      source   = "github.com/budougumi0617/pixela"
    }
  }
}

provider pixela {
  // Pixelaに登録したユーザー名
  username = "budougumi0617"
}

resource "pixela_graph" "sample" {
  graph_id              = "sample"
  name                  = "update from terraform"
  unit                  = "page"
  type                  = "int"
  color                 = "ajisai"
  timezone              = "Asia/Tokyo"
  self_sufficient       = "none"
  is_secret             = true
  publish_optional_data = false
}

Pixelaとは

Pixelaは@a-knowさんが作っているGitHubのContributions風のグラフを生成するWebサービスだ。

APIを手順通りに叩けば、任意のデータを記録できるグラフを生成できる。

https://pixe.la/v1/users/budougumi0617/graphs/egiu (これは休止している私の英語学習記録グラフ…)

また、PixelaはREST風のAPIを使って操作するのが基本で、APIドキュメントも公開されている。

Terraform Providerとは

Terraformは宣言的にリソースを管理するためのツールだが、TerraformはProviderと呼ばれるプラグイン経由で各リソースを操作している。

たとえば、AWSだったらTerraformはAWS Providerを使ってAWS上のリソースを操作している。 TerrformはSDKが公開されているので、自分で好きなProviderを実装し、Terraform registoryに公開することができる。

Terraform Provider Pixela

リソースがあって、CRUDのAPIが用意されていればTerraform Providerをつくることができる。 こうして今回つくったのがPixela Providerだ。

Registryにも公開済みだ。

使い方

使いかたはTerraformを使ったことがあれば簡単で次のような宣言でグラフを生成できる。 なお、terraform applyするとき、PIXELA_TOKEN環境変数にトークンが設定されている必要がある。

terraform {
  required_providers {
    pixela = {
      versions = ["0.0.5"]
      source   = "github.com/budougumi0617/pixela"
    }
  }
}

provider pixela {
  // Pixelaに登録したユーザー名
  username = "budougumi0617"
}

resource "pixela_graph" "sample" {
  graph_id              = "sample"
  name                  = "update from terraform"
  unit                  = "page"
  type                  = "int"
  color                 = "ajisai"
  timezone              = "Asia/Tokyo"
  self_sufficient       = "none"
  is_secret             = true
  publish_optional_data = false
}

技術的な話

Terraform Providerは実装からテスト、リリースまでドキュメントを読みながら実装すれば簡単に作ることができる。
参考ドキュメントと少しハマったところを紹介しておく。

Terraform Providerの作り方

Providerの作り方は公式ガイドを参考にしながら作ることができる。

また、次の雑誌でも日本語でProviderの作り方が公開されている。

リリースの仕方

Terraform Providerを作ったらレジストリにも登録することができる。 こちらも手順通りにやればよい。

テストの書き方

Terrformは受け入れテスト(実際にリソースを作って確認するテスト)もSDKで簡単に作ることができる。
次のドキュメントを読みながら実装することができた。

ユニットテストは次のように書くことができる。

少しハマったところ

Goをやっていれば型を使って実装をするだろう。
Terrform Providerを実装するさいは型(構造体)を使って結果を取得しても、そのあとは構造体フィールドをひとつひとつセットしないといけないようだった。

func resourceGraphRead(_ context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
	// Warning or errors can be collected in a slice type
	var diags diag.Diagnostics
	client := m.(*pixela.Client)

	g, err := client.Graph().Get(&pixela.GraphGetInput{ID: pixela.String(d.Id())})
	if err != nil {
		return diag.FromErr(err)
	}
	if err := d.Set("graph_id", g.ID); err != nil {
		return diag.FromErr(err)
	}
	if err := d.Set("name", g.Name); err != nil {
		return diag.FromErr(err)
	}
	if err := d.Set("type", g.Type); err != nil {
		return diag.FromErr(err)
    }
    // ...

また、レジストリ登録時に少しハマったが、ちゃんと手順通りにやっていれば問題ない(完全に私が悪かった)。

Special Thanks…

1.20.1以前のPixelaはグラフ単体のJSON情報を取得することができなかった。
なので@a-knowさんにリクエストしてエンドポイントを増やしてもらった。大感謝…

https://github.com/a-know/Pixela/releases/tag/v1.21.0

終わりに

PixelaをTerrformで使うためのProviderを作った。ProviderはPixelaのAPI操作に3rdパーティのライブラリを使っているのだが、少し使い方が合わないのでも自作ライブラリを作って差し替える予定。
グラフにプロットするPixel自体もサポートしようかなとと思うが、毎回terraformでプロット打つのはちょっと違うかなと思っているので、Provider自体はどうやって機能拡張しようか考えている。

他にもteraformサポート外のAPIを見つけたらProviderを書いてみたい。

参考

関連

関連記事