helloworlds

not a noun, it's a verb

【Terraform】各ヴァージョンについて簡単に

概要

Terraformはヴァージョンによって、微妙に記述が違っていたりすることが多く、 特にチーム(複数人)で運用する場合は、ヴァージョンの統一感をもっておいたほうがいい。

よって、その記事がどのヴァージョンなのか知ってくおくといいかもしれない。

公式のリリースノートは、Githubにて公開されているので参考に。↓

https://github.com/hashicorp/terraform/blob/master/CHANGELOG.md

詳細

現在(2020/12 時点)で肝になってくるヴァージョンは以下。

  • 0.15.0 (2020/12 時点 Unreleased)
  • 0.14.0 (2020/12 時点 released)
  • 0.13
  • 0.13.5(2020/11 時点 released)
  • 0.12
  • 0.11以下

この記事記述時の最新は、2020/09/30にリリースされた0.13.4となる。

HCL

Terraformは、HCL(HashiCorp Configuration Language)というJSON互換の記法で記述する。 コードというわけでなくYAMLみたいなイメージで、設定を記述するかんじ。

とはいえ、管理するクラウドリソースが多くなれば、記述の方法を考慮しておく必要がある。(複数のアカウントや、環境、拡張性、複数のクラウドソリューションなどを考慮)

また、ヴァージョンの更新において、単にTerraform cliバイナリを更新しても、既存のHCL1(0.11以前)で記述されたTerraformがterraform apply時にエラーが出力される場合も考えられる。

プロバイダー

プロバイダーというものがあり(簡単に言うとプラグイン的な位置づけ)、例えばAWSGCP, Azure, Herokuなどの各プラットフォームにTerraformで定義した内容をプロバイダーにプッシュする。

プロバイダー一覧: https://www.terraform.io/docs/providers/index.html

terraform init実行時に自動的にインストールされるため、Terraformユーザー側で特に気にすることはないが、 Terraformのヴァージョン自体のアップグレードで、プロバイダー側が未対応の場合もあり、警告やエラーが出力される。

ヴァージョンのアップグレードについて

基本的には、Terraformの公式ドキュメントに基づく。 例: https://www.terraform.io/upgrade-guides/0-12.html

ただし、tfenvというTerraformのヴァージョン管理ツールをローカルにインストールし、ヴァージョン管理すると便利かもしれない。

v0.11

※11系は省略。

Github: v0.11系 リリースノート

v0.12

Github: v0.12系 リリースノート

言語機能が拡張され"HCL12"が導入された。(ヴァージョン2に更新された。)

First-Class Expressions

"${var.foo}"

↓
var.foo

リストやマップもダイレクトに変数に格納可能できるようになった。

users = var.users
books = ["book_1", "book_2", "book_3"]

Rich Value Types

以前は、Terraformが自動的に期待される型変換をしていたが、 0.12以降型の指定が行えるようになった。 また、以下の例のようにオブジェクト構造のタイプも記述できるようになった。

variable "networks" {
  type = map(object({
    network_number    = number
    availability_zone = string
    tags              = map(string)
  }))
}

length Function

https://www.terraform.io/docs/configuration/functions/length.html

> length([])
0
> length(["a", "b"])
2
> length({"a" = "b"})
1
> length("hello")
5
resource "google_compute_address" "practice-int" {
  count = 2
...
}

#### ↓以下は 0.11 以前
resource "google_compute_instance" "practice" {
  count = "${google_compute_address.practice-int.count}"
...
}

#### ↓以下は 0.12 以降
resource "google_compute_instance" "practice" {
  count = length(google_compute_address.practice-int)
...
}

Dynamic blocks

公式の記載は以下。 https://www.terraform.io/docs/configuration/expressions/dynamic-blocks.html

ベストプラクティス的には、dynamicブロックの多用は避けて、再利用のできるmoduleなどにおいてはユーザー(読み手)に優しくなるので使用を推奨するとのこと。

v0.13

Github: v0.13系 リリースノート

プロバイダの構成(書き方)

#### AWS
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
}

# Configure the AWS Provider
provider "aws" {
  region = "us-east-1"
}

#### GCP
provider "google" {
  project     = "my-project-id"
  region      = "us-central1"
}

また、AWSのクレデンシャルについては、公式のココを参考にすること。 余談ですが、Kubernetesのプロバイダーも公式にあって面白そうでした。

depends_on for modules

module ブロックの中で "depends_on "と "count" 、 "for_each" が使用できるようになった。

Custom Validation Rules

変数ブロック内に、任意のカスタムルール(ヴァリデーション)を指定できる。

variable "image_id" {
  type        = string
  description = "The id of the machine image (AMI) to use for the server."

  validation {
    condition     = length(var.image_id) > 4 && substr(var.image_id, 0, 4) == "ami-"
    error_message = "The image_id value must be a valid AMI id, starting with \"ami-\"."
  }
}

公式サンプル引用

例えば、AWSのami imageなら、規則を「最初の5文字は"ami-"だよ」など指定できる。

コマンドについての変更

terraform import オプションの -provider が使用不可になった。

環境

Macであれば、Mac OS 10.12 Sierra以上が推奨されている。

v0.14

Github: v0.14系 リリースノート

v0.14系はv0.13のリリースから早々にリリースされたよう。 なので、v0.13の変更点は大幅なアップグレードが少なくなっている印象。

sensitive入力変数の追加

sensitiveは、セキュリティ面を考慮された使い方になりそう。 terraform planを実行した際、標準出力させたくない値を(sensitive)として出力させることができる。 ※例としてAWSVPCのCIDRなど。

##### 記述例
variable "user_information" {
  type = object({
    name    = string
    address = string
  })
  sensitive = true
}

##### アウトプット例(terraform plan)
Terraform will perform the following actions:

# some_resource.a will be created
  + resource "some_resource""a" {
      + name    = (sensitive)
      + address = (sensitive)
    }

ロックファイルの追加

terraform init実行時に、ロックファイルが生成される。 このファイルには、プロバイダー情報が記載されている。

プロジェクト内で aws = 3.1.0を許可しterraform init実行後、ヴァージョンを書き換えterraform initするとエラーが出力される。(= 生成されたロックファイルとヴァージョンの相違が起こるため。) なので、仮にプロバイダーのヴァージョンを変更させたい場合などは、terraform init -upgradeを実行して動作確認をするみたい。

terraform plan / apply 時の差分確認

terraform plan / applyの実行時、以前のヴァージョンまでは変更箇所のすべてが標準出力されていたが、 v0.14からは、差分レンダラー(変更箇所のみ簡潔)が追加された。 最も関連性の高い変更と識別コンテキストのみを表示するようになった。

逆に、すべて確認したい場合は、環境変数TF_X_CONCISE_DIFF0 にすると良い。

以上.