Terraformドキュメントをコマンドで見るツールをGoで作る

クラウドサービスのリソース管理をコード化できるTerraform、とても便利に使っているけれど、リソースの種類によって当然ながら書くべき内容が異なりなかなかスムーズに書くことができない。

Provider: AWS - Terraform by HashiCorp

例えば自分がよく使うAWSだけでも、このリンク先に書かれているだけのリソースの種類、書き方がある。そして機能やサービスが増えるごとに、リソースの書き方もどんどん多様化していく。今はこれをいちいちウェブ上で書き方を確認しながらTerraformを書いているんだけど、ちょっと手間が多いなという気がしてきた。

同様にInfrastructure as CodeのツールであるAnsibleには、ansible-docというコマンドがあって、ドキュメントをコマンドライン上で見ることができるようになっている。

$ ansible-doc file
> FILE    (/usr/local/Cellar/ansible/2.5.0/libexec/lib/python2.7/site-packages/ansible/modules/files/file.py)

        Sets attributes of files, symlinks, and directories, or removes files/symlinks/directories. Many other modules support the same options as the `file'
        module - including [copy], [template], and [assemble]. For Windows targets, use the [win_file] module instead.

OPTIONS (= is mandatory):

- attributes
        Attributes the file or directory should have. To get supported flags look at the man page for `chattr' on the target system. This string should contain
        the attributes in the same order as the one displayed by `lsattr'.
        (Aliases: attr)[Default: None]
        version_added: 2.3

- follow
        This flag indicates that filesystem links, if they exist, should be followed.
        Previous to Ansible 2.5, this was `no' by default.
        [Default: yes]
        type: bool
        version_added: 1.8
...

これに類似したものがTerraformにあれば、ブラウザとターミナルを行き来する必要がなくなる。でも探した限りそういうツールはなさそうだったので、自分で作ることにした。

tfdoc

chroju/tfdoc

まだ全然作り始めたばかりだけど、とりあえずリソース名を指定して実行すると、スニペットを吐き出すところまでは出来た。こんな感じで出力される。

$ tfdoc aws_iam_user
resource "aws_iam_user" "sample" {

  // (Required) The user's name. The name must consist of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: =,.@-_.. User names are not distinguished by case. For example, you cannot create users named both "TESTUSER" and "testuser".
  name = ""

  // (Optional, default "/") Path in which to create the user.
  path = ""

  // (Optional, default false) When destroying this user, destroy even if ithas non-Terraform-managed IAM access keys, login profile or MFA devices. Without force_destroya user with non-Terraform-managed access keys and login profile will fail to be destroyed.
  force_destroy = ""
}

Terraformのドキュメントはウェブで公開されているHTML以外の形式がなさそうだったので、そこからスクレイピングして整形して吐くだけの簡単な実装になっている。とはいえ案外こういうきちんとしたサイトでも、書式が揃っていないところがあったりして、やっぱりスクレイピングはしんどいなぁという感じではあったのだけど。。

出力はスニペットだけじゃなくて、先に挙げたansible-docと同様にドキュメントの体裁でも行いたいので、そういう機能も少しばかり付けられたらなと思う。

Go

tfdocを作るにあたっては、初めてGoを使った。まだ勉強中なのでちゃんと使えると言える段階には無い(ソース見ればわかると思うが)けど、tfdocを作る中で習得していきたい感じ。

Goを選んだのにはいくつか理由があるけれど、クロスコンパイルが出来て様々な環境に合わせたバイナリが生成出来たり、それでいて文法的な難易度が高くはない(という評判を聴いている)のが大きかった。

今は仕事だと主にPythonでツールを書くことが多いのだけど、古いサーバーだとPython2が入っていたりpipが無かったり、環境依存が大きくて困ることが多い。バイナリを置けばインストールが終わるというのは非常に助かる。

難易度の話は、ほぼLLしか経験のない自分にとってはポインタが少しハードルにはなったりして、サクッとすぐ書けるようになるというわけにはいかなかった。元々『Goならわかるシステムプログラミング』でGoの習得を考えていたものの、その点で一旦停まってしまっている。

Goならわかるシステムプログラミング
渋川よしき
Lambda Note
売り上げランキング: 32,638

その後に Treasure 2017 の研修資料は Go を学ぶのに最高だった - kakakakakku blog で言及されている、 VOYAGE GROUPが公開している Go入門 をやってみて、改めて入口に立った。

レファレンスは GoDoc があれば十分という話もあるが、1冊本で手元に置きたい気持ちもあったので、『プログラミング言語Go』を買ってみている。海外だと「Blue book」と呼ばれて、これがバイブル扱いされているっぽい。ただ、実際紐解くと本職インフラエンジニアのなんちゃってプログラマーには少しむずかしい。

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
Alan A.A. Donovan Brian W. Kernighan
丸善出版
売り上げランキング: 19,223

長らくブログもちゃんと更新できていなかったけど、何かを作りたいというモチベーションがあると勉強も進みやすいとわかってきたので、来月いっぱいぐらいはtfdocを形にすることを目指していきたい。TDDがやりやすい仕組みになっていたり、gofmtがコーディングを助けてくれたり、Goにはプログラミングの習得速度を加速してくれる機能が多い。これを進めることで得られるものが多そう。