{Terraform} validation, precondition and postcondition

 

https://www.bioerrorlog.work/entry/validate-terraform-variables
https://dev.classmethod.jp/articles/terraform-precondition-postcondition/
https://dev.classmethod.jp/articles/launch-ec2-from-latest-amazon-linux2-ami-by-terraform/


cat <<-'EOF' > variables.tf

variable "instance_type" {
  type        = string
  description = "instance_type"

  validation {
    condition     = contains(["t2.micro", "t3.micro"], var.instance_type)
    error_message = "Only micro is allowed"
  }
}

EOF


cat <<-'EOF' > main.tf


terraform {
  required_version = "= 1.5.7"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "= 4.17.0"
    }
  }
}


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

data aws_ssm_parameter amzn2_ami {
  name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
}

data "aws_ec2_instance_type" "instance" {
  instance_type = var.instance_type
  
  lifecycle {
    postcondition {
      condition     = self.ebs_optimized_support == "unsupported"
      error_message = "${var.instance_type} EBS optimization check fail" 
    }
  }

}


resource "aws_instance" "instance01"{
  ami                         = data.aws_ssm_parameter.amzn2_ami.value
  instance_type               = var.instance_type
  key_name                    = "key1"
  
  tags = {
    Name = "instance01"
  }
  
  lifecycle {
    precondition {
      condition = data.aws_ec2_instance_type.instance.free_tier_eligible
      error_message = "${var.instance_type} is not part of the AWS Free Tier"
    }
  }
  
}

EOF

 

cat <<-'EOF' > outputs.tf

output "aws_instance_instance01_public_ip" {
  value = "${aws_instance.instance01.*.public_ip}"
}


EOF

 

 

terraform init
terraform fmt
terraform -version

export TF_VAR_instance_type=m4.large

export TF_VAR_instance_type=t3.micro

export TF_VAR_instance_type=t2.micro


terraform apply -auto-approve

 

 

terraform destroy -auto-approve