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は次回お話しします。