前回はconsulの感想について書いたけど、今回はterraformについて書いておく。

terraformはインフラ環境を構築するためのツールで、terraformを使うことでインフラ環境の構築を、設定ファイルとしてバージョン管理できるようになる。
自分はAWSで使ってたが、GCPやHerokuなどさまざまなインフラ環境の構築に使える。

AWSならCloudFormationを使うと、似たようなことができるのかな?使ったことないのでよく分からないが、後輩はCloudFormationの方がいいかもと言っていた。

terraformを使ってよかったところ

terraformを使うと、たとえばAWSでSecurityGroupを作って、RDSを立ち上げて、EC2を立ち上げるときに、前に設定したSecurityGroupを割り当てて、EC2内の環境変数にRDSのアドレスを設定して・・・みたいなことが比較的カンタンにできる。

設定方法は、日本語の記事だと以下が分かりやすいかな。

あとは、terraform applyというコマンドで実際に構築するまえに、terraform planというコマンドで何が変わるか確認できるので、安心して実行できる。

依存関係も見てくれるので、EC2の設定の中でRDSのアドレスを参照していれば、その依存関係を考慮して実行してくれる。

terraformの設定ファイルをgitで管理していたので、インフラの構成の変化がバージョン管理できる点が一番よかったと思う。設定を変えたらプルリク出してレビューしたり、terraform planを見てレビューしたり、といったことができた点がよかった。

terraformを使うときに気をつけるところ

terraformも万能ではないので、いろいろ気をつけるべきことがある。自分がハマったところを書いておく。

terraformでconfigurationをやらない方がいい

terraformでインフラを作るまでは良いのだが、その後EC2サーバ内の、たとえばnginxのconfを設定したり、いろいろサービスを動かすための設定をサーバ内ですることになると思う。terraformにはProvisionerという仕組みがあり、remote-execを使えばいろいろ設定することができるので、これを使っていろいろ設定を行っていた。でも最終的には、かなりの部分をremote-execからシェルスクリプト実行するような形になってしまった。

その場合、何か設定を変えたくてシェルスクリプトの内部を変えてもterraform的にはインフラに差分が出ないため、terraformを再実行してもシェルスクリプトは再実行してくれないので、あまりいい方法とは言えなかった。

chefを使えるなら、terraformのchef provisinerを使うのがいいかもしれない。自分の場合はchefは使いたくなくて、ansible provisinerが来るのを期待して待っていたけど結局まだ来ていない。 chefを使わないなら、terraformでは環境変数の設定くらいまでにして、configurationは別のツールを利用するのがよさそう。その場合、たとえばansibleを使うなら設定するためのサーバの情報をどうやって得るのか検討する必要があり、それはそれで難しそうなので悩ましい。

terraform planを信じられない

うえではterraform planで何が変わるか分かるか安心、と書いたけど、実際に terraform applyしてみると、planとは違うことが起きることがある。ちょっと具体例がすぐに思い出せないが、過信しないほうがいい。

terraformで設定できない部分がある

AWSのインフラをコード化できるterraformだが、出来ない部分もある。
自分が使っていた時は、cloudfrontやlambdaが設定できなかったが、今見たらできるようになっていた。まだelastic transcoderはできない。 また、AWSに新たに追加された機能も、terraformが対応するまでしばらく時間がかかる。そのような時には、terraformの管理とは別に設定する項目が発生するので、気をつける必要がある。

インフラの状態を変えるときに制限がある

最初に環境を作る際には問題がないのだが、terraformで作った環境を、サービスを動かしながら変化させたいとき、いろいろとハマることがある。 例えば、EC2インスタンス2台をterraformで管理していたが、そのAMIを更新したので入れ替えたい、とする。新しいAMIで2台追加して、ELBをそっちに向けて、古い2台を止める、みたいなことをやればいいのだが、これをterraformでやろうと思うと難しかった。

tfstateの管理に気をつける

terraformで作ったインフラの状態は、tfstateというファイルで管理される。
これをS3において管理していたが、設定ミスや何かの手違いがあったとき、本来のインフラ環境とtfstateがズレてしまったりすることがあった。terraformが悪いのではないが、チームとしてどう運用するのか、ちゃんとやっておかないと、苦労するかも。

まとめ

個人的には、terraformなかなかよかったと思う。インフラをファイルで管理できるというのは、再構築もすぐできるし変化も追えるしいろいろと安心感があった。比較したことないので、なんとも言えないけどAWSだけを考えるとcloudformationの方がいいのかもしれない。 個人的に一番の問題は、configurationをどうやるのか。chefとの連携以外にもいろいろ提供してもらえるとよかったと思う。 ansibleのproviderでも書いてみるかと思って一時期コードを見ていたが、いろいろ難しそうでやめてしまった。

去年qiitaに書いた記事も一応載せておく