# Variable definitions variable "environment" { type = string description = "Deployment environment" default = "development" validation { condition = contains(["development", "staging", "production"], var.environment) error_message = "Environment must be development, staging, or production." } } # Local values locals { common_tags = { Environment = var.environment Project = "example" ManagedBy = "terraform" } region_config = { us-east-1 = { instance_type = "t3.micro" az_count = 2 } us-west-2 = { instance_type = "t3.small" az_count = 3 } } } # Provider configuration provider "aws" { region = "us-west-2" assume_role { role_arn = "arn:aws:iam::123456789012:role/terraform" } default_tags { tags = local.common_tags } } # Data source data "aws_availability_zones" "available" { state = "available" } # Resource block with dynamic blocks resource "aws_security_group" "example" { name_prefix = "example-sg" vpc_id = aws_vpc.main.id dynamic "ingress" { for_each = var.service_ports content { from_port = ingress.value to_port = ingress.value protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } lifecycle { create_before_destroy = true } } # Module usage module "vpc" { source = "terraform-aws-modules/vpc/aws" name = "example-vpc" cidr = "10.0.0.0/16" azs = data.aws_availability_zones.available.names private_subnets = ["10.0.1.0/24", "10.0.2.0/24"] public_subnets = ["10.0.101.0/24", "10.0.102.0/24"] enable_nat_gateway = true single_nat_gateway = true tags = merge( local.common_tags, { Name = "example-vpc" } ) } # Output values output "vpc_id" { description = "The ID of the VPC" value = module.vpc.vpc_id } output "private_subnets" { description = "List of private subnet IDs" value = module.vpc.private_subnets } # Terraform settings block terraform { required_version = ">= 1.0.0" required_providers { aws = { source = "hashicorp/aws" version = "~> 4.0" } } backend "s3" { bucket = "terraform-state-example" key = "example/terraform.tfstate" region = "us-west-2" encrypt = true dynamodb_table = "terraform-locks" } }