[小ネタ] Terraformの変数で作成するリソースの設定値を切り替える

Terraformで設定値に3項演算子を使用し、planやapply実行時に渡す変数によってインスタンスタイプなどの設定値を変更してみました。 その内容を記事にしていきます。
2019.09.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、大前です。最近 Terraform を触り始めました。

最初こそ戸惑いましたが書いて動かしてを繰り返しているお陰で少しばかり慣れてきました。

将来的に Terraform派閥に行くか CloudFormation派閥 に行くか悩んでいる今日この頃であります。

 

というわけで今回は Terraform を触り始めて勉強した内容をアウトプットしたいと思います。

 

ローカル実行するときだけ設定値を変えたい

CloudFormation でも Terraform でも、期待するリソースが作成されるかを確認するためにローカルで作成した設定ファイルを実行することが多々あるかと思います。

その際、EC2のインスタンスタイプやストレージ容量など、本番レベルの設定値をそのままローカルで作成すると(お財布的に)大変な事になってしまうので、一時的に小さい値で実行したいものです。

 

Terraform の3項演算子を使ってみる

上記を解決する方法は色々考えられるかと思いますが、Terraform は 3項演算子を使って条件分岐を行うことが出来るため、今回はこれを使って実現してみます。

 

やってみた

下記の様な EC2 インスタンスを作成する blog_ec2.tf と変数を宣言する var.tf を作成しました。
# blog_ec2.tf
resource "aws_instance" "devio-ec2" {
    ami                         = "ami-0c3fd0f5d33134a76"
    availability_zone           = "ap-northeast-1a"
    associate_public_ip_address = true
    ebs_optimized               = true
    disable_api_termination     = true
    # var.env が "prd" なら m5.large
    instance_type               = "${var.env == "prd" ? "m5.large" : "t3.micro"}"
    key_name                    = "work-key"
    vpc_security_group_ids      = ["sg-0982aa69ac2e12345"]
    subnet_id                   = "subnet-098b8336712345678"
}
# var.tf
variable "env" {
    default = ""
}

ポイントは下記のみです。

変数 "env" が "prd" である場合はインスタンスタイプに "m5.large" が指定され、それ以外の場合には "t3.micro" が指定されます。

# var.env が "prd" なら m5.large
instance_type               = "${var.env == "prd" ? "m5.large" : "t3.micro"}"

実行してみる

まずは変数を設定せずに plan してみます。

変数に何も指定していないためデフォルト値の "" が使用され、これは "prd" ではないので "t3.micro" が指定されています。

 

次に、変数 "env" に "prd" を指定して plan してみます。

"env" が "prd" となった事で条件に合致し、インスタンスタイプが "m5.large" となりました。

plan 実行時に変数を渡すだけで設定値を変えることが出来ました。

おわりに

plan や apply 実行時に変数を渡すだけで設定値を変えられるため、tf ファイルの中身をいちいち修正する必要がなくなり、個人的にはかなり楽です。

もっとうまい方法があるかもしれませんが、取り急ぎ小ネタとして。

 

本記事がどなたかのお役にたてば幸いです。

以上、AWS事業本部の大前でした。

参考

Interpolation Syntax