Terraform入門

2022-04-22

Terraformは、IaC(Infrastructure as Code)を実現するツールの 1 つです。
この記事では、Terraformのインストールから使い方までをご紹介します。

用語

まずは用語について整理します。

用語 意味
Configuration インフラ設定のコード。要するに *.tf ファイルに DSL で書く Terraform のコードのこと。
HCL HashiCorp Configuration Languageの略。*.tf ファイルで使われている DSL のこと。
Resource Terraform で管理する対象の基本単位。
Data Source Terraform 管理外だけど、 Terraform 内で参照したい参照専用の外部データ。
Provider Resource や Data Source などを作成/更新/削除するプラグイン。aws/google/azurermなど。
Provisioner リソースの作成/削除時に実行するスクリプトなどのプラグイン。local-exec/remote-exec/chefなど
State Terraform が認識しているリソースの状態。 *.tfstate ファイルのこと。
Backend State ファイルの保存先。local/s3/gcsなど。
Module Resource や Data Source などを再利用可能なようにまとめた Configuration の単位。

Terraformのインストール

asdf を利用して Terraform をインストールします。
asdf については以下の記事を参照してください。

$ asdf plugin add terraform
$ asdf plugin list
terraform
$ asdf list-all terraform
...
1.1.8
$ asdf install terraform 1.1.8
$ asdf global terraform 1.1.8
$ asdf current terraform
terraform       1.1.8          /Users/xxxxx/.tool-versions
$ terraform -v
Terraform v1.1.8

使い方

以下のような手順で利用します。

  1. .tf ファイルを書きます
  2. terraform init で Terraform プロジェクトを初期化します
    • .terraform ディレクトリ、.terraform.lock.hcl ファイルが作成され provider のバイナリダウンロードなどの設定が記録されます
  3. terraform plan で設定に問題無いか・作成されるリソースを確認します
  4. terraform apply で実際に環境へ適用します

.tf ファイルを書く

以下の構成で作成します。

basic-flat-env/
├── main.tf        # Terraformバージョン、Provider、Backend、変数、locals変数、Outputsの設定
└── sample-vpc.tf  # resource(sampleサービスのVPC) の設定を記述
  • main.tf
    • Terraform のバージョンに関する設定
    • AWS の Provider に関する設定
    • State ファイルの保存に関する設定
    • Terraform の変数定義
  • sample-vpc.tf
    • サンプルで作成する Amazon VPC のリソース定義

main.tf

#####################################
# Terraform Settings
#####################################
terraform {
  required_version = "~> 1.1.0" // Terraform のバージョン
  required_providers {          // Provider の設定
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"        // AWS Provider のバージョン
    }
  }
  backend "s3" {                 // この設定で State ファイルが S3 に保存されます
    bucket = "your-bucket-name"  // State ファイルを配置するバケット
    key    = "terraform.tfstate" // State ファイルを配置するパス・ファイル名
    region = "ap-northeast-1"    // S3のリージョン
  }
}

#####################################
# Provider Settings
#####################################
provider "aws" {
  region  = local.region
  profile = var.profile
  default_tags { // AWS リソースへのデフォルトタグの設定
    tags = {
      System    = local.system
      Env       = local.env
      Terraform = "true"
    }
  }
}

#####################################
# Variables
#####################################
variable "profile" {}
locals {
  // Common
  region    = "ap-northeast-1"
  system    = "system"
  env       = "prd"
  base_name = "${local.system}-${local.env}"

  // VPC
  vpc_cidr_block = "10.0.0.0/16"
}

#####################################
# Outputs
#####################################
output "sample_vpc" {
  value = aws_vpc.sample
}

profile 変数への値の代入は、ファイルへの記載ではなく環境変数( TF_VAR_profile )や terraform コマンドオプション( -var )からの読み込みも可能です。
なお、 Terraform の変数へ環境変数から値を代入する場合は、変数名 xxxxx に対して環境変数 TF_VAR_xxxxx が対応しています。

sample-vpc.tf

#####################################
# VPC
#####################################
resource "aws_vpc" "sample" {
  cidr_block = local.vpc_cidr_block
  tags       = merge(tomap({ "Service" = "sample" }), tomap({ "Name" = "${local.base_name}-sample" }))
}

Variable と Local Values

Variable は variable で定義する変数で、外部からのインプットや環境差分が発生する場合に使用します。
Local Values は locals で定義・代入する変数で、モジュール内のローカル変数として使用します。

Variable への値の代入方法は以下があります。

  • 実行時に指定
    • terraform plan などのコマンドを実行すると、コマンドライン上で値の入力を求められます
  • コマンド引数による指定
    • terraform コマンド実行時に terraform plan -var 'profile=hogehoge' のような形でオプションで指定します
  • 環境変数による指定
    • 変数名 xxxxx に対して環境変数 TF_VAR_xxxxx が対応しています
  • 設定ファイルによる指定
    • .tfvars ファイルを作成して terraform コマンド実行時に terraform plan -var-file hogehoge.tfvars のような形でオプションで指定します

.tfvars ファイルは以下のように variable で定義された変数へ単純に値を代入します。

profile = "hogehoge"
region  = "ap-northeast-1"
...

State ファイル

State ファイルは AWS への設定情報を保持し、現在の .tf ファイルとの差分を求めることによって AWS へ設定を反映させます。
先の例では backend ( State ファイルの保存場所)に S3 を設定しましたが、通常の場合はローカル( .terraform ディレクトリ)に保存されます。
State ファイルの保存場所は terraform init コマンド実行時の .tf 設定に基づいて作成されます。
複数人で開発する場合、個々人の State ファイルに差分があっては、同じ *.tf ファイルであっても実行に差分が発生するため、 S3 など共有できる場所に保存するのがよいでしょう。

backend を設定せずに terraform apply まで実行すると terraform.tfstate というファイルがローカルに作成されます。

おすすめ書籍

おすすめ記事