🎃
【Terraform】の基本構文
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!"
基本ブロック
- terraformブロック : Terraformの定義
- providerブロック : プロバイダー(どのプラットフォームを接続するか)
- variableブロック : (環境、入力)変数の定義
- resourceブロック : AWSリソースの定義
- moduleブロック : Terraformモジュールの定義
- dataブロック : 参照するインスタンスの定義
- outputブロック : 出力するインスタンスの定義
- 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)は省略できる。ラベルから始める。
}
組み込み関数
- テストする。
$ terraform console
ファイル分割
-
terraform apply
はカレントディレクトリのみを対象にする。- サブディレクトリは対象外。
整形
$ tarraform fmt
特定のリソースだけapplyしたい
#依存関係が崩れる可能性あり。(推奨されない)
$ terraform apply -target=aws_instance.app_server
#一度削除して再作成する。
$ terraform apply -replace=aws_instance.app_server
Discussion