バリデーション付きAWSリージョン変数を定義する

正規表現バリデーションで有効なAWSリージョンコードのみを受け入れるTerraformのAWSリージョン変数を作成します。

AWS Basics

詳細な説明

バリデーション付きAWSリージョン変数

最も一般的なTerraform変数の1つがAWSリージョンです。プロバイダブロックにリージョンをハードコードする代わりに、変数として定義することで、コードを変更せずに同じインフラストラクチャを異なるリージョンにデプロイできます。

変数定義

variable "aws_region" {
  type        = string
  description = "The AWS region to deploy resources in"
  default     = "us-east-1"

  validation {
    condition     = can(regex("^(us|eu|ap|sa|ca|me|af)-(north|south|east|west|central|southeast|northeast)-[0-9]+$", var.aws_region))
    error_message = "Must be a valid AWS region (e.g., us-east-1, eu-west-2)."
  }
}

tfvarsでの使用

aws_region = "eu-west-1"

ポイント

  • can(regex(...))パターンは正規表現がマッチすればtrueを、そうでなければfalseを返し、エラーを発生させません
  • 正規表現はすべてのAWSリージョン命名規則をカバー:大陸プレフィックス、方向、ゾーン番号
  • デフォルト値(us-east-1)により変数はオプション — 呼び出し元はオーバーライドできますが必須ではありません
  • このバリデーションにより、AWS APIコール時ではなくterraform plan時にタイプミスを早期検出できます

一般的な代替手段

一部のチームは正規表現の代わりにcontains()を使用して、承認済みリージョンを明示的にリストする方法を好みます:

validation {
  condition     = contains(["us-east-1", "us-west-2", "eu-west-1", "eu-central-1"], var.aws_region)
  error_message = "Only approved regions are allowed."
}

これはより厳格で、コンプライアンスのためにデプロイを特定のリージョンに制限する組織に適しています。

ユースケース

同じTerraform設定を環境間で異なるAWSリージョンにデプロイする必要があるマルチリージョンデプロイメント(devはus-east-1、prodはeu-west-1)。

試してみる — Terraform Variable Generator

フルツールを開く