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. 関連記事
- precondition / postcondition の使い方 — エラーでapplyを中断する条件検証
- lifecycle の使い方 — リソースのライフサイクル制御
- data(データソース)の使い方 — 既存リソースの参照方法
- terraform test — テストの書き方(1.6+)
- resourceブロック — 基本構文と使い方
- terraform fmt / validate — コード整形と構文チェック
8. まとめ
checkブロックはTerraform 1.5以降で利用可能- 失敗してもapplyは継続される(警告として表示)
- 独自の
dataブロックを持てるため、外部APIやエンドポイントの確認が可能 precondition/postconditionはエラーでapplyを止めたい場合に使う- 本番環境のデプロイ後の疎通確認や設定ドリフト検出に有効
動作確認バージョン: Terraform >= 1.5 公式ドキュメント: https://developer.hashicorp.com/terraform/language/checks