『Terraform: Up & Running』を読みました

年末年始の連休で『Terraform: Up & Running, 2nd Edition』を読みました。


モチベーション

某 SaaS の構成管理のため、試験的に Terraform を使っています。理由は「組織の拡大に対応するために 3 桁個の設定を追加することにしたから」です。設定の追加だけなら書き捨ての GAS で済ませる選択もあったのですが、その後のメンテナンスまで考えて Terraform を試してみるか、という判断をしました。

「設定のプロビジョニング」を最優先の目標とし、最低限の調査・検証をしてエイヤしたので「つまみ食いじゃなく、体系的に学んでおきたいな」、「これ、運用を意識したらどういう書き方にするんだろうなー」と常にモヤモヤを抱えている状態でした。機能自体は公式ドキュメントにしっかり書かれているんですけどね。こういうときはとりあえず書籍です。


(脱線) O'Reilly Online Learning がオススメ

去年からオライリー本が読み放題のサービス「O'Reilly Online Learning」を使っています。詳細は割愛しますが、ACM へ入会 (年間費 $99) することで同サービスが利用できます。仕組みや入会方法等の情報はこちらの記事が詳しかったです。(感謝です 🙇 )

オライリー本って気軽に買うにはちょっと悩んじゃう価格ですが、これなら気にせずにがんがん手を伸ばせます。


読書メモ

本書は実際に Terraform の定義ファイルを書き、AWS へ各種リソースをプロビジョニングしながら学ぶハンズオン形式となっています。

Terraform のバージョンが 0.12 の情報なので、最新バージョンの使い方はカバーできていない可能性がありますが「運用も意識して体系的に学びたい」という目的には問題なかったかなと思います。

1. Why Terraform

Chapter 1 では、Infrastructure as Code (IaC) の考え方について述べています。ざっくりまとめると「コード化することで、ソフトウェアエンジニアリングの手法を持ち込み、その恩恵を享受できる」でしょうか。以下については管理対象が SaaS であっても同様の効果がありそうだと感じました。

  • Speed and safety … 手作業よりも速く、正確に、再現性を高く保てる

  • Documentation … インフラの状態を誰もが読める表現でドキュメント化できる

  • Version control … Git で変更履歴を確認でき、問題発生時に元の状態に戻しやすくなる

  • Validation … 変更に対する事前検証を行える


IaC の分類の考え方も、自分がやりたいことを整理するうえで参考になりました。

  • Ad hoc scripts

  • Configuration management tools

  • Server templating tools

  • Orchestration tools

  • Provisioning tools

Terraform は Provisioning tools に該当するようですが、実際には単一のツールが複数の領域をカバーしていたりするので、ユースケースによって併用も含めて最善の選択をしていきましょう、と。


2. Getting Started with Terraform

ハンズオン形式で Terraform の仕組みや基本的な使い方が学べます。既知の情報も多かったので読むだけに留めたのですが、以降は本 Chapter で書いたコードに変更を加えながら進める形式が続くので、最初から書いときゃき良かったなと若干後悔しています。各 Chapter の最終的なアウトプットは GitHub で公開されているので、そちらを見て割り切りました。


3. How to Manage Terraform State

Terraform で管理しているリソースの状態を示す tfstate ファイルを複数人で共有する方法や、ファイル分割の粒度についてのノウハウがありました。特にファイル分割の考え方は読んでてよかったなと思います。環境 (prod, staging, dev)、コンポーネントの性質ごとに分割し、それに応じでファイルを管理するディレクトリも分割していきます。

これらの念頭にあるのは「安全性の担保」でした。その性質上 Infrastracture は事故ったときの影響が大きくなりがちなので、本格的に IaC をするならを安全な使い方の学習は必須ですね。


4. How to Create Reusable Infrastructure with Terraform Modules

Terraform をモジュール化しておくことで、安全な環境でテストがしやすくなり、検証が済み品質が担保されたリソースを再現性高く本番環境へプロビジョニングしやすくなります。本 Chapter では、リソース名の変数化や外部から参照可能とするための outputs ブロックの使い方が学べます。gotchas で運用上の落とし穴を紹介してくれているのも良いです。


5. Terraform Tips and Tricks: Loops, If-Statements, Deployment, and Gotchas

実際の運用シーンで使えるテクニックが紹介されています。

  • Loops

  • Conditionals

  • Zero-downtime deployment

  • Terraform gotchas

個人的には Loops が一番ありがたく、というのも冒頭で書いた 3 桁個の設定追加にこの機能が必須だったからです。Terraform には count, for_each, for と 3 つの Loop 機能があるのですが「どういうケースで何を使ったら良いか」の整理ができました。(最初から読んどきゃよかったー…)


6. Production-Grade Terraform Code

production レベルの Infrastracture を用意する際に必要な項目がチェックリスト形式で紹介されています。すぐに思いつくような install ~ Deploy に加えて、Scalability, Security, Metrics, etc … と運用フェーズまで意識された項目が並びます。本 Chapter では本番運用を考慮した Terraform のモジュール化・テストにフォーカスがあたっていました。


7. How to Test Terraform Code

Terraform におけるテストの考え方と方法について書かれています。 Infrastracuture 固有のテストの難しさ (ローカル環境でテストできない、デプロイに時間がかかる、Unit テストがしづらい) と、それぞれへのアプローチ方法を学べます。

自動テストには Go の testing package を利用することを知って「へ〜」でした。「本気で自動テストをやるつもりがないなら読み飛ばしてヨシ。やるなら気合をいれてコードを書け!!」と著者から発破をかけられるのですが、いつか戻ってくることを誓ってななめ読みだけ…


8. How to Use Terraform as a Team

最後はチームに IaC を導入・定着させるための考え方で締められています。

導入のために「IaC で何が実現できるか?」を説明するのではなく「この期間でできることはコレだけあるが、そのなかで IaC の導入を優先すべき理由を伝えろ」というのが良かったです。機会損失のお話ですね。

「Terraform を始めるなら、すべてのリソースを Terraform で管理しろ。チームの全員が使えるように学習の機会を設けろ。」もズドンとお腹に落ちました。「トラブルシュート等の非常事態に Terraform 以外の方法でリソースに変更を加える可能性を残すと、だんだん埃をかぶり始めて使われなくなる」という理由からですが、これはあらゆるツールの導入で共通する考え方だなと思いました。そのためにツールを使用するためのプロセス定義があるよ、ということで "A Workflow for Deploying Infrastructure Code" という形でデプロイまでの流れが紹介されています。


最後に

本書で Terraform の基礎知識をインプットでき、運用の流れもおぼろげですが想像できる状態になったので、Terraform の技術ブログも読みやすくなりました。これから Advent Calendar も拝見しようと思います。


IaC は「高速にプロセスをまわすなかで、可能な限りリスクを減らして再現性を高める」が一つの目的なので、その点においては Application も Infrastracture も SaaS も違いは無いかなと思います。IaC を追いかけつつ、SaaS の Configuration as Code を試していきます。

いただいたサポートは記事を書くためのエネルギー(珈琲、甘いもの)に変えさせていただきます!