【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時にエラーが出力される場合も考えられる。
プロバイダー
プロバイダーというものがあり(簡単に言うとプラグイン的な位置づけ)、例えばAWSやGCP, 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系は省略。
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
プロバイダの構成(書き方)
#### 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
v0.14系はv0.13のリリースから早々にリリースされたよう。 なので、v0.13の変更点は大幅なアップグレードが少なくなっている印象。
sensitive入力変数の追加
sensitiveは、セキュリティ面を考慮された使い方になりそう。
terraform planを実行した際、標準出力させたくない値を(sensitive)として出力させることができる。
※例としてAWSのVPCの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_DIFFを0 にすると良い。
以上.