Terraform
Getting Started
- 初心者向けガイド: https://www.terraform.io/guides/
- ドキュメント: https://www.terraform.io/docs/
参考:
仕様
State
https://www.terraform.io/docs/state/
Locking
https://www.terraform.io/docs/state/locking.html
backendによってサポートされていれば、排他制御が可能。
Examples
公式のを見ると良い。
ベストプラクティス
公式: https://github.com/hashicorp/best-practices/tree/master/terraform
Terraform Version | 記事 |
---|---|
v0.10 | Terraform Best Practices in 2017 - Qiita |
v0.7.x | Terraformにおけるディレクトリ構造のベストプラクティス | Developers.IO |
オレオレ:
- TerraformでWorkspaceを使わずに複数環境をDRYに設定する - Qiita … Terraform v0.10〜v0.11ぐらい対応
参考:
- Structuring HashiCorp Terraform Configuration for Production … 2020-03-27. Workspacesを使わずにディレクトリを分けることのメリットが述べられている。
Versions
v0.13
v0.12ほどではないが、非互換の変更があり、アップグレード時には対応が必要。
https://www.terraform.io/upgrade-guides/0-13.html
v0.11以前の人は一度、v0.12に上げてからv0.13にアップグレードする必要がある。
How-to
バージョン固定
Terraform Settings - Configuration Language - Terraform by HashiCorp
Examples:
terraform {
required_version = ">= 0.12"
required_providers {
aws = ">= 2.8"
local = "1.2"
}
}
provider "http" {
version = "1.2.0"
}
- terraformのversion指定はtfenvでも可能
参考:
BackendのS3やGCS等そのものをTerraformで管理
参考:
Tips
デバッグ
https://www.terraform.io/docs/internals/debugging.html
ログレベルの変更
TF_LOG
環境変数に TRACE, DEBUG, INFO, WARN, ERROR
のいずれかをセットすることで変更できる。
TF_LOG=DEBUG terraform plan
※しかし、どれを指定してもtraceレベルのログが出る気が…(v0.10.x)
countを使って複数のリソースを作成
Examples:
variable "instance_ips" {
default = {
"0" = "10.11.12.100"
"1" = "10.11.12.101"
"2" = "10.11.12.102"
}
}
resource "aws_instance" "app" {
count = "3"
private_ip = "${lookup(var.instance_ips, count.index)}"
# ...
}
variable "rds_roles" {
default = ["WRITER", "READER"]
}
resource "aws_cloudwatch_metric_alarm" "rds_cpu" {
count = "2"
alarm_name = "RDS-${var.rds_roles[count.index]}-CPU"
:
}
参考:
- https://www.terraform.io/docs/configuration/resources.html#using-variables-with-count
- terraformでautoscalingしているサーバのcloudwatch alarmを自動設定する - Qiita
- Terraform でループして複数のリソースを作成する - Qiita
変数やoutputでmapを使うと記述量が減って便利
参考:
mapのlistを作る方法
できない説
- Cannot pass a list of maps to a resource/data · Issue #7705 · hashicorp/terraform
- Terraform でループして複数のリソースを作成する - Qiita
…が、手元で試したところ(v0.10.x)、下のようにしてlistとして定義・参照することができた。
variable "my_complex_data" {
type = "list"
default = [
{
id = "1"
name = "taro"
height = "170"
},
{
id = "2"
name = "hanako"
height = "160"
},
]
}
foo_list = "${var.my_complex_data}"
Tools
3rd Partyのツール
tfenv
https://github.com/Zordrak/tfenv
rbenv, anyenvのようなツールで、複数バージョンのterraformを切り替えて使えるようになるもの。
参考:
参考
CLI
terraform command