# AWS Terraform VM Provisioning

This project provisions AWS EC2 instances with full virtualization support for running Docker, WSL, VMs, and other nested virtualization technologies.

## Features

### Virtualization Support
- **Nested Virtualization**: Intel VT-x/AMD-V support enabled
- **Enhanced Networking**: SR-IOV and ENA support for high performance
- **Instance Types**: Uses `m5n.large` by default (supports nested virtualization)
- **Docker Ready**: Pre-configured for Docker installation and usage
- **WSL Support**: Windows instances support WSL2 and Virtual Machine Platform

### Instance Configuration
- **Default Instance Type**: `m5n.large` (supports nested virtualization)
- **Enhanced Networking**: SR-IOV enabled for better network performance
- **Root Volume**: Configurable GP3 storage (30GB, 60GB, 100GB, or 300GB)
- **Security**: Dedicated security groups for instance and ALB
- **DNS**: Automatic Route53 DNS record creation
- **SSL**: Support for existing AWS Certificate Manager certificates

### Operating System Support
- **Linux**: Debian 11, Debian 12 with SSH access
- **Windows**: Windows Server 2022, 2025 with RDP access
- **Automatic Detection**: OS-specific configuration based on selected AMI

## Usage

### Basic Provisioning
```bash
make apply
```

### Test Specific Operating Systems
```bash
# Test with Debian 12
make test-debian12

# Test with Windows Server 2022
make test-windows2022

# Test with custom AMI
make test-os OPERATING_SYSTEM=ami-xxxxxxxxx
```

### Instance Types Supporting Nested Virtualization
- `m5n.large` (default)
- `m5n.xlarge`
- `c5n.large`
- `c5n.xlarge`
- `r5n.large`
- `r5n.xlarge`
- Metal instances (bare metal)

## Configuration

### Environment Variables
Key environment variables for virtualization:
- `INSTANCE_TYPE`: EC2 instance type (default: `m5n.large`)
- `OPERATING_SYSTEM`: AMI ID for the instance
- `WINDOWS_OS_SELECTED`: Set to `true` for Windows instances
- `DISK_SIZE`: Root volume size in GB (30, 60, 100, or 300, default: 60)

### Terraform Variables
- `enable_nested_virtualization`: Enable nested virtualization (default: true)
- `is_windows`: Configure for Windows instance
- `instance_type`: EC2 instance type
- `disk_size`: Root volume size in GB (default: 60)

## Virtualization Capabilities

### Linux Instances
- Docker containers
- KVM/QEMU virtual machines
- LXC/LXD containers
- Virtual development environments

### Windows Instances
- WSL2 (Windows Subsystem for Linux)
- Hyper-V virtual machines
- Docker Desktop for Windows
- Virtual Machine Platform features

## Troubleshooting

### WSL Installation Issues
If you encounter WSL registration errors like:
```
WslRegisterDistribution failed with error: 0x80370102
Please enable the Virtual Machine Platform Windows feature
```

This configuration automatically enables:
1. Enhanced networking (SR-IOV)
2. Intel VT-x/AMD-V support
3. Instance types that support nested virtualization

### Performance Considerations
- Use `m5n`, `c5n`, or `r5n` instance types for best virtualization performance
- Enhanced networking provides better I/O performance for containers and VMs
- Consider larger instance types for resource-intensive virtualization workloads

## Security

### Network Security
- Dedicated security groups for instance and load balancer
- SSH (port 22) access for Linux instances
- RDP (port 3389) access for Windows instances
- Application ports secured through ALB

### Access Control
- Generated SSH keys for Linux instances
- Automated password retrieval for Windows instances
- Secure credential storage in public download area

## Architecture

The provisioned infrastructure includes:
- VPC with public and secondary subnets
- Internet Gateway for public access
- Application Load Balancer with SSL support
- Route53 DNS records
- EC2 instance with virtualization support
- Security groups for network isolation