概要
IaCとは
Infrastructure as Code (IaC) は、インフラストラクチャの管理をプログラム的に行うアプローチでコードで定義された設定を使用してクラウドリソースやオンプレミスの環境を構築・管理します。特にDevOpsやSREなどのインフラ管理関連の文脈でよく使われる用語であり、デベロッパーであっても一定の理解があることが望ましい概念です。
IaC利用のメリットの1つは冪等性(何度実行しても同じ結果が得られること)が担保されることです。これにより開発、テスト、本番環境など複数の環境でインフラ構築を簡単に再現することができます。また設定がコードで管理されるため、変更の追跡やバージョン管理が容易であることもメリットの1つと言えます。
一方、デメリットしては学習コストの高さが挙げられます。IaCによるインフラ構築を実現するためにはツールの習得に加え対象インフラの理解(AWSやAzureなど)が必要となるため使いこなすまでに時間がかかる可能性があります。
個人的なIaC利用のメリットとしては、設定ミスのチェックしやすい、開発ライクで作業のしやすいことが挙げられます。1つ目のメリットについて、コード実行後にリソースを手動確認することでコードとインフラ設定をダブルチェックできるため、手動設定に比べミスを減らすことができています。もう1つのメリットについてはコードを書いて画面で確認という普段のアプリ開発と近い感覚で作業ができるため、慣れると手動設定に比べて作業しやすいと感じています。
IaCツール
通常IaCと言った場合、コードでリソース作成を制御するツールを指します。IaCツールの代表格としてはクラウドベンダー非依存のTerraformやAWS公式のIaCサービスであるCloudFormationなどが挙げられます。
しかしIaCツールは他の様々なツールと組み合わせて利用することでインフラ管理を効率的に行うことができます。下記のインフラ管理ツールと役割を簡単に押さえておくことで技術選定がスムーズに行うことができるでしょう。
- リソース管理
- Terraform、AWS CloudFormation
- OSイメージ管理
- Packer、Vagrant
- サーバー内の環境構築管理
- Ansible、Chef
- CI/CD
- AWS Codepipeline、GitHub Actions
- コンテナ管理
- Docker
Terraformとは
TerraformはHashiCorpによって開発されたオープンソースのInfrastructure as Code (IaC) ツールで、インフラストラクチャをコードとして管理し、クラウドプロバイダやオンプレミスの環境に対して一貫して構築、変更、バージョン管理を行うことができます。
主要なクラウドサービス(AWS、Azure、Google Cloudなど)のリソースを管理・プロビジョニングするために使用されることが多いツールですが、他にも多くのプロバイダをサポートしています。特に複数のクラウドサービスを利用する環境においては有益なツールと言えます。
Terraformの仕組みと基本用語
仕組み
Terraformを理解する上で処理の全体像を把握することは重要です。下図はその概要がわかりやすく図示されています。ここではplan、applyなどのterraformコマンドを実行するとTerraformCoreを通じて各種クラウドサービスリソースが制御されること、.tf
ファイルと.tfstate
ファイルでリソースを制御していることを理解するとよいでしょう。
キャディ株式会社, CADDi Tech Blog
ステート
Terraformではインフラ設定の記述は.tf
ファイルに記述し、.tf
ファイルの内容と実際のリソースとの対応を保持しているのがステートになります。実際にはリソース実体の情報を.tfstate
ファイルで管理します。
AWSのEC2を例に挙げると、EC2のセキュリティグループやインスタンスタイプなどの設定内容は.tf
ファイルに記述し、実際に作成されるEC2のarnなどの情報が.tfstate
ファイルに書き込まれます。
プロバイダー
Terraformにおけるプロバイダーとは、インフラを管理する対象プラットフォームのことで具体的にはAWSやAzureなどのクラウドサービスを指します。プロバイダーを複数設定することでAWSとAzureのリソースを同時に管理することが可能になります。
バックエンド
Terraformにおけるバックエンドとは、tfstateファイルの保存先のことを指します。バックエンドを切り替えることでさまざまな方法でtfstateファイルを管理できます。デフォルトではローカルに.tfstate
ファイルが保存されますが、設定を行うことでS3などのストレージに保存することが可能になります。
個人開発では.tsstate
ファイルをローカルで管理しても問題ないと思いますが、チーム開発でterraformを利用する場合はなるべく共有ストレージで.tsstate
ファイルを管理する方がよいでしょう。
.tfファイルの記述
ブロックタイプ
.tf
ファイルはHCL(HashCorp Configuration Language)と呼ばれる言語で記述することができます。
ブロックタイプ | 説明 |
---|---|
provider | プロバイダの設定を記述する |
resource | クラウドサービス上のリソースを定義する |
locals | リソース内で使用する変数を定義する |
variable | 外部から設定可能な変数を定義する |
output | リソースやモジュールの出力を定義する |
module | 他のモジュールの読み込みを指示する |
data | Terraformが管理しないリソースの参照を定義する |
Standard Module Structure
Terraformではリソースをまとめて管理することをモジュールと呼びますが、そのモジュール管理のベストプラクティスとしてStandard Module Structureという考え方を提唱しています。この考え方ではフォルダ、ファイル構成を提案しています。参考までに下記のコードはTerraform公式から引用したものになります。下記の構成は最小限のモジュール管理用構成になり、README.md
はterraformで管理するIaCの概要説明を、main.tf
は具体的なリソースの設定記述を、variable.tf
は変数の管理を、outputs.tf
は出力の管理を行うファイルとなり、記述内容がなかったとしても作成するのが望ましいです。
Terraform, Standard Module Structure$ tree minimal-module/ . ├── README.md ├── main.tf ├── variables.tf ├── outputs.tf
基本コマンド
Terraformの基本コマンドは下記の4つ(init
、plan
、apply
、destroy
)になります。
init
コマンドでは、.tf
ファイルの内容をチェックし必要なプロバイダやモジュールのダウンロード、バックエンドの初期化などを行います。plan
コマンドでは実際に作成するリソースのチェックを行い、apply
コマンドで実際にリソースの作成・変更・削除を実施します。destroy
コマンドは作成したリソースの全てもしくは一部を削除するためのコマンドになります。
まとめ
本記事ではTerraformを理解する上で必要な基礎知識を解説しました。この記事で解説した内容を理解することでTerraformによるインフラ構築がスムーズになると思います。本記事でぜひ理解を深めてくださいね!