👻

Terraformとは何かざっくり調べる

2025/02/14に公開

Terraformを使うと、今まで手動で「ぽちぽち」と設定してことを、コードで管理できるようになります。Terraformは、インフラストラクチャをコードで管理するためのツールで、AWS、GCP、Azureなどのクラウドプロバイダーだけでなく、DockerやGitHubなどのツールとも連携できます。いわゆるInfrastructure as Code(IaC)の一つです。

「ぽちぽち」によるインフラの構築の課題とIaCのメリット

これまでのインフラ構築は、GUIを操作して設定を行うことが一般的でした。しかし、この方法にはいくつかの課題があり、IaCを導入することでそれらの課題を解決することができます。

インフラ構成の透明性
設定がGUIで行われるため、どのような設定がされているかが分かりにくいです。コード化すると、設定内容が一目で分かるため、透明性が高まります。

ヒューマンエラーのリスク
人間が手動で設定を行うため、設定ミスや漏れが発生する場合があります。コード化することで、設定内容を確認や静的解析が可能になり、ヒューマンエラーを減らすことができます。

再利用性
開発環境、ステージング環境、本番環境など、同じ環境を複数作成することは頻繁に発生します。手動で設定を行うと、同じ設定を何度も行う必要があります。コード化することで、設定を再利用することが可能になります。

バージョン管理
手動で変更が行われていると、過去にどのような設定が行われていたかを把握するのが困難です。コード化しgitなどでバージョン管理することで、過去の設定内容を確認することができます。

属人化
手動で設定を行うと、設定内容が開発者や運用者に依存してしまいます。もし、その人が退職した場合など、他の人が設定内容を理解するのが難しいです。ぴえんです。 コード化することで、設定内容がコードとして共有されるため、属人化を防ぐことができます。

Terraformの特徴

IaCが有用なことが分かったと思いますが、Terraformは他のIaCツールと比べてどのような違いがあるのでしょうか?

命令型と宣言型

IaCツールには、命令型と宣言型の2つのアプローチがあります。命令型は、手順を記述していくスクリプト言語のような形式で、手続き的にインフラを構築します。一方、宣言型は、どのような状態にしたいかを記述し、IaCツールがその状態になるように自動でインフラを構築します。

命令型の場合、手動で行っていた設作業をそのままスコードに落とし込んでいくため、直感的に理解しやすいというメリットがあります。しかし、手順が書かれているため、2度実行すると異なる結果になる可能性があります。10個リソースを作成するコードを2回実行すると、20個リソースが作成されてしまうかもしれません。一方、宣言型は、最終的な状態を明確に記述することができるため、IaCツールが最適な手順でインフラを構築してくれます。Terraformは、宣言型のIaCツールです。そのため、最終的な状態を明確に記述することができます。

言語の選択

IaCツールには、様々な言語があります。ChefやPuppetはRuby、AnsibleはYAML、CloudFormationはJSONやYAML、TerraformはHCL(HashiCorp Configuration Language)という独自の言語を使用しています。それぞれの言語には、特徴やメリットがあります。

RubyやTypeScriptなどは、命令型であるため手続き的な記述になりますが色々とメリットもあります。まず、ツールが充実しています。ライブラリや開発環境、テストなどは、RubyやTypeScriptの方が充実しています。また、RubyやTypeScriptは、プログラミング言語としての機能が豊富で、複雑な処理を行うことができます。 一方、YAMLやJSONは、宣言型であるため、最終的な状態を記述することができますが、記述が冗長になりがちです。Terraformは、言語を新しく覚えるにしては容易であり、YAML、JSONよりも読みやすく、記述が簡潔になります。

エージェント・エージェントレス

IaCツールには、エージェント型とエージェントレス型があります。エージェント型は、エージェントと呼ばれるプログラムをインストールしておく必要があります。エージェントレス型は、エージェントをインストールする必要がなく、リモートでコマンドを実行するだけでインフラを構築することができます。Terraformはエージェントレス型のIaCツールです。

エージェントがあることで、リアルタイムで状態を監視したり、リアルタイムで変更を適用することができます。一方、エージェントレス型は、エージェントをインストールする必要がないため、エージェントのセットアップや管理が不要で、サーバーのリソースの消費が少なく、外部との通信が発生しないためセキュリティ上の考慮が不要です。

コミュニティ

便利だけどニッチすぎると、検索しても情報が見つからないことがあります。Terraformは、検索してみると色々見つかるので、情報が豊富です。また、公式ドキュメントも充実しているため、悪くないと思います。githubのstar数も多いので、コミュニティが活発であることがわかります。

他のIaCツールとの比較

Terraformは、他のIaCツールと比べてどのような違いがあるのでしょうか?

CloudFormationとの比較

項目 Terraform CloudFormation
言語 HCL JSON/YAML

可読性
Terraformは、HCL(HashiCorp Configuration Language)という独自の言語を使用しています。HCLは、YAMLやJSONよりも読みやすく、記述が簡潔になります。一方、CloudFormationは、JSONやYAMLを使用しているため、記述が冗長になりがちです。
Terraformのほうが、読みやすいです。

クロスプラットフォーム
Terraformは、AWSだけでなく、GCP、Azure、Docker、GitHubなど、さまざまなプラットフォームと連携できます。一方、CloudFormationは、AWSに特化しており、AWS以外のプラットフォームとの連携が難しいです。
今だと、AIが流行っていて、AWS以外にAzureを使いたい場面があると思います。その場合、Terraformの方が便利です。

状態管理
Terraformは、ステートファイルがあることで、設定が変更されたとしても、terraform planで変更点を確認することができます。一方、CloudFormationは、そのような機能がないため、変更点を確認するには手動で管理画面を確認する必要があります。

参考

Discussion