インフラもterraformも全くわからん人に向けて簡単にまとめてみました。
ここではクラウドインフラ(特にGCP)を例に説明します。
TL;DR
- AWSやGCPのようなクラウドインフラはコンソール画面からボタンをポチポチして扱うサービスを管理したり設定値を変更することができます
- しかしそれだと下記のような問題点があります
- 「いつ、誰が、どのような設定を変更したのか」が把握できない
- 新しい環境(ステージング環境など)を作成する際に、コンソール画面から手動で同じ手順を踏まないといけない
- ドキュメントが更新されていないと既存のインフラの環境を把握が困難
- terraform を使えばインフラの設定をコードで管理することができます。それにより下記のようなメリットがあります。
- コードで管理できるので変更の履歴を確認できる
- 1つ環境を作ってしまえば他の環境にも設定を使いまわせる(手動でポチポチしなくてもいい)
- コードが読めれば既存のインフラの環境を把握できる
terraformとは
- HashiCorp社によって開発されたOSSで、IaCツールの1つである。
- IaCツールとは、
Infrastructure as Code
の1つで、AWSやGCPなどクラウドなどシステム開発に必要なインフラを、コードを記述することにより自動で構築できる。 - つまりインフラも開発と同様にコードで管理することができます
コードでインフラを管理するとは?
いまいちイメージが湧きづらいと思うので、どうやって管理するのか見てみましょう。terraform ではHashiCorp Configuration Language (HCL) という独自の言語を使用して設定ファイルを記述します。
実際にGCPのプロジェクトをterraform で管理するには下記のような手順を踏んで設定できます。
1. プロバイダの設定(どのクラウドベンダーを使用するか)
最初にTerraformにGCPを使用することを伝え、認証情報を指定します。
provider "google" {
credentials = file("<PATH_TO_YOUR_SERVICE_ACCOUNT_KEY_JSON>")
project = "<YOUR_PROJECT_ID>"
region = "us-central1"
}
2. 使用するリソースの定義
次に使用するリソースの定義を書いていきます。ここではGCEの仮想マシンインスタンスを作成します。
resource "google_compute_instance" "default" {
name = "terraform-instance"
machine_type = "n1-standard-1"
boot_disk {
initialize_params {
image = "debian-cloud/debian-9"
}
}
network_interface {
network = "default"
access_config {
// 外部IPを持つように設定
}
}
}
上記のコードでは、n1-standard-1のマシンタイプでdebian-9のイメージを使用して、名前がterraform-instanceの仮想マシンインスタンスを作成します。
3. インフラの適用
以下のコマンドを実行して、インフラの変更を計画し、実際にリソースを作成します。
terraform init # プロジェクトの初期化
terraform plan # 変更の確認
terraform apply # インフラの変更の適用
terraform を使うメリット
個人的にterraformを少し触ってみて感じたメリットです。
1. インフラが身近なものに感じた
普段はコードをガリガリ書いて開発しており、インフラ周りにはあまり詳しくありませんでした。AWSやGCPはコンソールでよくわからん画面をぽちぽちしながら構築していくイメージだったのですが、コードで管理されていることによって、「今のプロジェクトのインフラ構成ってこうなってるんだ」と理解することができました。インフラ構成図を使えば視覚的に把握はできてわかりやすいのですが、構成図が古いままだったり、細かな設定値までは図だけでは理解できないので、コードから追っていくことでより詳細に理解できるようになったと思います。
2. 新しい環境をすぐに用意することができる
新しい機能を開発する際に「既存のプロジェクトの他に、ステージング環境用に別のプロジェクトを立ち上げたい」時に非常に便利だなと感じました。定義されたコードに基づいて一貫してインフラをデプロイできるので、新しい環境のセットアップやテスト環境、ステージング環境の準備が簡単になりました。
3. インフラの変更が管理しやすい
インフラをコンソール画面だけで管理していると、「誰がどのタイミングでどんな変更を施したか」を把握できなくなってしまいます。TerraformのコードはGitのようなバージョン管理システムで管理できるため、変更履歴が追跡可能です。これにより、どの変更がいつ、誰によって行われたかを確認することができます。また、Terraformのplanコマンドを使用すれば、変更が適用される前にその変更が何をもたらすかを予測することができます。
参考