Terraform HCL入門 1回目 resourceの作り方

皆さん、こんにちは。技術開発グループのn-ozawanです。
暖かくなって来ましたね。リモートワークで中々運動出来ない人は、晴れた日は散歩するのもいいですよ。

本題です。
前回、TerraformでAWSの構築をしたのですが、そういえばHCLの文法について何も説明をしていないな、と思ったので、入門編ということで何回かに分けてHCLの文法についてお話ししようかと思います。今回はTerraformの基本であるresourceの作り方についてお話しします。

HCL (HashiCorp Configuration Language)

TerraformはHCL(HashiCorp Configuration Language)という文法によりコーディングします。ファイルの拡張子は”*.tf”で、HCLで記述されたtfファイルをTerraformで処理すると、記述された内容でインフラが構築されます。

ブロック

HCLは「ブロック」を定義してコーディングします。ブロックの構文は以下の通りです。ブロックにはresourceなどを指定し、その後ろにはラベルが続きます。ラベルの数は0個から複数あり、ブロックにより決まります。

  ブロック [ラベル ...] {
    # ...
  }

resource

resourceブロックは、Terraformで最も重要なブロックです。resourceブロックでEC2のインスタンスなどのインフラを構築します。resourceの構文は以下の通りです。

  resource "種類" "識別子" {
    # ...
  }

“種類”には何のリソースを作成したいのかを指定します。例えばAWSのEC2インスタンスを作成したい場合はaws_instanceとなります。以下はローカル環境にファイルを作成するresourceの例です。”種類”にlocal_fileを指定しています。”識別子”にはこのresourceを特定するための一意となる任意の名前を指定します。もし、resource "local_file" "helloworld"が2つ以上定義されている場合はエラーになります。

resource "local_file" "helloworld" {
  filename = "${path.module}/result.text"   # 作成or更新するファイルパス
  content  = "Hello World!"                 # ファイルの内容
}

variable

variableブロックは引数を受け取るブロックです。variableの構文は以下の通りです。

  variable "識別子" {
    # ...
  }

“識別子”は引数の名前です。一意にする必要があります。

以下はvariableの例です。引数”message”を受け取り、その内容をファイル出力します。variableの内容は”var.識別子”で参照することが出来ます。

variable "message" {}

resource "local_file" "message" {
  filename = "${path.module}/result.text"
  content  = var.message
}

variableに値を渡す方法は3つあります。1つ目はコンソールから渡す方法です。terraform apply実行時に入力を催促されますので、入力することで値を渡せます。

$ terraform apply
var.message
  Enter a value: xxx

2つ目はコマンド実行時に渡す方法です。

$ terraform apply -var message=xxx

3つ目は環境変数から渡す方法です。環境変数で渡す場合は接頭辞に”TF_VAR_”を付ける必要があります。

$ export TF_VAR_message=xxx
$ terraform apply

output

outputブロックは値を出力するブロックです。outputの構文は以下の通りです。

  output "識別子" {
    # ...
  }

outputブロックはコンソールにその内容を出力します。以下の例はTerraform実行時にファイルの内容をコンソールに出力する例です。このoutputは主にdebug用途で使われます。

variable "message" {}

resource "local_file" "message" {
  filename = "${path.module}/result.text"
  content  = var.message
}

output "out" {
  value = var.message
}

リソース情報の取得

ここでresourceブロックに話を戻します。resourceブロックにてリソースを構築した後、そのリソース情報を取得することが出来ます。構文は以下になります。

"種類"."識別子"."属性"

“種類”はresourceの種類です。”属性”はresource毎に定義されていますので、詳細はresourceのドキュメントを参照してください。以下はAWS Elastic IPで、AWSから割り振られた固定のIPアドレスを取得する例です。

resource "aws_eip" "hoge" {
  vpc = true
}

output "elastic_public_ip" {
  value = aws_eip.hoge.public_ip
}

リソース情報を使って、別のリソースを作成することも出来ます。前回の記事aws_vpc.main.idをSubnetなどのリソースで使っているのは、構築したAWSのVPCとSubnetなどのリソースを紐付けるためです。

余談ですが、HCLは宣言的なコードですので、記述する順番は関係しません。以下のコードを記述してもTerraformは正しく”aws_vpc”→”aws_subnet”の順番で構築してくれます。

resource "aws_subnet" "public" {
  vpc_id = aws_vpc.main.id           # VPCとSubnetの紐付け
  cidr_block = "10.0.1.0/24"
  availability_zone = "ap-northeast-1a"
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

さいごに

今回はHCLの入門編1回目ということで、Terraformで基本となるresourceを中心に、variableとoutputも紹介しました。resourceの種類って何があるの?と疑問に思った方もいると思いますが、Terraformにドキュメントが用意されていますので、そちらを参照してください。

以下のProviderのページから、Providerを選択 -> 画面右上にある”Documentation”をクリック
https://registry.terraform.io/browse/providers

Terraformには他にもmoduleという重要なブロックがあります。moduleでは今回紹介したvariableとoutputがまた違った動きをします。moduleは次回お話しします。

Recommendおすすめブログ