terraform孫の手
☝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の公式リファレンスを見ること
実践例
- 作成済みリソースをS3と紐づけたい
- 実体に沿ったterraformコードを書く
- hashicorpのS3公式リファレンスページの最下部を確認し、import方法を確認
- コマンドを実行し取り込む
terraform import リソース名 実体のバケット名
terraform apply -refresh-only
terraformコードとリソースの実体は整合性が取れているが、tfstateファイルだけが乖離している場合にtfstateファイルをリソース実体に合わせて更新するコマンド
リソースは更新されないので安心
☝terraformの外部変数取り込み順番
1から順番に読み込んで、後から定義されている変数に上書きされる(要は下記番号の数字が大きいもの程、優先順位が高)
- ローカル環境変数
terraform.tfvars
terraform.tfvars.json
-
*.auto.tfvars
又は*.auto.tfvars.json
を語彙順に読み込み - コマンドラインのオプションで指定されている、 -var と -var-file の指定された順
☝terraformの変数の種類
プリミティブ
primitive型(primitiveの意味は "基本の" "素朴な")
配列
list型
tuple型(格納する番号ごとに型が決められているlist型)
構造体
object型
map型
any
any型(何にでもなれる。困ったらコレ)
データ型
変数に定義できるデータ型を列挙
型名 | 値 | 備考 |
---|---|---|
string | 文字列 | ダブルクォーとで括る |
number | 数字 | ダブルクォーとで括る必要ナシ |
bool | true か false | ダブルクォーとで括る必要ナシ |
primitive型
変数定義における、一番シンプルな型
▼variables.tfへの記載例
variable "vpc_name" {
type = string
}
▼terraform.tfvarsへの記載例
vpc = "zumi-vpc"
list型
同じデータ型の配列
▼variables.tfへの記載例
variable "subnet_name" {
type = string
}
▼terraform.tfvarsへの記載例
vpc = [ "a_subnet" , "c_subnet" ]
tuple型
要素数ごとに型を定義可能
▼variables.tfへの記載例
variable "player" {
type = tuple([
string, number
])
default = ["OHTANI", 17]
}
▼terraform.tfvarsへの記載例
player = [ "TSUTSUGO" , 25 ]
object型
型定義自由な、keyとvalueの組み合わせ
▼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の組み合わせ
▼variables.tfへの記載例
variable "back" {
type = map(number)
default = {
"OHTANI" = 17
"TSUTSUGO" = 25
}
}
▼terraform.tfvarsへの記載例
back = {
"OHTANI" = 28
"TSUTSUGO" = 31
}
any型
後天的に型を定義してくれる万能変数(何を入れれば良いのかの可視性が低い)
▼variables.tfへの記載例
variable "player" {
type = any
description = "何でも入る"
}
▼terraform.tfvarsへの記載例
※いきなりobject型を定義可能
player = {
style = "2way"
number = 17
}
Discussion