許可値付きEC2インスタンスタイプを定義する
contains()バリデーションで承認済みインスタンスファミリーに選択肢を制限するTerraformのEC2インスタンスタイプ変数を作成します。
AWS Basics
詳細な説明
EC2インスタンスタイプ変数
インフラストラクチャで許可されるEC2インスタンスタイプを制御することで、偶発的なコスト超過を防ぎ、環境間の一貫性を確保できます。
変数定義
variable "instance_type" {
type = string
description = "EC2 instance type for the compute resources"
default = "t3.micro"
validation {
condition = contains(["t3.micro", "t3.small", "t3.medium", "t3.large", "m5.large", "m5.xlarge"], var.instance_type)
error_message = "Instance type must be one of: t3.micro, t3.small, t3.medium, t3.large, m5.large, m5.xlarge."
}
}
環境別の値
# dev.tfvars
instance_type = "t3.micro"
# staging.tfvars
instance_type = "t3.medium"
# prod.tfvars
instance_type = "m5.large"
なぜ正規表現ではなくcontains()を使うのか?
- 明示的な許可リスト: どの値が許可されているか正確にわかる
- 自己文書化: エラーメッセージがすべての有効なオプションをリスト
- 更新が容易: 新しいインスタンスタイプの追加は1行の変更
- 正規表現の複雑さなし:
contains()はよりシンプルでエラーが少ない
コスト管理パターン
予算制約のある組織では、環境ごとの制限を強制するためにローカルマップと組み合わせます:
locals {
allowed_types = {
dev = ["t3.micro", "t3.small"]
staging = ["t3.small", "t3.medium"]
prod = ["m5.large", "m5.xlarge", "m5.2xlarge"]
}
}
このパターンにより、開発者が開発環境で誤って高価なインスタンスを起動することを防げます。
ユースケース
環境やチームごとに利用可能なインスタンスタイプを制限してインフラコストを管理する必要があるエンタープライズTerraformモジュール。