check ブロック — インフラのアサーション検証(1.5+)

1. 概要

  • checkブロックとは何か(Terraform 1.5以降)
  • assertによる条件検証
  • dataブロックとの組み合わせ
  • precondition/postconditionとの違い
  • 実際のユースケース

checkブロックはTerraform 1.5で導入された、インフラの状態をapplyとは独立して検証する機能です。checkの失敗はapplyを止めず、警告として表示されるのが特徴です。


2. checkブロック vs precondition/postcondition

比較checkブロックprecondition/postcondition
配置場所トップレベルブロックresource/data内のlifecycleブロック
失敗時の挙動警告のみ(applyは続行)エラーでapplyを中断
dataブロック独自のdataを持てる親リソースの属性のみ参照可能
用途外部依存・実行後の状態確認リソースの事前/事後条件チェック

3. 基本構文

check "チェック名" {
  # オプション: このcheckだけのdataブロック
  data "データソース" "名前" {
    ...
  }

  assert {
    condition = <検証式>
    error_message = "<エラーメッセージ>"
  }
}

4. HTTPエンドポイントの死活確認

terraform {
  required_version = ">= 1.9"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
    http = {
      source  = "hashicorp/http"
      version = "~> 3.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

variable "environment" {
  description = "環境名"
  type        = string
  default     = "dev"
}

resource "aws_lb" "web" {
  name               = "${var.environment}-web-alb"
  internal           = false
  load_balancer_type = "application"

  tags = {
    Name        = "${var.environment}-web-alb"
    Environment = var.environment
    ManagedBy   = "terraform"
  }
}

# apply後にALBのエンドポイントが応答するか確認
check "alb_health" {
  data "http" "alb_check" {
    url = "https://${aws_lb.web.dns_name}/health"
  }

  assert {
    condition     = data.http.alb_check.status_code == 200
    error_message = "ALBのヘルスチェックが失敗しました。status_code = ${data.http.alb_check.status_code}"
  }
}

5. S3バケットの設定確認

resource "aws_s3_bucket" "app_data" {
  bucket = "${var.environment}-app-data"

  tags = {
    Name        = "${var.environment}-app-data"
    Environment = var.environment
    ManagedBy   = "terraform"
  }
}

resource "aws_s3_bucket_versioning" "app_data" {
  bucket = aws_s3_bucket.app_data.id
  versioning_configuration {
    status = "Enabled"
  }
}

# バケットのバージョニングが有効か確認
check "s3_versioning_enabled" {
  data "aws_s3_bucket" "verify" {
    bucket = aws_s3_bucket.app_data.id
  }

  assert {
    condition     = data.aws_s3_bucket.verify.id == aws_s3_bucket.app_data.id
    error_message = "S3バケットが期待通りに存在しません。"
  }
}

6. 変数の論理整合性を確認する

dataブロックなしで、変数の組み合わせの論理チェックにも使えます。

variable "enable_multi_az" {
  description = "Multi-AZ有効化(本番環境のみ推奨)"
  type        = bool
  default     = false
}

# 本番環境でMulti-AZが無効の場合に警告
check "prod_multi_az_warning" {
  assert {
    condition     = !(var.environment == "prd" && !var.enable_multi_az)
    error_message = "本番環境でMulti-AZが無効になっています。可用性リスクがあります。"
  }
}

7. 関連記事


8. まとめ

  • checkブロックはTerraform 1.5以降で利用可能
  • 失敗してもapplyは継続される(警告として表示)
  • 独自のdataブロックを持てるため、外部APIやエンドポイントの確認が可能
  • precondition/postconditionはエラーでapplyを止めたい場合に使う
  • 本番環境のデプロイ後の疎通確認や設定ドリフト検出に有効

動作確認バージョン: Terraform >= 1.5 公式ドキュメント: https://developer.hashicorp.com/terraform/language/checks