Terraformを導入した話

ここ最近の話ですが、Terraformを社内に導入しました。 現在の会社に入社して以来、自分はこれまで既に設計されたものを実装していったり、あるいは既に稼働しているサービスに変更を加えるということしか行ってこなかったため、今回初めて技術選定・導入を行ったことになります。

少し話は変わりますがつい数ヶ月前、自社のサービスのアーキテクチャや使用しているツールについて軽く話す機会があった際、「どうしてこのツール/サービスを使っているの?」という質問に対してしどろもどろになってしまった部分があり、普段自分がいかに社内で使用されているサービスやツールについて「なぜこれを使っているのか」を意識せずに使用しているかを痛感させられました。 その後設計を行った同僚たちに話を聞いたのですが、やはり全てのことにきちんと理由があり、いろんな選択肢の中から選択した結果なのだということを理解しました。

そういった背景があった中で今回IaCツールの技術選定 & 導入を行い、個人的には良い経験ができました。 なので、なぜこの選択をするに至ったのかという整理のために、他にも似たような状況になった人の参考になるように記事にまとめてみることにしました。

背景

これまでの状況

基本的にインフラ構築は手順書を用意し、そこに書かれている指示に沿ってコマンドを実行して行っていました。 社内ではGCPをメインに使用しておりgcloudコマンドを使用すれば特に問題なくインフラが構築できることや、一度作成した環境は基本的に変更を行わないという前提があったためこのような運用になっていたようです。

最近の状況

近頃、社内ではエンジニアの割合に対して分析職のメンバーの割合が増えつつあることや、一度作成した環境に対してGKEのノードプールのマシンタイプを変更したいという要望が出るなど、あまりインフラ面に工数をかけていられないにもかかわらず要望は増えているという状況でした。 また、要望に対してエンジニアの人手が足りていないことから分析職のメンバーが環境構築を行わなければならないという状況も発生しつつありました。

これらのことから、現在社内ではインフラ構築のコストや難易度を下げることと、環境の変更履歴を管理し、安全に破棄&再構築できる仕組みが求められていると考えました。

ツールの選定

自分が今回ツールを選定する際の観点として重視していたのは、

  • インフラに関する知識がないメンバーでも気軽に環境を構築できること。できればデプロイとかも自動化できるとよい。
  • IaCに慣れたメンバーがいないため、学習コストが低い方がよい。

検討したこと

1. Terraform + Ansibleを使用してインフラ構築と構成管理を行うガチガチIaC導入

最初とりあえずTerraformを触ってみていたのですが、簡単にインフラを立ち上げることができることはできるもののデプロイ作業などにはあまり向いていないのではと感じました。調査をしているとTerraformはクラウドインフラストラクチャオーケストレーションツール、Ansibleは構成管理ツールとして組み合わせて使用する方法があるということを知りました。 そこでAnsibleも触ってみたのですが、1日触ってみてなんとなく雰囲気は掴めたもののこれはあまりに学習コストが高いということでこの仕組みを導入するのはやめました。

2. Terraform + fabricを使用してインフラ構築 & リリース作業自動化

同僚曰く、前職でfabricを使用してリリース作業を自動化していたという話を聞いたため、検討してみました。 しかしfabricにはfabric1とfabric2がありそれぞれでかなり挙動が違い、その上最近はあまり使われていないツールなのかググるとfabric1とfabric2の情報が同程度出てきてしまいます。 このためエラーが発生した際に誤ってfabric1の情報を参照してしまい、トラブルシューティングが困難になってしまうと考えました。 もちろん公式ドキュメントを確認すればよいとは思うのですが、それもそれで分析業務のメンバーが片手間にやるにはあまりにコストが高いと感じました。 これらの理由から、これも不採用としました。

3. Terraformでインフラ構築を自動化 & デプロイはこれまで通り手動

本音を言えばもちろんデプロイも自動化したかったですが、手動でコマンドを打つやり方だと面倒&ミスが起こるかもという問題はあるものの、技術職のメンバーであれば基本的に誰でも難なくできる作業であるため、学習コスト&メンテナンスコストを考えた時にあまりメリットがないという風に感じました。 最終的にはこの方法を選びました。

まとめ

個人的には欲張りすぎて運用が大変になることもなく、かつある程度は業務の負担を軽くすることができたかなと感じています。 ただ、反省点はいくつかありました。

  1. もう少し技術選定のやり方などを調べながら進められればよかった。
  2. すぐに他のメンバーに仕事を引き継がなければならず経過を観察することもできないような状況の中で新しいツールを導入することが、果たして妥当であったかどうか。

1.についてですが、セオリー的に考慮しなければならない要素をいくつか見落としていたのではないかという懸念を感じました。今回はあまり時間がないという状況の中でスクリプトの実装まで行わなければならないというスケジュールであったためこのようなことになってしまいましたが、次回ツールの選定を行う時はセオリーを学びながら、考慮しなければならないポイントを洗い出しながら進めていくようにしたいと感じました。

2.についてですが、いろいろあってあまり先まで面倒を見ることができないという状況で新しいツールを導入することが本当に正しいのかという疑念が残りました。難しい状況の中での今回の導入はそこまで間違っていないとは思うのですが、本来はちゃんと自分が導入した技術・ツールについては少なくとも安定して運用していけるようになるまでは責任を持って面倒を見ていかなければならないなと感じました。