0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【IaC超入門】30日でAWS CloudFormationとTerraformをマスターするロードマップ - 16日目: HCL(HashiCorp Configuration Language)の書き方

Posted at

HCL(HashiCorp Configuration Language)の書き方

はじめに

前回は、Terraformのインストールと初期設定を完了しました。今回は、Terraformのインフラ定義に使用される独自の言語、**HCL(HashiCorp Configuration Language)**の書き方を学びます。HCLは「人間が読みやすい」ことを目指して設計されており、シンプルな構文でインフラをコード化できます。

1. HCLの基本ブロック構造

HCLは、主に以下の3つの要素で構成されるブロック構造を採用しています。

  • block_type: 定義するブロックの種類(resourceprovidervariableなど)
  • 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リソースをデプロイする実践編をお届けします。お楽しみに!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?