# Terraformerになるための道.01 Terraformとは？

背景
---
昨年から新しい社内システムを構築しています。これまでのインフラストラクチャの構築は完全に手動で行われ、IaC（Infrastructure as Code）に関連するアプローチは導入されていませんでした。新しい社内システムの開発において、IaCなどの概念を取り入れて、これまでの開発スタイルからよりモダンなアプローチに移行することを意識しました。

Terraformとは？
---
今更ですが、Terraformとはなんですか？
<div align="center">
<img src="https://www.datocms-assets.com/58478/1640019487-og-image.png" width=50%>
</div>

Terraform（テラフォーム）は、インフラストラクチャ（基盤）をコードとして管理するためのソフトウェアツールで、DevOpsチーム（基盤チーム）が再利用可能で共有可能、人間が読みやすい構成ファイルを使用してインフラストラクチャのプロビジョニングを自動化できるものです。このツールは、オンプレミス環境とクラウド環境の両方でインフラストラクチャのプロビジョニングを自動化できます。今回の社内システムは完全にTerraform ＊ AWSクラウドで構築することにしました。

TerraformとIaCの関連性
---
<div align="center">
<img src="https://www.zentao.pm/file.php?f=zentaopm/202209/f_841f9ba1756edbba1cd2e44d4fb5a6dc&t=jpg&o=&s=&v=1663736948" width=50%>
</div>
インフラストラクチャ・コード（IaC）は、プログラムを通じてITインフラストラクチャをプロビジョニングおよび管理するプラクティスです。人間によって手動で各必要なリソースが手動で構成される手動のインフラストラクチャ管理とは対照的に、IaCを使用することで、DevOpsチームは必要なリソースをプログラムで自動的に管理、監視、プロビジョニングできます。　

　
Terraformを使用することで、基盤チームはインフラストラクチャ（基盤）のすべてのコンポーネントをコードの形で記述し、プロビジョニングできます。このコードは設定ファイルに存在し、簡単に共有、再利用、バージョン管理できます。これらにより基盤のライフサイクルを管理するための一貫したワークフローを作成するのに役立ちます。ワークフローについてはまた別の記事で説明します。


Terraformの設定ファイルは宣言的であり、インフラストラクチャ（基盤）の最終状態を記述します。別の言い方で表現すると、構築基盤はどんな姿になりたいかを設定するものです。このツール自体がベーシックなロジックを処理し、必要なインフラストラクチャリソースを作成するための手順を記述する必要がなくなります。コンソール画面に手動でぽちぽちした手作業は全部ベーシックなロジックで代替されます。ここはIaCの真髄かと思います。

Terraform使用するメリット
---
Terraformを使用し、クラウドプラットフォームやAPI（サービスのアプリケーションプログラミングインターフェース）をコード化し、基盤チームが以下の作業を簡単に行えるようになります。

・　クラウドプロバイダ（例えばAWS、GCPなど）からリソースをプロビジョニングできる
・　基盤のセキュリティとコンプライアンスを標準化された状態で使用できる
・　設定ファイルの共有、再利用、バージョン管理が簡単に行える
・　Terraformの定義コードはCICDなどのシステムで管理し、ワークフロー化できる

もうちょっと詳しく説明すると、ストレージ、ネットワーキングリソースなどのコンポーネントや、DNSエントリなどの高レベルコンポーネントをTerraformで管理できて、セキュリティポリシー、ファイアウォールポリシーやデータベース、サーバーのプロビジョニングの自動化にも使用できます。

Terraformの使用手順
---
Terraformの使用手順は、以下のステップに基づいています。

1. 設定ファイルの作成: 
Terraformを使用してプロビジョニングしたいインフラストラクチャリソースを定義する設定ファイル（.tf拡張子を持つファイル）を作成します。この設定ファイルには、どのプロバイダ（クラウドプラットフォーム、オンプレミスシステムなど）を使用するか、どのリソースを作成するか、リソース間の依存関係などが記述されます。

2. 環境の初期化（Init）: 
設定ファイルが完成したら、Terraformを初期化します。コマンドラインから ```$ terraform init``` を実行することで、Terraformは必要なプラグインやモジュールをダウンロードし、プロジェクトのディレクトリをセットアップします。

3. プラン（Plan）の作成: 
```$ terraform plan``` コマンドを実行して、Terraformがどのようにインフラストラクチャを変更またはプロビジョニングするかを計画します。このステップでは、Terraformは変更内容を要約した実行計画を提供しますが、実際には変更を加えません。

4. プラン結果の確認: 
プラン結果を確認し、変更内容が予想通りかどうかを確認します。このステップで問題がある場合、設定ファイルを調整して修正できます。修正後再度2. 初期化からやり直します。

5. 適用（Apply）: 
```$ terraform apply``` コマンドを使用して、Terraformに実際に基盤環境への変更を適用させます。このステップでは、Terraformは計画に従ってリソースを作成、更新、または削除します。変更内容はユーザーによる承認が必要です。パイプラインで自動化する場合は自動承認オプションを使用してユーザー承認をスキップできますが、誤作動防止のため、代わりとしてパイプラインに承認フェーズを入れる必要があります。パイプラインに関する話はまた別記事で説明します。

6. 基盤の状態管理: 
Terraformがリソースをプロビジョニングし、変更を適用したら、定期的に ```$ terraform plan``` を使用してインフラストラクチャを管理し、必要に応じて ```$ terraform apply``` で変更を行います。

7. 状態ファイルの管理: 
Terraformはインフラストラクチャの状態を追跡するために状態ファイル（通常、terraform.tfstate）を生成します。このファイルは重要で、Terraformプロジェクトとインフラストラクチャの状態を同期させます。注意深く管理する必要があります。今回の社内システム事例だとterraform.tfstateをAWS S3に管理されています。

8. クリーンアップ: 
リソースが不要になった場合、```$ terraform destroy``` を使用してリソースを削除し、リソースの不要な課金を防ぎます。ただし、上記コマンドはマニュアル実行がおすすめです。また、上記コマンド実行後、ユーザー承認が必要になります。承認時、削除されるリソースを再度確認して、慎重に行う必要があります。

まとめ
---
今回は新しい社内システムの構築にTerraformを使用し、IaCの概念の導入を試みました。
Terraformは基盤をコードで管理できる、柔軟性が高く、変更履歴も追跡しやすく、共有および再利用が容易で、非常に使いやすいツールだと思います。ただし、慎重に設定ファイルを作成し、丁寧に状態を管理することが重要です。こちらのTerraform状態管理に関する内容は次回の記事で投稿する予定です。