☝️

terraform孫の手

2023/04/14に公開

☝aws configure

クレデンシャル登録
・コマンド
aws configure --profile 登録したいprofile名

・実行例
$ aws configure --profile hoge
AWS Access Key ID [None]: *********************
AWS Secret Access Key [None]: *********************
Default region name [None]: ap-northeast-1
Default output format [None]: 

☝.terraform-version

terraform versionのおまじない
terraformのバージョンを渡していない場合、TFENV_TERRAFORM_VERSION変数 → .terraform-versionを参照する

使い方
$ cat .terraform-version 
1.2.9

☝.gitignore

参考

# Local .terraform directories
**/.terraform/*

# .tfstate
*.tfstate
*.tfstate.*

# terraform system
.terraform*

# mac
.DS_Store

☝terraform頻出コマンド

terraform init

要はterraform applyを実行する前にカレントディレクトリをフォーマットする
module名変更、新規リソースを作成した際には必須
何回打っても良いので、悩む前に打て

terraform plan

カレントにある~.tf と ~ファイルを全て読み込んで、コードに記載されたリソースができる想定を標準出力にアウトプットする

terraform apply

terrafrom planの内容を実際にデプロイするコマンド

terraform destroy

terraformにて構築したリソースの削除
terrform plan -destroy にて削除対象を必ず確認

-targetオプション

上記の plan,apply,destroyですが、カレントにある~.tfファイルを全て読み込んで実行します
個別にリソースをしたい場合は下記コマンドのようにtargetを指定する
terrform plan -target=aws_s3_bucket.this

☝terraform知っておくと便利コマンド

terraform state list

作成したリソース一覧が表示される

$ terraform state list
module.tfstate_bucket.aws_s3_bucket.this
module.tfstate_bucket.aws_s3_bucket_public_access_block.this

terraform import

既に構築されているリソースとterraformコードを紐づけるコマンド
importの方法はリソースによって異なる為、hashicorpの公式リファレンスを見ること

実践例

  1. 作成済みリソースをS3と紐づけたい
  2. 実体に沿ったterraformコードを書く
  3. hashicorpのS3公式リファレンスページの最下部を確認し、import方法を確認
  4. コマンドを実行し取り込む
    terraform import リソース名 実体のバケット名

terraform apply -refresh-only

terraformコードとリソースの実体は整合性が取れているが、tfstateファイルだけが乖離している場合にtfstateファイルをリソース実体に合わせて更新するコマンド
リソースは更新されないので安心

☝terraformの外部変数取り込み順番

1から順番に読み込んで、後から定義されている変数に上書きされる(要は下記番号の数字が大きいもの程、優先順位が

  1. ローカル環境変数
  2. terraform.tfvars
  3. terraform.tfvars.json
  4. *.auto.tfvars 又は *.auto.tfvars.json を語彙順に読み込み
  5. コマンドラインのオプションで指定されている、 -var と -var-file の指定された順

☝terraformの変数の種類

プリミティブ

primitive型(primitiveの意味は "基本の" "素朴な")

配列

list型
tuple型(格納する番号ごとに型が決められているlist型)

構造体

object型
map型

any

any型(何にでもなれる。困ったらコレ)

データ型

変数に定義できるデータ型を列挙

型名 備考
string 文字列 ダブルクォーとで括る
number 数字 ダブルクォーとで括る必要ナシ
bool true か false ダブルクォーとで括る必要ナシ

primitive型

変数定義における、一番シンプルな型

sample
▼variables.tfへの記載例
variable "vpc_name" {
  type = string
}

▼terraform.tfvarsへの記載例
vpc = "zumi-vpc"

list型

同じデータ型の配列

sample
▼variables.tfへの記載例
variable "subnet_name" {
  type = string
}

▼terraform.tfvarsへの記載例
vpc = [ "a_subnet" , "c_subnet" ]

tuple型

要素数ごとに型を定義可能

sample
▼variables.tfへの記載例
variable "player" {
  type = tuple([
    string, number
  ])
  default = ["OHTANI", 17]
}

▼terraform.tfvarsへの記載例
player = [ "TSUTSUGO" , 25 ]

object型

型定義自由な、keyとvalueの組み合わせ

sample
▼variables.tfへの記載例
variable "player" {
  type = object({
    name = string
    back = number
  })
  default = {
    name = "OHTANI"
    back = 17
  }
}

▼terraform.tfvarsへの記載例
player = {
  name = "TSUTSUGO"
  back = 25
}

map型

keyは文字列、valueは型を定義したもので統一、keyとvalueの組み合わせ

sample
▼variables.tfへの記載例
variable "back" {
  type = map(number)
  default = {
    "OHTANI"   = 17
    "TSUTSUGO" = 25
  }
}

▼terraform.tfvarsへの記載例
back = {
  "OHTANI"   = 28
  "TSUTSUGO" = 31
}

any型

後天的に型を定義してくれる万能変数(何を入れれば良いのかの可視性が低い)

sample
▼variables.tfへの記載例
variable "player" {
  type        = any
  description = "何でも入る"
}

▼terraform.tfvarsへの記載例
※いきなりobject型を定義可能
player = {
  style  = "2way" 
  number = 17
}

参考文献

aws configure
.terraform-version
terraformの外部変数取り込み順番

Discussion