Terraform

Getting Started

参考:

仕様

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.10Terraform Best Practices in 2017 - Qiita
v0.7.xTerraformにおけるディレクトリ構造のベストプラクティス | Developers.IO

オレオレ:

参考:

Versions

v0.13

2020年8月にGA

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"
  :
}

参考:

変数やoutputでmapを使うと記述量が減って便利

参考:

mapのlistを作る方法

できない説

…が、手元で試したところ(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を切り替えて使えるようになるもの。

参考:

参考