TerraformによるIaC入門 [第4回 HCL2の構文を理解する part2 -ブロック-]

IT
この記事には広告が含まれています

Terraformを使ってAWSやGCP等のクラウドインフラストラクチャをコードで管理(IaC=Infrastructure as Code)していきます。

前回は、Terraformのコードを記述する言語(DSL)であるHCL2の変数について解説しました。

今回はブロックについて解説していきます。

スポンサーリンク

ブロックについて

HCL2ではブロックと呼ぶ単位でコードを記述していきます。

以下はリソースブロックの例です。

resource "aws_instance" "tftest" {
    ami = "ami-08c84d37db8aafe00"
    instance_type = "t3.nano"
}

ブロックの種類

ブロックには以下のような種類があります。

種類説明
terraformTerraformの設定を定義する
provider使用するプロバイダを定義する
dataTerraformで管理していない外部リソースを取り込む
resourceTerraformで管理対象となるリソースを記述する
output外部から参照できるようにする値を定義する
locals外部から変更できないローカル変数を定義する
variable外部から変更可能なグローバル変数を定義する

ブロックの記述方法

terraformブロック

terraform本体の設定などを記述する。

terraform本体やプロバイダのバージョンを固定したりできる。

terraform {
  required_version = ">=0.13"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~>3.0"
    }
  }
}

provierブロック

使用するプロバイダを定義します。

使用可能なオプションは使用するプロバイダによって異なります。

記述例(AWS)

provider "aws" {
  profile = "terraform"
  region  = "ap-northeast-1"
}

公式ドキュメント

記述例(Google)

provider "google" {
  project     = "my-project-id"
  region      = "us-central1"
}

公式ドキュメント

記述例(Azrure)

provider "azurerm" {
  skip_provider_registration = true
  features {}
}

公式ドキュメント

resourceブロック

Terraformで管理対象となるリソースを記述します。

resource "<Resource Type>" "<Resource Name>" {
    ..
}

指定したリソースタイプ(Resource Type)により、設定可能な内容が異なります。

記述例(AWS EC2インスタンス)

resource "aws_instance" "tftest" {
    ami = "ami-08c84d37db8aafe00"
    instance_type = "t3.nano"
}

dataブロック

data "<DATA_TYPE>" "<DATA_NAME>" {
  ...
}

管理対象外のリソースを取り込みます。

AWSが作成したリソースや既存システムのリソース、外出しの設定情報をdataブロックに取り込んで参照することができます。

outputブロック

output "<OUTPUT_NAME>" {
  ...
}

作成したリソースを外部参照できるようにします。

記述例

resource "aws_instance" "tftest" {
    ami = "ami-08c84d37db8aafe00"
    instance_type = "t3.nano"
}

output "ec2_instance_id" {
  value = aws_instance.tftest.id
}

この例では、AWSのEC2インスタンス”tftest”のインスタンスIDを外部から”ec2_instance_id”という名前で参照できるようにしています。

localsブロック

localsブロックではローカル変数(プライベート変数)を定義します。

Terraform内でのローカル関数となるため、外部から参照や変更はできません。

localsブロックの基本的な構文

loals {
  <変数名> = <値>
  <変数名> = <値>
}

localsブロック内で定義した変数は ${local.変数名} で値を参照します。

記述例

loals {
  project = "project1"
  env     = "dev"
}

resource <RESOURCE_TYPE> <RESOURCE_NAME} {
  ...
  tags = {
    Name = "${local.project}-${local.env}"
  }
}

上記の例では、 project と env という2つのローカル変数を定義し、それぞれに値を代入しています。

そして、続くresourceブロック内でそれぞれを参照しています。

この場合、Name には ”project1-dev” が定義されます。

variableブロック

variableブロックでは外部から変更可能なグローバル変数を定義します。

外部から参照と変更が可能であるため、例えばGitBashなどのターミナルからterraformコマンドを実行する際にオプションとして渡した値で、variableで定義した変数を上書きするといったことが可能です。

variableブロックの基本的な構文

variable <変数名> {
  type        = <変数の型>
  default     = <デフォルト値>
  description = <変数の説明>
}

variableブロックで定義した変数は ${var.変数名} で値を参照します。

記述例

variable "project" {
  type        = string
  default     = "project1"
  description = "管理対象のプロジェクト"
}

variable "env" {
  type        = string
  default     = "dev"
  description = "管理対象の環境 Prod or Dev"
}


resource <RESOURCE_TYPE> <RESOURCE_NAME} {
  ...
  tags = {
    Name = "${var.project}-${var.env}"
  }
}

上記の例では、 project と env という2つの変数(グローバル変数)を定義し、それぞれに型(この場合 string(文字列)型)とデフォルト値を設定しています。

そして、続くresourceブロック内でそれぞれを参照しています。

各変数の値が上書きされていなければデフォルト値が使用されます。

この場合、Name には ”project1-dev” が定義されます。

おわりに

今回はブロックについて解説しました。

次回は実行環境の話に戻してWSLのLinux環境を使用してTerraformを実行する方法を解説します。

タイトルとURLをコピーしました