AWS

Terraform 1.5のcheckブロックを試してみた

はじめに

ディーネットの牛山です。

Terrafrom Version 1.5で追加されました、checkブロックについて書こうと思います。

これまで、preconditionやpostconditionブロックを使用した、個々のデータソースやリソースを検証しテストに失敗した場合に、プランの動作を停止する機能がありました。

checkコマンドでは、Terraform記述内で独立したcheckブロックを記述しデータソースやリソースおよびモジュール出力を参照することができます。

それでは、実際にcheckコマンドの挙動を見ていきましょう。

プロジェクトの準備

以下、過去記事より、「プロジェクト作成方法」を記載していますので、terraform init部分まで進めます。

検証用RDS作成

テスト対象のRDSインスタンス作成する記述をおこないます。
作成は、以前、投稿した「TerraformでRDSインスタンスをimportしてみた」記事を参考としてインポートしたリソースをテストする形とします。

実施する内容は同じですので参考記事内「リソース確認」まで進んでいる状態とします。

また、一部、main.tf記述を以下へ修正します。

terraform {
    required_version = "1.5.0"
    required_providers {
      aws = {
          source = "hashicorp/aws"
          version = "~> 5.22.0"
      }
    }
}

variable "aws_access_key" {}
variable "aws_secret_key" {}
variable region {
  default     = "ap-northeast-1"
}

provider "aws" {
    access_key = var.aws_access_key
    secret_key = var.aws_secret_key
    region = var.region
}

checkブロック記述

プロジェクト直下に「check.tf」を新規作成し、以下内容を記述します。

vi check.tf

check "instance_class_check" {
  assert {
    condition     = strcontains(aws_db_instance.test.instance_class, "db.t3.micro")
    error_message = "${aws_db_instance.test.identifier} のDBインスタンスクラスがdb.t3.microになっていません。確認して下さい。"
  }
}

インポートしたリソースの変更

インポートしたリソース構成情報が記載されている、generated.tfを以下のように書き換えます。

vi generated.tf

・・・「中略」・・・
-  apply_immediately                     = null
+  apply_immediately                     = true
・・・「中略」・・・
-  instance_class                        = "db.t3.micro"
+  instance_class                        = "db.t3.medium"
・・・「中略」・・・

動作確認

ここまでで、テストに必要な準備が整いましたので、terraform planをおこなっていましょう。
実行すると以下のように「Warning: Check block assertion failed」となり、テストに失敗している旨の警告がでます。

aws_db_instance.test: Refreshing state... [id=terraform-import-rds]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # aws_db_instance.test will be updated in-place
  ~ resource "aws_db_instance" "test" {
      ~ apply_immediately                     = false -> true
        id                                    = "terraform-import-rds"
      ~ instance_class                        = "db.t3.micro" -> "db.t3.medium"
        tags                                  = {}
        # (49 unchanged attributes hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.
╷
x Warning: Check block assertion failed
x
x   on check.tf line 3, in check "instance_class_check":
x    3:     condition     = strcontains(aws_db_instance.test.instance_class, "db.t3.micro")
x     tqqqqqqqqqqqqqqqq
x     x aws_db_instance.test.instance_class is "db.t3.medium"
x
x terraform-import-rds のDBインスタンスクラスがdb.t3.microになっていません。確認して下さい。
╵

qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you
run "terraform apply" now.

このまま、AWS環境への反映「terraform apply」をおこなってみると、planの時同様に警告表示が出力された後に「これらのアクションを実行しますか?」と尋ねられます。

「yes」とすることで、AWS環境への反映(デプロイ)がおこなわれることが分かりました。

おわりに

check ブロックによるテストは、実際のAWS環境ではなく、Terraform記述内情報を基に検査される手法となり、terraform planおよびterraform apply時に評価されます。

preconditionやpostconditionブロックと異なり、動作を停止することはできませんが、確認用としては充分ではないでしょうか。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA