目次
はじめに
ディーネットの牛山です。
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ブロックと異なり、動作を停止することはできませんが、確認用としては充分ではないでしょうか。
プロフィール
AWSの設計・構築をメインにおこなっています。
運用・保守をおこなう部署におりましたが、最近、アーキテクト課に異動しました。
日々精進しております。
LINK
クラウドベリージャム:プロフィールページ