Terraformの基本的なコードの書き方

IaC
スポンサーリンク
スポンサーリンク

はじめに

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.tfTerraformで使用する変数を定義するためのtfファイル。
outputs.tfTerraformの実行によって出力される変数を定義するための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の状態からクラウド上にどのリソースを追加・削除・変更しなければならないのかを識別しています。

tfstateファイルは重要なファイルなので、実際の業務で使用する場合はクラウド上のObject Storageに保存することが多いです。

構文

コメント

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

スポンサーリンク