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?

More than 1 year has passed since last update.

Terraform基本構文メモ

0
Posted at

HCL2とは?

Hashi Corp Language 2 の略称
HashiCorp社独自言語

HCL2の特徴

  • コメントが書ける
  • ":"ではなく"="で指定
  • ヒアドキュメントが利用可能
  • ブロック単位で記述する
resource <RESOUCE_TYPE> <RESOUCE_NAME> {
 ...
}
  • ブロックタイプ一覧
種類 説明
locals 外部から変更できないローカル変数
variable 外から変更可能な変数
terraform Terraformの設定
provider プロバイダ
data Terraform管理していないリソースの取り込み
resource Terraform管理対象となるリソース
output 外部から参照できるようにする値

変数(locals, variables)

  • locals, variables ブロック
locals {
 ...
}
variable {
 ...
}
  • 変数の種類
種類 説明
locals ローカル変数。
プライベートな変数で外部から変更はできない。
variable 外から変更可能な変数。
コマンドライン実行時にオプションやファイル指定で上書きできる。
  • localsの定義と参照
locals {
  # 変数名 = 変数の値
  project = "tastylog"
  env     = "dev"
}

resource <RESOURCE_TYPE> <RESOURCE_NAME> {
  # ${local.<NAME>} で参照
  Tags = {
    Name = "${local.project}-${local.env}-vpc"
  }
  • variableの定義と参照
variable "project" {
  # variable の後が変数名
  # type が変数の型
  # default が変数のデフォルト値
  type = string
  default = "testlog"
}

resource <RESOURCE_TYPE> <RESOURCE_NAME> {
  # ${var.<NAME>} で参照
  Tags = {
    Name = "${var.project}-dev-vpc"
  }

データ型

  • HCL2で扱えるデータ型

    • プリミティブ
    型名 説明
    string Unicode文字列
    number 数値。整数と少数の両方を表現
    bool true/falseの2値
    • 構造体
    型名 説明
    object({=, ...}) キーバリュー型データ
    tuple([, ...]) 数値。整数と少数の両方を表現
    • コレクション
    型名 説明
    list() 特定の型で構成される配列
    map() キーが文字列の配列
    set() 値の重複がない配列
  • プリミティブ型

variable "message" {
  type = string
  default = "Hello World"
}

variable "max_count" {
  type = number
  default = "10"
}

variable "is_enable" {
  type = bool
  default = "true"
}
  • 構造体 object
    キーバリュー形式で定義されるデータ型
variable "obj_sample" {
  type = object({
    name = string
    age  = number
  })
  default = {
    name = "tanaka"
    age  = 28
  }
}

username = var.obj_sample.name
  • 構造体 tuple
    配列のN番目にどういった型を使うかが決められたデータ型
variable "tuple_sample" {
  type = tuple([
    string, number
  ])
  default = ["tanaka", 28]
}

username = var.obj_sample[0]
  • コレクション list
    全て同じ型で指定される配列
variable "list_sample" {
  type    = list(string)
  default = ["tanaka", "sato"]
}

username = var.list_sample[0]
  • コレクション map
    キーが文字列、バリューが指定された型となる配列
variable "map_sample" {
  type    = map(string)
  default = {
    "High" = "m5.2xlarge"
    "Mid"  = "m5.large"
    "Low"  = "t2.micro"
  }
}

instance = var.map_sampole.High
  • コレクション set
    バリューの重複が排除される配列
variable "set_sample" {
  type    = set(string)
  default = [
    "tanaka",
    "sato",
    "tanaka",
    "sato"
  ]
}

[for itm in var.set_sample : itm]

外部から変数を与える

  • 変数の上書き方法
    外部から変数値を与える方法は3種類

    種類 説明
    環境変数 環境変数へあらかじめ設定してある値を利用する。
    TF_VAR_<NAME>
    変数ファイル あらかじめ決められた変数ファイル名のファイルに指定する。
    terraform.tfvars
    コマンド引数 以下のコマンド引数で指定された値を利用する。
    -var <NAME>=<VALUE>
    -var-file <FILE_PATH>
  • 環境変数を使った上書き

ソースコード(main.tf)

variable = "message" {
  type    = string
  default = "nothing"
}

環境変数定義、ビルド実行

$ export TF_VAR_message="Hello World!"
$ terraform apply
  • 変数ファイルを使った上書き

ソースコード(main.tf)

variable = "message" {
  type    = string
  default = "nothing"
}

変数ファイル(terraform.tfvars)

message = "Hello World!"

ビルド実行

$ terraform apply
  • コマンドを使った上書き

ソースコード(main.tf)

variable = "message" {
  type    = string
  default = "nothing"
}

変数を指定したコマンド実行

$ terraform apply -var message="Hello World!"
  • 変数の上書き使い分け
    種類 使い分け
    環境変数 実行ログに残らない(tfstateには場合により出力される)
    鍵情報(ファイルとして残したくないもの)、環境依存情報(dev,stgなど。運用管理サーバーで作業すような厳格な場合)
    変数ファイル git管理できる = 構造管理として残せる
    ロジック(プロビジョン手続)とデータ(変数)は切り離すことでgit管理したとき変更箇所が分かりやすくなる
    コマンド引数 実行ログに残る
    テストで部分的に変更したい、デバッグで一部変更したいなど一時的な利用

terraformブロック

  • Terraform全体に関わる設定
terraform {
  ...
}
  • 課題

    • terraformにバージョンがあるように、各プロバイダーにもバージョンがある。
  • terraformのバージョン固定

項目 説明
required_version Terraformのバージョン指定
  • terraformのバージョン固定
項目 説明
required_providers providerのバージョン指定
  • a

providerブロック

  • プロバイダーの設定
provider <PROVIDER_TYPE> {
  ...
}
  • クレデンシャル情報
項目 説明
profile AWSへアクセスするためのプロファイル
  • デフォルトリージョン
項目 説明
region デフォルトリージョン

dataブロック

  • 管理対象外のリソースを取り込める
data <DATA_TYPE> <DATA_NAME>{
  ...
}
  • 取り込みたいリソースによって記載方法が異なる

outputブロック

  • 作成したリソースを外部参照できるようにする
output <OUTPUT_NAME>{
  ...
}
  • EC2インスタンスのIDを出力する
    ec2_instance_id は外から参照時に指定する名前
    出力する値は resource ブロックの内容を指定する
resource "aws_instance" "hello-world" {
  ami           = "ami-123456789"
  instance_type = "t2.micro"
}

output "ec2_instance_id" {
  value = aws_instance.hello-world.id
}

outputブロック

  • サブネットがVPCを参照する場合
resource "aws_vpc" "vpc" {
  cidr_block           = "192.168.0.0/20"
  instance_tenancy     = "default"
  enable_dns_support   = true
  enable_dns_hostnames = true
}

resource "aws_subnet" "public_subnet_1a" {
  vpc_id                  = aws_vpc.vpc.id
  availability_zone       = "ap-nortneast-1a"
  cidr_block              = "192.168.1.0/24"
  map_public_ip_on_launch = true
}
  • HCL2でリソース参照する記述
    "."(ドット)で連結して参照
    <BLOCK_TYPE>.<LABEL_1>.<LABEL_2>
    ※resourceブロックの場合、省略される

組み込み関数

  • 組み込み関数
種類 説明
numeric 数値演算。絶対値、切り上げ、切り捨て、最大、最小など
string 文字列操作。フォーマット、結合、抜き出しなど
collection 配列操作。結合、分割、ソートなど
encoding エンコード。Base64、CSV、JSON、YAMLなどの変換
filesystem ファイル操作。ディレクトリ名取得、ファイル読み取りなど
data&time 日付操作。現在時刻取得、データのフォーマット指定など
Hash&Crypt ハッシュおよび暗号化。Bcrypt、MD5、SHA-256など
IP Network CIDR表記の演算。ホスト名取得、サブネット名取得など
Type Conversion 型変換。bool, string, number などへの変換
  • 組み込み関数の試し方
terraform console
  [-var <KEY>=<VALUE>]
  [-var-file <VAR_FILE>]

引数
-var <KEY>=<VALUE> 変数の指定
-var-file <FILE> 変数ファイルの指定

ファイル分割

  • サブディレクトリの.tfファイルは読み込まない
  • カレントディレクトリの.tfファイルのみ
  • 最小分割構成
root
 ├── terraform.tfvars 変数を定義
 └── main.tf          各種リソースを定義
         mainの中身が大きくなると分割していく

公式ドキュメントの見方

  • おさえておきたいドキュメント
種類 説明
HCL2 HCL2の仕様に関わるドキュメント
CLI Terraformのコマンドに関わるドキュメント
provider providerに関するドキュメント
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?