v0.11
v0.11以前の構文
設定ファイルの記法等。
v0.12以降に対応。
v0.11以前は子ページを見よ。
$
をそのまま文字列内で扱いたいときは "$$"
とエスケープする。https://www.terraform.io/docs/configuration/variables.html
terraformで使用する変数は .tf
ファイル内に variable
ブロックで定義する。
定義ブロック内で default
値を設定することもできるが、以下のいくつかの方法で値を注入できる。
.tfvars
ファイルに HCL or JSON で記述し、terraform実行時に -var-file <FILE>
という引数で渡すterraform.tfvars
ファイルまたはsuffixが .auto.tfvars
のファイルは自動的に読み込まれる。-var 'key=value'
という引数で渡すTF_VAR_keyname
を設定すると keyname
変数がセットされる参考:
https://www.terraform.io/docs/configuration/locals.html
module内などのスコープで使える変数を定義する。
variableで定義した変数を参照したり、演算結果を使ったり出来るので便利。
参考:
https://www.terraform.io/docs/configuration/types.html
string
number
bool
NOTE:
string
<=> [number
, bool
] の型変換が必要に応じて自動的に行われるtrue
<=> "true"
false
<=> "false"
Collection Types:
list(...)
list(string)
map(...)
map(string)
だったら、各要素の値がstring型ということset(...)
Structural Types:
ojbect(...)
object({ name=string, age=number })
tuple(...)
tuple([string, number, bool])
https://www.terraform.io/docs/configuration/expressions.html
https://www.terraform.io/docs/configuration/expressions.html#splat-expressions
[*]
によるリストの展開
Examples
# 1
var.list[*].id
## for式による↑と等価な構文
[for o in var.list : o.id]
# 2
var.list[*].interfaces[0].name
## for式による↑と等価な構文
[for o in var.list : o.interfaces[0].name]
https://www.terraform.io/docs/configuration/expressions.html#dynamic-blocks
resource内のブロックの繰り返し記述をDRYに書けるようになった。
Example:
resource "aws_elastic_beanstalk_environment" "tfenvtest" {
name = "tf-test-name"
application = "${aws_elastic_beanstalk_application.tftest.name}"
solution_stack_name = "64bit Amazon Linux 2018.03 v2.11.4 running Go 1.12.6"
dynamic "setting" {
for_each = var.settings
content {
namespace = setting.value["namespace"]
name = setting.value["name"]
value = setting.value["value"]
}
}
}
※あまり使いすぎない方がいいと書いてある。
https://www.terraform.io/docs/configuration/functions.html
v0.11以前は Interpolation Syntax
だったもの。
https://www.terraform.io/docs/configuration/functions/concat.html
listの結合
Examples:
> concat(["a", ""], ["b", "c"])
[
"a",
"",
"b",
"c",
]
https://www.terraform.io/docs/configuration/functions/jsondecode.html
JSONをデコードしてobject(map), tuple(list), stringなどを作る。
逆の操作をする関数は jsonencode
Examples:
> jsondecode("{\"hello\": \"world\"}")
{
"hello" = "world"
}
> jsondecode("true")
true
https://www.terraform.io/docs/configuration/functions/format.html
printfのような書式指定出力機能を提供する。
構文:
format(spec, values...)
Examples:
> format("Hello, %s!", "Ander")
Hello, Ander!
> format("There are %d lights", 4)
There are 4 lights
https://www.terraform.io/docs/configuration/resources.html#meta-parameters
全てのresourceで使えるパラメータ。
count
のように複数のリソースを定義できる。
参考:
このブロックは以下のキーを取る:
create_before_destroy
(bool) … リソースを作り直すときに、元のを削除する前に
新しいリソースを作っておく。prevent_destroy
(bool) … リソースの削除を防ぐignore_changes
(list of strings) … リソースの特定のパラメータの変化を無視するresource "aws_autoscaling_group" "my_cluster" {
min_size = 1
max_size = 10
desired_capacity = 1
lifecycle {
ignore_changes = ["desired_capacity"]
}
}
参考:
https://www.terraform.io/docs/state/workspaces.html
.tf
ファイル内で ${terraform.workspace}
でworkspace名を参照できる。
Example:
resource "aws_instance" "example" {
count = "${terraform.workspace == "default" ? 5 : 1}"
# ... other arguments
}
参考:
https://www.terraform.io/docs/configuration/terraform.html
Terraformの設定。
Example:
terraform {
backend "s3" {
:
}
required_version >= "0.12.0"
}
https://www.terraform.io/docs/backends/
https://www.terraform.io/docs/backends/config.html#partial-configuration
一部の設定を .tf
ファイルではなくコマンドラインや外部ファイルで渡す方式。
レシピを module という単位にまとめて再利用性を高めることができる。
Tips:
${path.module}
によってmoduleのルートパスを取得できる.
などでは上手く行かないケースがありそう参考:
https://www.terraform.io/docs/language/modules/sources.html
moduleのsourceとして指定できるものにはどんな種類があるか。
以下は例:
データを既存インフラや他のTerraform被管理物から取ってくる。
moduleの属性値を他のmoduleで利用できるようにしたり、remote stateとして他の環境から参照可能にしたりする。
https://www.terraform.io/docs/configuration/outputs.html
for構文はネストできるので、for構文で所望のパラメータを持ったリストを生成し、それを for_each
や count
で使う。
Example:
locals {
params = flatten([
for project in var.project_ids :
[ for key in var.keys : join(",", [project, key]) ]
])
}
resource "foo_resource" "my_foo" {
for_each = toset(local.params)
project = split(",", each.value)[0]
key = split(",", each.value)[1]
}
NGなやり方(v0.13以前):
for_each
や count
単体ではできないfor_each
や count
を使い、moduleを for_each
や count
で定義する <- サポートされていない参考:
Terraform v0.12から for_each
によって複数のresourceの定義が可能になった。
従来の count
と違い、個々のresourceのtfstate内の識別子は連番の番号ではなく、文字列のキーがつくので、要素の追加や削除があっても複数のresourceがまとめて作り直される、ということがない。
よって、 for_each
が使えるならば、 for_each
を使ったほうがいい。
参考:
v0.11以前の構文