Terraform
https://gyazo.com/80c32d339bd3c95e05f10b4ffa8e0ce0
HashiCorp製のプロビジョニングツール
AWSやAzureやGCPの設定をコードで書ける
HCLで書く
website
github
Terraformを入れる
tfstate
HCLの主要ブロック
provider
Provider (Terraform)
resource
resource (Terraform)
data
Data Source (Terraform)
variable
variable (Terraform)
output
output variable (Terraform)
locals
Terraformのlocal values
module
Terraform Module
コマンド(の一部)
λ terraform init
λ terraform plan
λ terraform apply
--
λ terraform console
λ terraform import
参考
『詳解 Terraform 第3版』
#WIP
resource同士で依存関係がある場合、どういう順番で作成するべきかを判断する
また可能な限り並列にリリースを作成するので速い
https://zenn.dev/loglass/articles/daa570bddebdeb
https://speakerdeck.com/emiki/terraform-this-and-that
Terraformを実務で使う
precondition block (Terraform)
/mrsekut-book-4814400527/613 (8.3.3.2 事前条件と事後条件)
λ terraform apply実行前にエラーを補足する
Terraformのlifecycleの中に書くの?
/mrsekut-book-4814400527/617 (8.3.3.3 バリデーション、 事前条件、 事後条件の使い時)
postcondition block (Terraform)
/mrsekut-book-4814400527/613 (8.3.3.2 事前条件と事後条件)
λ terraform apply実行後のエラーを補足する
/mrsekut-book-4814400527/617 (8.3.3.3 バリデーション、 事前条件、 事後条件の使い時)
Terraformのbuil-in Functions
Zero Downtime Deployment
/mrsekut-book-4814400527/364 (5.3 ゼロダウンタイムデプロイ)
https://groups.google.com/g/terraform-tool/c/7Gdhv1OAc80/m/iNQ93riiLwAJ
create_before_destroyを使う
/mrsekut-book-4814400527/389 (5.4.2 ゼロダウンタイムデプロイの制限事項)
instance_refreshを使うべき(?)
文法
count
code:tf
resource "aws_iam_user" "example" {
count = length(var.user_names)
name = var.user_namescount.index
}
古い書き方っぽい
不便そうmrsekut.icon
そもそもcountが関数的なものでなくattributeなのが意味不明すぎ
/mrsekut-book-4814400527/312 (5.1.1 countパラメータによるループ)
配列の内容を変更したときに作り直されてしまう罠とかある
inline block (Terraform)に対して使えない
/mrsekut-book-4814400527/348 (5.2.1 countパラメータを使った条件分岐)
条件分岐
/mrsekut-book-4814400527/386 (5.4.1 countとfor eachの制限事項)
for_each
/mrsekut-book-4814400527/326 (5.1.2 for each式によるループ)
collectionに対してループして、each.keyとeach.valueでアクセスできる
code:tf
resource "aws_iam_user" "example" {
for_each = toset(var.user_names)
name = each.value
}
dynamic Blocks (Terraform)と合わせて利用する
/mrsekut-book-4814400527/358 (5.2.2 for eachとforを使った条件分岐)
/mrsekut-book-4814400527/386 (5.4.1 countとfor eachの制限事項)
for
/mrsekut-book-4814400527/339 (5.1.3 for式によるループ)
[for <ITEM> in <LIST> : <OUTPUT>]
code:tf
output "short_upper_names" {
value = for name in var.names : upper(name) if length(name) < 5
}
リスト内包表記的
/mrsekut-book-4814400527/358 (5.2.2 for eachとforを使った条件分岐)
文字列ディレクティブ
%{...}
↑$ではなく
文字列内でインラインの制御構文(for, if, etc.)を使える
/mrsekut-book-4814400527/361 (5.2.3 if文字列ディレクティブを使った条件分岐)
arrays[*]
index accessする際に*を指定することをsplat expressionと呼ぶらしい
TerraformのTest
TFLint
https://github.com/terraform-linters/tflint
gitには.terraform.lock.hclも保存する
gitignore
code:.gitignore
.terraform
*.tfstate
*.tfstate.backup
tfstateは入れない
heredoc
なんか文法の名前らしい
<<-EOFとEOFは、\nを入れなくても複数行にわたる文字列を渡せる
<<-EOT で開始して、EOTで終わるように囲むとヒアドキュメントになる
こんなものまであるんだ
resource "tls_private_key"
resource "aws_key_pair"
不満mrsekut.icon
静的解析がやや弱い
されるのはされる
resource名のtypoとかが検出されていない
aws_launch_configuration.example.nameのように参照する時に、
aws_launch_configuration.exampleの定義には一見nameというものがないのに参照できるのが難しい
暗黙のattributeのようなものが存在している
それを一覧する術がない
例えばtsならgo to definitionして型定義ファイルを見れば一覧できるわけだがそういうのがない
Terraformのコードからダイアグラム図を生成する良さげなツールがない
Pluralith
https://developer.hashicorp.com/terraform/language/style
Style Guide
Stacks
BETA
Files and Directories
Syntax
Resources
Data Sources
Providers →Provider (Terraform)
Variables and Outputs
Modules
Moved block
Terraform block
Backend block
Checks
Import
Expressions
Functions
State
Tests
Upgrading to Terraform v1.11
v1.x Compatibility Promises