LoginSignup
4
4

More than 3 years have passed since last update.

Terraform 0.12 おさらい

Last updated at Posted at 2019-05-28

Terraformの0.12が正式リリース

2019.5.23にTerraformが0.12が正式リリースされた
Announcing Terraform 0.12

最近Terraformを始めたので0.12-rc1で実装をしていましたが、
0.11の資産もインターネットには多く存在するので
改めて0.11と0.12の差を確認してみようと思います。

0.12upgrade

Terraform 0.12には 0.12upgrade サブコマンドが追加されているので0.11.14からの構文置換を行う事ができる
*WARNINメッセージが出力された場合は手動で修正する必要あり

主な変更点

First-Class Expressions

ダブルクォーテーションと展開式が不要になった
- 0.11 ami = "#{var.name}"
- 0.12 ami = var.name

For and For-Each

for式が使用可能になった

cidr_blocks = [
  for num in var.subnet_numbers:
  cidrsubnet(data.aws_vpc.example.cidr_block, 8, num)
]

Generalized Splat Operator

従来は複数存在するリソースのみだった*が、あらゆるリストで使える様になった

output "instance_ip_addrs" {
  value = google_compute_instance.example.network_interface.*.address
}

Conditional Operator Improvements and Conditionally Omitted Arguments

今まではプリミティブな型にしか使えなかった条件演算子が式でも使える様になった

locals {
  first_id = length(azurerm_virtual_machine.example) > 0 ? azurerm_virtual_machine.example[0].id : ""

  buckets = (var.env == "dev" ? [var.build_bucket, var.qa_bucket] : [var.prod_bucket])
}

Rich Value Types

0.11以前はlistとmapには文字列や数値といった単純な値しか使えなかったが、listの要素にlistを入れるなどができる様になった

module "subnets" {
  source = "./subnets"

  parent_vpc_id = "vpc-abcd1234"
  networks = {
    production_a = {
      network_number    = 1
      availability_zone = "us-east-1a"
    }
    production_b = {
      network_number    = 2
      availability_zone = "us-east-1b"
    }
    staging_a = {
      network_number    = 1
      availability_zone = "us-east-1a"
    }
  }
}

Reliable JSON Syntax

  • HCLの全ての機能がJSONでサポートされたので、HCLとJSONが完全に1:1になった
  • エラーメッセージが改善された
  • JSONでコメントできる用になった
{
  "variable": {
    "example": {
      "//": "This property is ignored",
      "default": "foo"
    }
  }
}

References as first-class values.

Terraform consoleでlocal変数を取得できる様になった

locals {
  region = "ap-northeast-1"
}
$ terraform console 
> local.region
ap-northeast-1 (0.11: unknown values referenced, can't compute value)

output周りの記述が変わった

outputsの指定が必要になった

output.tf
output "ecs_instance_profile_name" {
  value = aws_iam_instance_profile.ecs_instance_profile.name
}
terraform_remote_state.tf
data "terraform_remote_state" "iam_ecs_instance" {
  backend = "s3"
  config = {
    bucket = "terraform-tfstate"
    key    = "iam_ecs_instance.tfstate"
    region = "ap-northeast-1"
  }
}

0.11

resource "aws_ecs_task_definition" "task" {
  family                = "${var.name}"
  container_definitions = ...
  task_role_arn = "#{data.terraform_remote_state.iam_ecs_instance.ecs_task_role_arn}"
  network_mode  = "bridge"
}

0.12

resource "aws_ecs_task_definition" "task" {
  family                = var.name
  container_definitions = ...
  task_role_arn = data.terraform_remote_state.iam_ecs_instance.outputs.ecs_task_role_arn
  network_mode  = "bridge"
}

最後に

実際には0.11系の運用をした事は無いのと、Terraform運用歴も短いので不備は有るかもしれません。
今後もTerraformと頑張って向き合っていきたいと思います。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4