HCL(HashiCorp Configuration Language)の書き方
はじめに
前回は、Terraformのインストールと初期設定を完了しました。今回は、Terraformのインフラ定義に使用される独自の言語、**HCL(HashiCorp Configuration Language)**の書き方を学びます。HCLは「人間が読みやすい」ことを目指して設計されており、シンプルな構文でインフラをコード化できます。
1. HCLの基本ブロック構造
HCLは、主に以下の3つの要素で構成されるブロック構造を採用しています。
-
block_type
: 定義するブロックの種類(resource
、provider
、variable
など) -
block_label
: ブロックを識別するための名前(1つまたは2つのラベル) -
block_body
: ブロックの内容を定義する部分({}
で囲んで記述)
基本構文
block_type "block_label_1" "block_label_2" {
# ブロックの内容(引数と値)
argument_name = "value"
another_arg = 123
}
例えば、resource
ブロックでは、一つ目のラベルがリソースの種類(aws_s3_bucket
)を、二つ目のラベルがTerraform内で一意の論理名(my_bucket
)を指します。
2. データ型と値
HCLでは、以下のデータ型を使用して柔軟なコードを記述できます。
データ型 | 説明 | 例 |
---|---|---|
string | 文字列 |
"hello" , "ap-northeast-1"
|
number | 数値(整数・浮動小数点) |
100 , 3.14 , -5
|
bool | 真偽値 |
true , false
|
list | 順序付きの値の集合 | ["web", "app", "db"] |
map | キーと値の集合 | { name = "my-bucket", env = "dev" } |
set | 重複のない値の集合 | ["unique", "values"] |
object | 複雑な構造化データ | { name = "test", count = 3 } |
データ型の記述例
# Map(オブジェクト)の例
tags = {
Name = "MyEC2Instance"
Environment = "dev"
Owner = "team-alpha"
}
# List(配列)の例
availability_zones = ["ap-northeast-1a", "ap-northeast-1c", "ap-northeast-1d"]
# 複雑なオブジェクトの例
server_config = {
instance_type = "t3.micro"
disk_size = 20
backup_enabled = true
}
3. HCLの主要ブロック
3.1 resourceブロック
AWSリソース(EC2、S3など)を定義します。
resource "aws_instance" "web_server" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.micro"
tags = {
Name = "WebServer"
Env = "production"
}
}
3.2 providerブロック
クラウドプロバイダ(AWS、Azureなど)の設定を定義します。
provider "aws" {
region = "ap-northeast-1"
default_tags {
tags = {
ManagedBy = "Terraform"
Project = "MyProject"
}
}
}
3.3 variableブロック
外部から値を受け取るための変数を定義します。
variable "instance_type" {
description = "EC2インスタンスのタイプ"
type = string
default = "t3.micro"
validation {
condition = contains(["t3.micro", "t3.small", "t3.medium"], var.instance_type)
error_message = "インスタンスタイプはt3.micro、t3.small、またはt3.mediumである必要があります。"
}
}
variable "environment" {
description = "デプロイ環境"
type = string
}
変数は、他のブロックでvar.instance_type
のように参照できます。
3.4 outputブロック
デプロイ後のリソースの情報を出力します。
output "instance_public_ip" {
description = "EC2インスタンスのパブリックIP"
value = aws_instance.web_server.public_ip
}
output "instance_id" {
description = "EC2インスタンスID"
value = aws_instance.web_server.id
sensitive = false
}
3.5 localsブロック
計算された値や複雑な式を定義します。
locals {
common_tags = {
Environment = var.environment
Project = "MyProject"
ManagedBy = "Terraform"
}
bucket_name = "my-app-${var.environment}-${random_id.bucket_suffix.hex}"
}
4. 参照と文字列補間
Terraformでは、他のリソースの属性や変数の値を参照する強力な機能があります。
4.1 基本的な参照
-
リソースの参照:
リソースタイプ.論理名.属性
- 例:
aws_instance.web_server.public_ip
- 例:
-
変数の参照:
var.変数名
- 例:
var.instance_type
- 例:
-
ローカル値の参照:
local.名前
- 例:
local.common_tags
- 例:
4.2 文字列補間
文字列内に式を埋め込むには${...}
を使用します。
# 文字列補間の例
resource "aws_s3_bucket" "app_bucket" {
bucket = "my-app-${var.environment}-${random_id.bucket_suffix.hex}"
tags = {
Name = "Application bucket for ${var.environment}"
FullName = "${var.project_name}-${var.environment}-bucket"
}
}
4.3 条件式と関数
HCLでは条件式や組み込み関数も使用できます。
# 条件式の例
instance_type = var.environment == "production" ? "t3.medium" : "t3.micro"
# 関数の例
availability_zones = data.aws_availability_zones.available.names
subnet_count = length(var.subnet_cidrs)
upper_env = upper(var.environment)
5. コメントとフォーマット
# これは行コメント
/*
これは
ブロックコメント
*/
resource "aws_instance" "example" {
ami = "ami-12345678" # インラインコメント
instance_type = var.instance_type
}
まとめ
HCLは、ブロック構造、豊富なデータ型、そして強力な参照・補間機能によって、読み書きしやすいインフラコードを実現しています。
HCLの主な特徴
特徴 | 説明 |
---|---|
人間が読みやすい構文 | JSONやYAMLと比較して、より自然な記述が可能 |
型システム | 明確な型定義により、設定ミスを防止 |
表現力の高い参照 |
aws_instance.web.public_ip のような直感的な参照 |
関数とロジック | 条件分岐や計算処理をサポート |
バリデーション | 変数の値検証機能 |
CloudFormationのYAML/JSONと比較すると、HCLはより宣言的でありながらプログラミング言語の表現力も備えています。
次回は、このHCLを使って実際にTerraformでAWSリソースをデプロイする実践編をお届けします。お楽しみに!