🎃

【Terraform】の基本構文

2025/01/10に公開

HCL2

TerraformはHCL2(HashiCorp Configuration Language2)で記述する。
HCL2の構文はJSONに似ているが、JSONはデータ構造を表すことに特化しているのに対し、HCL2では以下のようなプログラミング言語としての各種機能が備わっています。

  • 変数定義、繰り返し処理、算術/論理演算、条件処理(三項演算子)などが使える
  • コメントが書ける (#)
  • キーとバリューの紐付けはJSONの”.”ではなく”=”で行う
  • ヒアドキュメントが使える

変数

locals

ローカル変数。プライベートな変数で外部からは変更できない。

locals{
 project = "test"
 env = "dev"
}

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

variables

外部から変更可能な変数。コマンドライン実行時にオプションやファイル指定で上書きできる。

variables "project"{
 type = string
 default = "test"
}

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

データ型

  • プリミティブ型
    • string,number,bool
  • オブジェクト型
  • tuple型
    • 配列のN番目にどういう型を使うかが決められたデータ型
  • list型
    • 全て同じ型で指定される配列
  • map型
    • キーが文字列、バリューが指定された型となる配列
  • set型
    • バリューの重複が排除される配列

変数の上書き方法

環境変数→変数ファイル→コマンド引数の順に上書きされる。

  • 環境変数による上書き
    • 変数名にTF_VAR_を付ける
    • 実行ログが残らない。鍵情報、環境依存情報など。
variables "message"{
 type = string
 default = "nothing"
}
#環境変数定義、ビルド実行
export TF_VAR_message="Hello World!"
terraform apply
  • 変数ファイルによる上書き
    • 変数ファイル(terraform.tfvars)に設定
    • git管理できる。ロジック(プロビジョン手続き)とデータ(変数)は切り離すことでgit管理がしやすくなる。
variables "message"{
 type = string
 default = "nothing"
}
message = "Hello World!"
#ビルド実行
$ terraform apply
  • コマンドを使った上書き
    • 実行ログに残る。テスト、デバックで部分的に変更したい場合など。
variables "message"{
 type = string
 default = "nothing"
}
#変数を指定したコマンド実行
$ terraform apply -var message="Hello World!"

基本ブロック

  1. terraformブロック : Terraformの定義
  2. providerブロック : プロバイダー(どのプラットフォームを接続するか)
  3. variableブロック : (環境、入力)変数の定義
  4. resourceブロック : AWSリソースの定義
  5. moduleブロック : Terraformモジュールの定義
  6. dataブロック : 参照するインスタンスの定義
  7. outputブロック : 出力するインスタンスの定義
  8. localブロック :(同一モジュール内の)ローカル変数の定義

ブロックとは

以下のvariableブロックのように{}に囲まれた一つのまとまりを「ブロック」と呼ぶ。

variable "test" {
  type = string
}

terraformブロック

Terraformの定義

  • required_version
    • Terraformのバージョン指定
  • required_providers
    • 対象のprovide(インフラのプラットフォーム)rのバージョン指定
terraform {
  #0.13以上
  required_version = ">=0.13"
  required_providers {
    aws = {
      source = "hashicorp/aws"
      #おおよそ3.0以上(マイナーは気にしない)
      version = "~> 3.0"
    }
  }
}

providerブロック

  • profile
    • AWSへアクセスするためのプロファイル
  • region
    • デフォルトリージョン
provider "aws" {
  profile = "udemy_terraform"
  region  = "ap-northeast-1"
}

variableブロック

(環境、入力)変数の定義。
各モジュールとセットで使用する。variable.tfに記載する。

variable "region" {
  type = string
}
variable "enviroment" {
  type = string
}

detaブロック

管理対象外だが利用したいリソースを管理対象のリソースに取り組みたい時に使用。
取り組みたいリソースによって記載方法が変わる。

outputブロック

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

resource "aws_instance" "hello-world" {
  ami = "ami-0ab02459752898a60"
  instance_type = "t2.micro"
}
output "ec2_instans_id"{
 value = aws_instance.hello-world.id
 #リソース名(aws_instans)は省略できる。ラベルから始める。
}

組み込み関数

https://developer.hashicorp.com/terraform/language/functions

  • テストする。
$ terraform console

ファイル分割

  • terraform applyはカレントディレクトリのみを対象にする。
    • サブディレクトリは対象外。

整形

$ tarraform fmt

特定のリソースだけapplyしたい

#依存関係が崩れる可能性あり。(推奨されない)
$ terraform apply -target=aws_instance.app_server
#一度削除して再作成する。
$ terraform apply -replace=aws_instance.app_server 

Discussion