Terraformを使ってAWSやGCP等のクラウドインフラストラクチャをコードで管理(IaC=Infrastructure as Code)していきます。
前回は、Terraformのコードを記述する言語(DSL)であるHCL2の変数について解説しました。
今回はブロックについて解説していきます。
ブロックについて
HCL2ではブロックと呼ぶ単位でコードを記述していきます。
以下はリソースブロックの例です。
resource "aws_instance" "tftest" {
ami = "ami-08c84d37db8aafe00"
instance_type = "t3.nano"
}
ブロックの種類
ブロックには以下のような種類があります。
種類 | 説明 |
---|---|
terraform | Terraformの設定を定義する |
provider | 使用するプロバイダを定義する |
data | Terraformで管理していない外部リソースを取り込む |
resource | Terraformで管理対象となるリソースを記述する |
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を実行する方法を解説します。