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
使い方
以下のような手順で利用します。
.tf
ファイルを書きますterraform init
で Terraform プロジェクトを初期化します.terraform
ディレクトリ、.terraform.lock.hcl
ファイルが作成され provider のバイナリダウンロードなどの設定が記録されます
terraform plan
で設定に問題無いか・作成されるリソースを確認します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
というファイルがローカルに作成されます。