はじめに
Terraformは、コードでクラウド上の仮想ネットワークや仮想コンピュータなどのリソースを構築するIaC(Infrastructure as Code)ツールになります。
Terraformでクラウド上のインフラを構築するとコードで管理することが出来るので一般的なプログラムと同様にgitなどのコード管理ツールを使って履歴などを管理することが出来ます。
このページで記載しているコードの書き方は、執筆時点のTerraform 0.14.4で有効な書き方となっていますので注意してください。0.11以前など古いバージョンでは書き方が異なる場合がいあります。
Terraformのインストールや実行の仕方については、下記リンクを参照してください。
Terraformの主なファイル
tfファイル
Terraformのコードは、tfファイルにコーディングを行っていきます。
tfファイルは、Terraformを実行するための作業用ディレクトリに1つだけ配置することも複数に分けることも出来ます。
tfファイルへの名前の付け方は自由ですが、下記のような名前つけパターンが多いです。
ファイル名 | 役割 |
---|---|
main.tf | クラウド上に構築するリソースを定義するためのtfファイル。 |
variables.tf | Terraformで使用する変数を定義するためのtfファイル。 |
outputs.tf | Terraformの実行によって出力される変数を定義するためのtfファイル。 |
[サービス名].tf | ファイル名にクラウドサービスの名前(network・instanceなど)をつけてサイービスごとにリソースを定義するためのtfファイル。 |
tfvarsファイル
Terraformの実行時に読み込ませたい変数の値を定義するためのファイルです。
ファイル名を「terraform.tfvars」としていた場合は、Terraformの実行時に自動的にtfvarsファイルに設定されている変数の値を読み込ませることが出来ます。
ファイル名を変えたい場合は、Terraformの実行時に-var-file [ファイル名].tfvars
をパラメータに指定する必要があります。
tfvarsファイルは、gitでのコード管理対象外にしてクラウドにアクセスするためのAPIキーやパスワードなどの秘密情報を設定するために使用したりします。こうしておくことで、git上に機密情報が上がってしまうのを防ぐことが出来ます。
tfstateファイル
tfstateファイルは、terraform apply
を実行した時に作成されるJSON形式のファイルでデフォルトでは、terraform apply
を実行したディレクトリに「terraform.tfstate」というファイル名で作成されます。
Terraformは、tfstateファイルを使ってクラウド上に構築したリソースの現在の状態を管理することで、tfファイルとterraform.tfstateの状態からクラウド上にどのリソースを追加・削除・変更しなければならないのかを識別しています。
構文
コメント
1行のコメントは、#
で開始します。
# Single-line Comment
複数行のコメントは、/* */
で囲みます。
/*
Multi-line Comment
Multi-line Comment
*/
数値
数字は、そのまま10進数で記載します。0xを付けると16進数の扱いになります。
value = 1
value = 0x1
文字列
文字列は、""
で囲みます。
value = "String"
bool値
bool値は、true、falseを使用できます。
value = true
value = false
配列
配列は、[ ]
で囲み,
で値を区切ります。
value = [ "a", "b", "c", "d" ]
マップ
配列は、{ }
で囲みキーと値の間を:
とし,
で区切ります。
value = { "key1" : "value1", "key2" : "value2", "key3" : "value3" }
算出演算子
数値に対して、+
(加算)、-
(減算)、*
(乗算)、/
(除算)、%
(剰余)を使用することが可能です。
value = a + b
value = a - b
value = a * b
value = a / b
value = a % b
等価演算子
==
(一致)、!=
(不一致)を使用することが可能で、結果値としてbool値を返します。
value = a == b
value = a != b
比較演算子
数値に対して、<
、 <=
、 >
、 >=
を使用することが可能で、結果値としてbool値を返します。
value = a < b
value = a <= b
value = a > b
value = a >= b
論理演算子
bool値に対して、||
(論理和)、&&
(論理積)、!
(否定)を使用することが可能で、結果値としてbool値を返します。
value = a || b
value = a && b
value = !a
条件式
条件式は、?
で指定し判定結果によって2つの値のどちらか一方を返します。
value = (a == b) ? a : b
上記の場合、aとbが等しい値の場合はaを返し、等しくない場合はbを返します。
変数
Terraformでは、役割によって入力変数、出力変数、ローカル変数の3種類の変数を宣言することが出来ます。
入力変数
分割されたtfファイルやtfvarsファイルなどtfファイルの外部から値を受け取ることの出来る変数です。
変数の宣言は、下記のように行いvariable_name
の部分に変数の名前を付けます。
variable "variable_name" {
}
変数の宣言時に、オプションで下記の設定が行えます。
default
:変数のデフォルト値type
:変数に受け入れることの出来る型(number、string、boolなど)description
:変数の説明validation
:変数の値を検証するためのルールsensitive
:trueにした場合、Terraformの実行時に画面に変数の値を表示しない
variable "string_variable_name" {
type = string
description = "String variable description"
default = "default value"
}
variable "list_variable_name" {
type = list(number)
description = "List variable description"
default = [ 0, 1, 2, 3 ]
}
入力変数をtfファイル内で使用するには、var
の後に変数名をつけて使用します。
value = var.variable_name
ローカル変数
ローカル変数は、tfファイル内でのみ使用可能な変数です。
変数の宣言は、下記のように行いlocal_variable_name
の部分に変数の名前を付けます。
locals {
local_variable_name = "local variable"
}
下記のように同時に複数のローカル変数を宣言することも出来ます。
locals {
local_variable_name1 = "local variable1"
local_variable_name2 = "local variable2"
}
ローカル変数をtfファイル内で使用するには、local
の後に変数名をつけて使用します。
value = local.local_variable_name
出力変数
出力変数は、コンソール画面に値を出力する場合やモジュール(作業用ディレクトリとは別の場所にあるリソースのまとまり)から値を出力する場合に使用することの出来る変数です。
変数の宣言は、下記のように行いoutput_name
の部分に変数の名前を付けます。
output "output_name" {
}
変数の宣言時に、オプションで下記の設定が行えます。
description
:出力時に画面に表示される変数の説明sensitive
:trueにした場合、Terraformの実行時に画面に変数の値を表示しないdepends_on
:依存関係の定義
variable "string_output_name" {
description = "Output variable description"
}
出力変数をtfファイル内で使用するには、module
の後にモジュールのローカル名と変数名をつけて使用します。
value = module.local_name.variable_name
プロバイダ
Terraformは、プロバイダによってAWS・Azureなどの複数のクラウドサービスと接続を行うことが出来ます。
下記のようにprovider
ブロックで定義し、provider_name
にはawsなどプロバイダの名前を指定します。
provider "provider_name" {
}
各プロバイダの定義の仕方は、ここから接続したいクラウドサービスを探しクリックすると下の画面が表示されるので「documentation」をクリックして確認してください。

データソース
データソースは、外部で定義されたデータをtfファイルないで使用出来るように取得するためのものです。
下記のようにdata
ブロックで定義し、data_source_name
には取得したいデータソースの名前、local_name
へはtfファイル内で使用するローカル名を指定し、ブロック内のattributeへは取り出したい検索条件などを指定します。
data "data_source_name" "local_name" {
}
データソースをtfファイル内で使用するには、data
の後にデータソース名、ローカル名、取得したいattributeを指定して使用します。
value = data.data_source_name.local_name.attribute_name
リソース
リソースは、仮想ネットワークや仮想コンピュータなどクラウド上に構築するものを定義するためのものです。
下記のようにresource
ブロックで定義し、resource_name
には構築するリソースの名前、local_name
へはtfファイル内で使用するリソースのローカル名を指定し、ブロック内のattributeへは構築するリソースのパラメータなどを指定します。
resource "resource_name" "local_name" {
}
リソースブロック内で、下記の指定を行うことが出来ます。
depends_on
:リソースやモジュールの依存関係の設定count
:指定した数のリソースを作成for_each
:マップの要素数分のリソースを作成(マップの値をリソースに設定可能)provider
:複数のプロバイダがある場合に使用するプロバイダを設定lifecycle
:リソースに変更が発生した場合の設定
リソースをtfファイル内で使用するには、リソース名、ローカル名、取得したいattributeを指定して使用します。
value = resource_name.local_name.attribute_name
モジュール
モジュールは、作業用ディレクトリとは異なるディレクトリに配置することで複数の作業用ディレクトリから共通で使用することの出来るtfファイルです。
下記のようにmodule
ブロックで定義し、local_name
へはtfファイル内で使用するモジュールのローカル名を指定し、ブロック内へはモジュールに定義されている入力変数に値を設定します。
module "local_name" {
}
モジュールブロック内で、下記の指定を行うことが出来ます。
depends_on
:リソースやモジュールの依存関係の設定count
:指定した数のモジュールを作成for_each
:マップの要素数分のモジュールを作成(マップの値をモジュールに設定可能)provider
:複数のプロバイダがある場合に使用するプロバイダを設定
モジュールをtfファイル内で使用する方法は、出力変数を使用する方法となります。
value = module.local_name.variable_name
おわりに
Terraformの基本的なコードの書き方は以上になります。
下記URLでOCI(Oracle Cloud Infrastructure)の無料枠へTerrformを使って環境を構築しているので試してみてください。
githubにコードも公開しています。
Comment