From dfff276de6d5be99d0a037ca85a2fe944f45fab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Fr=C3=B6hlich?= Date: Thu, 18 Dec 2025 13:36:51 +0100 Subject: [PATCH] Restructure project: Move AKS cluster to beispiel-k8s-cluster directory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Major improvements: - Import existing Azure AKS cluster with aztfexport - Optimize VM size from Standard_D4d_v4 to Standard_D2as_v6 (50% cost reduction) - Configure availability zones to [1, 2] - Add comprehensive monitoring setup: * New Log Analytics Workspace * OMS Agent integration * Data Collection Rule for Container Insights * Email alerts for CPU and Memory - Refactor configuration: * Extract all values to variables.tf * Rename resources with meaningful names * Add detailed outputs.tf - Add project documentation: * Comprehensive README.md * cluster-status-commands.md with useful Azure CLI commands * terraform.tfvars.example template * .gitignore for sensitive files Infrastructure changes: - Resource Group: trusted_ai_demo_rg (Germany West Central) - AKS Cluster: trai_k8s_cluster (Kubernetes 1.33) - Node Pool: 2-3 nodes with auto-scaling - Network: VNet 10.0.0.0/16, Subnet 10.0.0.0/24 - Monitoring: Full Container Insights with alerts Cost optimization: ~€75/month (down from ~€140/month) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- beispiel-terraform/README.md | 128 ---------- .../beispiel-k8s-cluster/.gitignore | 48 ++++ .../beispiel-k8s-cluster/.terraform.lock.hcl | 22 ++ .../beispiel-k8s-cluster/README.md | 219 ++++++++++++++++++ .../cluster-status-commands.md | 36 +++ .../beispiel-k8s-cluster/main.tf | 195 ++++++++++++++++ .../beispiel-k8s-cluster/outputs.tf | 50 ++++ .../beispiel-k8s-cluster/provider.tf | 10 + .../beispiel-k8s-cluster/terraform.tf | 11 + .../terraform.tfvars.example | 28 +++ .../beispiel-k8s-cluster/variables.tf | 83 +++++++ beispiel-terraform/main.tf | 123 ---------- beispiel-terraform/outputs.tf | 56 ----- beispiel-terraform/terraform.tfstate | 1 - beispiel-terraform/terraform.tfstate.backup | 1 - beispiel-terraform/terraform.tfvars | 23 -- beispiel-terraform/terraform.tfvars.example | 23 -- beispiel-terraform/variables.tf | 65 ------ 18 files changed, 702 insertions(+), 420 deletions(-) delete mode 100644 beispiel-terraform/README.md create mode 100644 beispiel-terraform/beispiel-k8s-cluster/.gitignore create mode 100644 beispiel-terraform/beispiel-k8s-cluster/.terraform.lock.hcl create mode 100644 beispiel-terraform/beispiel-k8s-cluster/README.md create mode 100644 beispiel-terraform/beispiel-k8s-cluster/cluster-status-commands.md create mode 100644 beispiel-terraform/beispiel-k8s-cluster/main.tf create mode 100644 beispiel-terraform/beispiel-k8s-cluster/outputs.tf create mode 100644 beispiel-terraform/beispiel-k8s-cluster/provider.tf create mode 100644 beispiel-terraform/beispiel-k8s-cluster/terraform.tf create mode 100644 beispiel-terraform/beispiel-k8s-cluster/terraform.tfvars.example create mode 100644 beispiel-terraform/beispiel-k8s-cluster/variables.tf delete mode 100644 beispiel-terraform/main.tf delete mode 100644 beispiel-terraform/outputs.tf delete mode 100644 beispiel-terraform/terraform.tfstate delete mode 100644 beispiel-terraform/terraform.tfstate.backup delete mode 100644 beispiel-terraform/terraform.tfvars delete mode 100644 beispiel-terraform/terraform.tfvars.example delete mode 100644 beispiel-terraform/variables.tf diff --git a/beispiel-terraform/README.md b/beispiel-terraform/README.md deleted file mode 100644 index fc791a8..0000000 --- a/beispiel-terraform/README.md +++ /dev/null @@ -1,128 +0,0 @@ -# Trusted AI Demo - OpenTofu Infrastructure - -This project contains OpenTofu/Terraform configuration for the Trusted AI Demo infrastructure on Azure. - -## Infrastructure Components - -This configuration creates: - -- **Resource Group**: Container for all Azure resources -- **Virtual Network**: 10.0.0.0/16 address space -- **Subnet**: 10.0.1.0/24 for VM placement -- **Network Security Group**: With RDP (port 3389) rule for remote access -- **Public IP**: Static public IP for VM access -- **Network Interface**: Connects VM to the virtual network -- **Windows Server 2022 VM**: Standard_B2s (2 vCPUs, 4 GB RAM) - -## Prerequisites - -- [OpenTofu](https://opentofu.org/) >= 1.0 or [Terraform](https://www.terraform.io/) >= 1.0 -- Azure CLI configured with appropriate credentials -- Azure subscription with necessary permissions - -## Getting Started - -### 1. Authenticate with Azure - -```bash -az login -az account set --subscription "" -``` - -### 2. Initialize OpenTofu - -```bash -tofu init -``` - -Or if using Terraform: - -```bash -terraform init -``` - -### 3. Review the Plan - -```bash -tofu plan -``` - -### 4. Apply the Configuration - -```bash -tofu apply -``` - -## Project Structure - -- `main.tf` - Main infrastructure configuration -- `variables.tf` - Input variable definitions -- `outputs.tf` - Output value definitions -- `terraform.tfvars.example` - Example variable values (copy to `terraform.tfvars`) - -## Configuration - -### Required Configuration - -1. Copy the example variables file: - ```bash - cp terraform.tfvars.example terraform.tfvars - ``` - -2. Edit `terraform.tfvars` and set your admin password: - ```hcl - admin_password = "YourSecurePassword123!" - ``` - - **Important**: The password must be at least 12 characters long and contain uppercase, lowercase, and numbers. - -3. **Security Recommendation**: Change `allowed_rdp_source` to your public IP address instead of `"*"`: - ```hcl - allowed_rdp_source = "YOUR_PUBLIC_IP/32" - ``` - - You can find your public IP with: - ```bash - curl ifconfig.me - ``` - -### Optional Customization - -You can also customize: -- `resource_group_name`: Name of the resource group -- `location`: Azure region (default: westeurope) -- `vm_name`: Name of the virtual machine -- `vm_size`: VM size (default: Standard_B2s) -- `vnet_address_space`: Virtual network address space -- `subnet_address_prefix`: Subnet address prefix - -## Connecting to the VM - -After the infrastructure is created, you can connect to the Windows VM via RDP: - -1. Get the public IP address: - ```bash - tofu output vm_public_ip - ``` - -2. Connect using Remote Desktop: - - **Windows**: Use the connection string from output: - ```bash - tofu output rdp_connection_string - ``` - - **macOS**: Use Microsoft Remote Desktop app - - **Linux**: Use Remmina or similar RDP client - -3. Login credentials: - - Username: The value you set for `admin_username` (default: azureadmin) - - Password: The password you set in `terraform.tfvars` - -## Cleanup - -To destroy all resources: - -```bash -tofu destroy -``` - -**Warning**: This will permanently delete all resources created by this configuration. diff --git a/beispiel-terraform/beispiel-k8s-cluster/.gitignore b/beispiel-terraform/beispiel-k8s-cluster/.gitignore new file mode 100644 index 0000000..de304c6 --- /dev/null +++ b/beispiel-terraform/beispiel-k8s-cluster/.gitignore @@ -0,0 +1,48 @@ +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sensitive data +*.tfvars +*.tfvars.json + +# Ignore override files as they are usually used to override resources locally +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Include override files you do wish to add to version control using negation pattern +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +*tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc + +# Ignore aztfexport generated files (optional, keep if you want version history) +aztfexportResourceMapping.json +aztfexportSkippedResources.txt + +# Ignore Mac OS files +.DS_Store + +# Ignore editor/IDE files +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Ignore kubeconfig +kubeconfig +*.kubeconfig diff --git a/beispiel-terraform/beispiel-k8s-cluster/.terraform.lock.hcl b/beispiel-terraform/beispiel-k8s-cluster/.terraform.lock.hcl new file mode 100644 index 0000000..3d1b214 --- /dev/null +++ b/beispiel-terraform/beispiel-k8s-cluster/.terraform.lock.hcl @@ -0,0 +1,22 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/azurerm" { + version = "4.33.0" + constraints = "4.33.0" + hashes = [ + "h1:3N8/4SkUbJcy+s4W74sx0KCM75T8U0ytUfSv/rCj3ok=", + "zh:1f61ce7671de78f09a8e7532bfe1366eff6e6af47050de0a06217162638b11a0", + "zh:20f103ad60399090c219685ef71d29713f46aba32499c02cc640508f8821b067", + "zh:22ce8ad46b32be74d7bd13c982f30e5ffc0749a42191de468309d4ca1ee427f2", + "zh:23ec8730b2f22701dbef4fd72459b95800bd4f87dfd517898064e291b807af20", + "zh:273202db879542def36a057072ef1b87aa0f1ccced81029c8ede55508d16080e", + "zh:2c5bc87083e7ddf55e49e3159a4836353a24a01288f78a846399453d33375938", + "zh:5dcae547287b377bc4c8e472e313d2178821264ac00cbf4fc6469dffb27a79cd", + "zh:6601669c92bea9b7c6fc7e1e20a957389e5d7c02d06cd2dcda44c6ef62f3d7df", + "zh:8b91e6153a586be514680c90b0d1a4aee7556a39376100e73dde8e9452537671", + "zh:9b6742b8b4a7bc4efa62794bd3425e39166dd3ac53fbdd8efb3214d79f36ffab", + "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + "zh:f664e54e87c9466d54adc1f0dff41d8cca8d623aca317ff38aab29522b0d2508", + ] +} diff --git a/beispiel-terraform/beispiel-k8s-cluster/README.md b/beispiel-terraform/beispiel-k8s-cluster/README.md new file mode 100644 index 0000000..b3c352c --- /dev/null +++ b/beispiel-terraform/beispiel-k8s-cluster/README.md @@ -0,0 +1,219 @@ +# AKS Cluster Terraform Configuration + +Dieses Projekt verwaltet einen Azure Kubernetes Service (AKS) Cluster mit vollständigem Monitoring und Alerting über Terraform. + +## Projektübersicht + +Der AKS Cluster wurde ursprünglich in Azure erstellt und anschließend mit `aztfexport` in Terraform importiert. Die Konfiguration wurde optimiert und um zusätzliche Monitoring-Komponenten erweitert. + +## Infrastruktur-Komponenten + +### Netzwerk +- **Resource Group**: `trusted_ai_demo_rg` (Germany West Central) +- **Virtual Network**: `trusted_ai_demo_vn` (10.0.0.0/16) +- **Subnet**: `default` (10.0.0.0/24) + +### AKS Cluster +- **Name**: `trai_k8s_cluster` +- **Kubernetes Version**: 1.33 +- **VM Size**: `Standard_D2as_v6` (2 vCPUs, 8 GB RAM) +- **Node Count**: 2-3 (Auto-Scaling) +- **Availability Zones**: 1, 2 +- **Features**: + - OIDC Issuer enabled + - Workload Identity enabled + - Image Cleaner enabled (wöchentlich) + - Automatische Updates (Sonntags) + - Azure CNI Overlay Networking + +### Monitoring & Logging +- **Log Analytics Workspace**: `aksloganalyticstraik8scluster` + - SKU: PerGB2018 + - Retention: 30 Tage +- **Data Collection Rule**: Container Insights mit: + - Container Logs V2 + - Kubernetes Events + - Pod Inventory +- **OMS Agent**: Automatisch auf allen Nodes deployed + +### Alerting +- **Action Group**: Email-Benachrichtigungen +- **Metric Alerts**: + - CPU Usage > 95% + - Memory Working Set > 100% + +## Projektstruktur + +``` +. +├── README.md # Diese Datei +├── main.tf # Haupt-Ressourcendefinitionen +├── variables.tf # Variablendefinitionen +├── terraform.tfvars # Aktuelle Variablenwerte +├── outputs.tf # Output-Definitionen +├── provider.tf # Azure Provider-Konfiguration +├── terraform.tf # Terraform-Einstellungen +├── terraform.tfstate # State-Datei (lokal) +├── aztfexportResourceMapping.json # Import-Mapping +├── aztfexportSkippedResources.txt # Übersprungene Ressourcen +└── cluster-status-commands.md # Nützliche Azure CLI Befehle + +``` + +## Verwendung + +### Voraussetzungen +- Terraform >= 1.0 +- Azure CLI +- kubectl +- Authentifizierung bei Azure (`az login`) + +### Initialisierung +```bash +terraform init +``` + +### Änderungen anzeigen +```bash +terraform plan +``` + +### Infrastruktur erstellen/aktualisieren +```bash +terraform apply +``` + +### Infrastruktur löschen +```bash +terraform destroy +``` + +### Cluster-Zugriff einrichten +```bash +az aks get-credentials --resource-group trusted_ai_demo_rg --name trai_k8s_cluster --overwrite-existing +kubectl get nodes +``` + +## Konfiguration + +### Wichtige Variablen (terraform.tfvars) + +```hcl +location = "germanywestcentral" +resource_group_name = "trusted_ai_demo_rg" +aks_cluster_name = "trai_k8s_cluster" +aks_node_vm_size = "Standard_D2as_v6" +aks_node_zones = ["1", "2"] +alert_email_address = "your-email@example.com" +``` + +### Anpassbare Parameter + +| Variable | Beschreibung | Default | +|----------|--------------|---------| +| `aks_node_pool_min_count` | Minimale Anzahl Nodes | 2 | +| `aks_node_pool_max_count` | Maximale Anzahl Nodes | 3 | +| `aks_node_vm_size` | VM-Größe für Nodes | Standard_D2as_v6 | +| `aks_node_zones` | Availability Zones | ["1", "2"] | + +## Outputs + +Nach dem Apply werden folgende Informationen ausgegeben: + +```bash +terraform output +``` + +- `aks_cluster_fqdn` - Cluster FQDN +- `aks_cluster_id` - Cluster Resource ID +- `aks_oidc_issuer_url` - OIDC Issuer URL +- `log_analytics_workspace_id` - Log Analytics Workspace ID +- Weitere... + +## Kostenübersicht + +**Monatliche Kosten (geschätzt)**: +- 2x Standard_D2as_v6 Nodes: ~€70/Monat +- Log Analytics Workspace: ~€2-5/Monat (bei geringer Nutzung) +- **Gesamt**: ~€75-80/Monat + +**Kostenoptimierung**: +- Ursprünglich Standard_D4d_v4: ~€140/Monat +- **Ersparnis**: ~€60-65/Monat (ca. 50%) + +## Import-Historie + +Das Projekt wurde mit `aztfexport` erstellt: + +```bash +aztfexport resource-group trusted_ai_demo_rg --non-interactive --plain-ui --continue +``` + +**Importierte Ressourcen**: 9 +- Resource Group +- Virtual Network + Subnet +- AKS Cluster +- Monitor Action Group +- 2x Metric Alerts +- Data Collection Rule (nachträglich hinzugefügt) +- Log Analytics Workspace (nachträglich hinzugefügt) + +**Übersprungene Ressourcen**: 2 +- Maintenance Configurations (automatisch verwaltet) + +## Optimierungen + +1. **VM-Größe**: Wechsel von Standard_D4d_v4 zu Standard_D2as_v6 + - 50% Kostenreduktion + - Moderne AMD EPYC v6 Prozessoren + - Ausreichend für die meisten Workloads + +2. **Availability Zones**: Reduziert auf Zonen 1 und 2 + - Zone 3 war für das Abonnement nicht verfügbar + +3. **Monitoring**: Komplett neu aufgesetzt + - Eigener Log Analytics Workspace (statt shared) + - Container Insights mit modernem V2 Format + - Strukturierte Alerting-Regeln + +4. **Variabilisierung**: Alle Werte in variables.tf ausgelagert + - Einfache Anpassung + - Wiederverwendbar + +## Nützliche Befehle + +Siehe [cluster-status-commands.md](./cluster-status-commands.md) für eine vollständige Liste nützlicher Azure CLI und kubectl Befehle. + +## Sicherheitshinweise + +- `terraform.tfvars` enthält sensitive Werte (Email-Adresse) und sollte nicht in Version Control eingecheckt werden +- `.gitignore` ist konfiguriert, um State-Dateien und sensitive Daten auszuschließen +- Verwenden Sie Azure Key Vault oder ähnliche Lösungen für Production-Secrets + +## Troubleshooting + +### Quota-Fehler bei Node Pool Rotation +Wenn Sie VM-Größen ändern und einen Quota-Fehler erhalten: +```bash +terraform destroy +terraform apply +``` + +### Log Analytics Workspace existiert nicht +Falls der Workspace gelöscht wurde, erstellt Terraform automatisch einen neuen. + +## Weiterführende Schritte + +- [ ] State zu Azure Blob Storage migrieren (Remote State) +- [ ] Azure Key Vault Integration für Secrets +- [ ] CI/CD Pipeline einrichten +- [ ] Weitere Monitoring Dashboards erstellen +- [ ] Backup-Strategie implementieren + +## Kontakt + +Für Fragen oder Probleme, siehe die GitHub Issues. + +## Lizenz + +Projekt für Demo-Zwecke. diff --git a/beispiel-terraform/beispiel-k8s-cluster/cluster-status-commands.md b/beispiel-terraform/beispiel-k8s-cluster/cluster-status-commands.md new file mode 100644 index 0000000..a8d3443 --- /dev/null +++ b/beispiel-terraform/beispiel-k8s-cluster/cluster-status-commands.md @@ -0,0 +1,36 @@ +# AKS Cluster Status Befehle + +Hier sind die Bash-Befehle, mit denen ich den Cluster-Status geprüft habe: + +```bash +# 1. Cluster-Status prüfen +az aks show --resource-group trusted_ai_demo_rg --name trai_k8s_cluster --query "{name:name, powerState:powerState.code, provisioningState:provisioningState, kubernetesVersion:kubernetesVersion, nodeResourceGroup:nodeResourceGroup}" -o table + +# 2. Node Pool Status prüfen +az aks nodepool list --resource-group trusted_ai_demo_rg --cluster-name trai_k8s_cluster --query "[].{name:name, count:count, vmSize:vmSize, provisioningState:provisioningState, powerState:powerState.code}" -o table + +# 3. Kubeconfig herunterladen (für kubectl Zugriff) +az aks get-credentials --resource-group trusted_ai_demo_rg --name trai_k8s_cluster --overwrite-existing + +# 4. Kubernetes Nodes anzeigen +kubectl get nodes + +# 5. Alle Pods in allen Namespaces anzeigen +kubectl get pods -A +``` + +## Zusätzliche nützliche Befehle + +```bash +# Detaillierte Cluster-Informationen +az aks show --resource-group trusted_ai_demo_rg --name trai_k8s_cluster -o json + +# Cluster-Ressourcen anzeigen +kubectl top nodes + +# Spezifische Namespace-Pods anzeigen +kubectl get pods -n kube-system + +# Cluster-Events anzeigen +kubectl get events -A --sort-by='.lastTimestamp' +``` diff --git a/beispiel-terraform/beispiel-k8s-cluster/main.tf b/beispiel-terraform/beispiel-k8s-cluster/main.tf new file mode 100644 index 0000000..acbf244 --- /dev/null +++ b/beispiel-terraform/beispiel-k8s-cluster/main.tf @@ -0,0 +1,195 @@ +resource "azurerm_resource_group" "main" { + location = var.location + name = var.resource_group_name +} + +resource "azurerm_virtual_network" "main" { + address_space = var.vnet_address_space + location = var.location + name = var.vnet_name + resource_group_name = var.resource_group_name + depends_on = [ + azurerm_resource_group.main + ] +} + +resource "azurerm_subnet" "default" { + address_prefixes = var.subnet_address_prefixes + name = var.subnet_name + resource_group_name = var.resource_group_name + virtual_network_name = var.vnet_name + depends_on = [ + azurerm_virtual_network.main + ] +} + +resource "azurerm_log_analytics_workspace" "main" { + name = "aksloganalytics${replace(var.aks_cluster_name, "_", "")}" + location = var.location + resource_group_name = var.resource_group_name + sku = "PerGB2018" + retention_in_days = 30 + depends_on = [ + azurerm_resource_group.main + ] +} + +resource "azurerm_kubernetes_cluster" "main" { + automatic_upgrade_channel = "patch" + dns_prefix = var.aks_dns_prefix + image_cleaner_enabled = true + image_cleaner_interval_hours = 168 + location = var.location + name = var.aks_cluster_name + oidc_issuer_enabled = true + resource_group_name = var.resource_group_name + workload_identity_enabled = true + + default_node_pool { + auto_scaling_enabled = true + max_count = var.aks_node_pool_max_count + min_count = var.aks_node_pool_min_count + name = "agentpool" + vm_size = var.aks_node_vm_size + zones = var.aks_node_zones + temporary_name_for_rotation = "temppool" + upgrade_settings { + max_surge = "10%" + } + } + + identity { + type = "SystemAssigned" + } + + maintenance_window_auto_upgrade { + day_of_week = "Sunday" + duration = 8 + frequency = "Weekly" + interval = 1 + start_time = "00:00" + utc_offset = "+00:00" + } + + maintenance_window_node_os { + day_of_week = "Sunday" + duration = 8 + frequency = "Weekly" + interval = 1 + start_time = "00:00" + utc_offset = "+00:00" + } + + oms_agent { + log_analytics_workspace_id = azurerm_log_analytics_workspace.main.id + msi_auth_for_monitoring_enabled = true + } + + depends_on = [ + azurerm_resource_group.main, + azurerm_log_analytics_workspace.main + ] +} + +resource "azurerm_monitor_data_collection_rule" "aks_monitoring" { + kind = "Linux" + location = var.location + name = "MSCI-${var.location}-${var.aks_cluster_name}" + resource_group_name = var.resource_group_name + + data_flow { + destinations = ["ciworkspace"] + streams = ["Microsoft-ContainerLog", "Microsoft-ContainerLogV2", "Microsoft-KubeEvents", "Microsoft-KubePodInventory"] + } + + data_sources { + extension { + extension_json = jsonencode({ + dataCollectionSettings = { + enableContainerLogV2 = true + interval = "1m" + namespaceFilteringMode = "Off" + } + }) + extension_name = "ContainerInsights" + name = "ContainerInsightsExtension" + streams = ["Microsoft-ContainerLog", "Microsoft-ContainerLogV2", "Microsoft-KubeEvents", "Microsoft-KubePodInventory"] + } + } + + destinations { + log_analytics { + name = "ciworkspace" + workspace_resource_id = azurerm_log_analytics_workspace.main.id + } + } + + depends_on = [ + azurerm_resource_group.main, + azurerm_log_analytics_workspace.main + ] +} + +resource "azurerm_monitor_action_group" "alerts" { + name = "RecommendedAlertRules-AG-c92012" + resource_group_name = var.resource_group_name + short_name = "alertc92012" + + email_receiver { + email_address = var.alert_email_address + name = "Email_-EmailAction-" + use_common_alert_schema = true + } + + depends_on = [ + azurerm_resource_group.main + ] +} + +resource "azurerm_monitor_metric_alert" "cpu_alert" { + auto_mitigate = false + frequency = "PT5M" + name = "CPU Usage Percentage - ${var.aks_cluster_name}" + resource_group_name = var.resource_group_name + scopes = [azurerm_kubernetes_cluster.main.id] + + action { + action_group_id = azurerm_monitor_action_group.alerts.id + } + + criteria { + aggregation = "Average" + metric_name = "node_cpu_usage_percentage" + metric_namespace = "Microsoft.ContainerService/managedClusters" + operator = "GreaterThan" + threshold = 95 + } + + depends_on = [ + azurerm_resource_group.main + ] +} + +resource "azurerm_monitor_metric_alert" "memory_alert" { + auto_mitigate = false + frequency = "PT5M" + name = "Memory Working Set Percentage - ${var.aks_cluster_name}" + resource_group_name = var.resource_group_name + scopes = [azurerm_kubernetes_cluster.main.id] + + action { + action_group_id = azurerm_monitor_action_group.alerts.id + } + + criteria { + aggregation = "Average" + metric_name = "node_memory_working_set_percentage" + metric_namespace = "Microsoft.ContainerService/managedClusters" + operator = "GreaterThan" + threshold = 100 + } + + depends_on = [ + azurerm_resource_group.main + ] +} diff --git a/beispiel-terraform/beispiel-k8s-cluster/outputs.tf b/beispiel-terraform/beispiel-k8s-cluster/outputs.tf new file mode 100644 index 0000000..5f4e71b --- /dev/null +++ b/beispiel-terraform/beispiel-k8s-cluster/outputs.tf @@ -0,0 +1,50 @@ +output "resource_group_name" { + description = "Name of the resource group" + value = azurerm_resource_group.main.name +} + +output "aks_cluster_name" { + description = "Name of the AKS cluster" + value = azurerm_kubernetes_cluster.main.name +} + +output "aks_cluster_id" { + description = "ID of the AKS cluster" + value = azurerm_kubernetes_cluster.main.id +} + +output "aks_cluster_fqdn" { + description = "FQDN of the AKS cluster" + value = azurerm_kubernetes_cluster.main.fqdn +} + +output "aks_kube_config" { + description = "Kubeconfig for the AKS cluster" + value = azurerm_kubernetes_cluster.main.kube_config_raw + sensitive = true +} + +output "aks_oidc_issuer_url" { + description = "OIDC issuer URL of the AKS cluster" + value = azurerm_kubernetes_cluster.main.oidc_issuer_url +} + +output "vnet_id" { + description = "ID of the virtual network" + value = azurerm_virtual_network.main.id +} + +output "subnet_id" { + description = "ID of the subnet" + value = azurerm_subnet.default.id +} + +output "log_analytics_workspace_id" { + description = "ID of the Log Analytics workspace" + value = azurerm_log_analytics_workspace.main.id +} + +output "log_analytics_workspace_name" { + description = "Name of the Log Analytics workspace" + value = azurerm_log_analytics_workspace.main.name +} diff --git a/beispiel-terraform/beispiel-k8s-cluster/provider.tf b/beispiel-terraform/beispiel-k8s-cluster/provider.tf new file mode 100644 index 0000000..8d481ba --- /dev/null +++ b/beispiel-terraform/beispiel-k8s-cluster/provider.tf @@ -0,0 +1,10 @@ +provider "azurerm" { + features { + } + subscription_id = var.subscription_id + environment = "public" + use_msi = false + use_cli = true + use_oidc = false + resource_provider_registrations = "none" +} diff --git a/beispiel-terraform/beispiel-k8s-cluster/terraform.tf b/beispiel-terraform/beispiel-k8s-cluster/terraform.tf new file mode 100644 index 0000000..7ca924d --- /dev/null +++ b/beispiel-terraform/beispiel-k8s-cluster/terraform.tf @@ -0,0 +1,11 @@ +terraform { + backend "local" {} + + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "4.33.0" + + } + } +} diff --git a/beispiel-terraform/beispiel-k8s-cluster/terraform.tfvars.example b/beispiel-terraform/beispiel-k8s-cluster/terraform.tfvars.example new file mode 100644 index 0000000..7fe171e --- /dev/null +++ b/beispiel-terraform/beispiel-k8s-cluster/terraform.tfvars.example @@ -0,0 +1,28 @@ +# Azure Region +location = "germanywestcentral" + +# Resource Group +resource_group_name = "trusted_ai_demo_rg" + +# Virtual Network +vnet_name = "trusted_ai_demo_vn" +subnet_name = "default" + +# AKS Cluster Configuration +aks_cluster_name = "trai_k8s_cluster" +aks_dns_prefix = "traik8scluster" + +# AKS Node Pool Configuration +aks_node_vm_size = "Standard_D2as_v6" +aks_node_zones = ["1", "2"] + +# Auto-Scaling Configuration +aks_node_pool_min_count = 2 +aks_node_pool_max_count = 3 + +# Alert Configuration +# WICHTIG: Ersetzen Sie diese Email-Adresse mit Ihrer eigenen +alert_email_address = "your-email@example.com" + +# Azure Subscription ID (optional, falls abweichend vom Default) +# subscription_id = "your-subscription-id" diff --git a/beispiel-terraform/beispiel-k8s-cluster/variables.tf b/beispiel-terraform/beispiel-k8s-cluster/variables.tf new file mode 100644 index 0000000..0e29d5a --- /dev/null +++ b/beispiel-terraform/beispiel-k8s-cluster/variables.tf @@ -0,0 +1,83 @@ +variable "location" { + description = "Azure region for resources" + type = string + default = "germanywestcentral" +} + +variable "resource_group_name" { + description = "Name of the resource group" + type = string + default = "trusted_ai_demo_rg" +} + +variable "vnet_name" { + description = "Name of the virtual network" + type = string + default = "trusted_ai_demo_vn" +} + +variable "vnet_address_space" { + description = "Address space for the virtual network" + type = list(string) + default = ["10.0.0.0/16"] +} + +variable "subnet_name" { + description = "Name of the subnet" + type = string + default = "default" +} + +variable "subnet_address_prefixes" { + description = "Address prefixes for the subnet" + type = list(string) + default = ["10.0.0.0/24"] +} + +variable "aks_cluster_name" { + description = "Name of the AKS cluster" + type = string + default = "trai_k8s_cluster" +} + +variable "aks_dns_prefix" { + description = "DNS prefix for the AKS cluster" + type = string + default = "traik8scluster" +} + +variable "aks_node_pool_min_count" { + description = "Minimum number of nodes in the AKS node pool" + type = number + default = 2 +} + +variable "aks_node_pool_max_count" { + description = "Maximum number of nodes in the AKS node pool" + type = number + default = 3 +} + +variable "aks_node_vm_size" { + description = "VM size for AKS node pool" + type = string + default = "Standard_D2as_v6" +} + +variable "aks_node_zones" { + description = "Availability zones for AKS nodes" + type = list(string) + default = ["1", "2"] +} + +variable "alert_email_address" { + description = "Email address for alert notifications" + type = string + sensitive = true +} + +variable "subscription_id" { + description = "Azure subscription ID" + type = string + default = "77677a80-2dea-493d-9867-f1c961b80fb3" +} diff --git a/beispiel-terraform/main.tf b/beispiel-terraform/main.tf deleted file mode 100644 index 06c4cca..0000000 --- a/beispiel-terraform/main.tf +++ /dev/null @@ -1,123 +0,0 @@ -terraform { - required_version = ">= 1.0" - - required_providers { - azurerm = { - source = "hashicorp/azurerm" - version = "~> 3.0" - } - } -} - -provider "azurerm" { - features {} -} - -# Resource Group -resource "azurerm_resource_group" "main" { - name = var.resource_group_name - location = var.location - - tags = var.tags -} - -# Virtual Network -resource "azurerm_virtual_network" "main" { - name = "${var.resource_group_name}-vnet" - address_space = [var.vnet_address_space] - location = azurerm_resource_group.main.location - resource_group_name = azurerm_resource_group.main.name - - tags = var.tags -} - -# Subnet -resource "azurerm_subnet" "main" { - name = "default" - resource_group_name = azurerm_resource_group.main.name - virtual_network_name = azurerm_virtual_network.main.name - address_prefixes = [var.subnet_address_prefix] -} - -# Network Security Group -resource "azurerm_network_security_group" "main" { - name = "${var.vm_name}-nsg" - location = azurerm_resource_group.main.location - resource_group_name = azurerm_resource_group.main.name - - security_rule { - name = "SSH" - priority = 1001 - direction = "Inbound" - access = "Allow" - protocol = "Tcp" - source_port_range = "*" - destination_port_range = "22" - source_address_prefix = var.allowed_ssh_source - destination_address_prefix = "*" - } - - tags = var.tags -} - -# Public IP -resource "azurerm_public_ip" "main" { - name = "${var.vm_name}-pip" - location = azurerm_resource_group.main.location - resource_group_name = azurerm_resource_group.main.name - allocation_method = "Static" - sku = "Standard" - - tags = var.tags -} - -# Network Interface -resource "azurerm_network_interface" "main" { - name = "${var.vm_name}-nic" - location = azurerm_resource_group.main.location - resource_group_name = azurerm_resource_group.main.name - - ip_configuration { - name = "internal" - subnet_id = azurerm_subnet.main.id - private_ip_address_allocation = "Dynamic" - public_ip_address_id = azurerm_public_ip.main.id - } - - tags = var.tags -} - -# Associate NSG with Network Interface -resource "azurerm_network_interface_security_group_association" "main" { - network_interface_id = azurerm_network_interface.main.id - network_security_group_id = azurerm_network_security_group.main.id -} - -# Linux Virtual Machine -resource "azurerm_linux_virtual_machine" "main" { - name = var.vm_name - resource_group_name = azurerm_resource_group.main.name - location = azurerm_resource_group.main.location - size = var.vm_size - admin_username = var.admin_username - admin_password = var.admin_password - disable_password_authentication = false - - network_interface_ids = [ - azurerm_network_interface.main.id, - ] - - os_disk { - caching = "ReadWrite" - storage_account_type = "Standard_LRS" - } - - source_image_reference { - publisher = "Canonical" - offer = "0001-com-ubuntu-server-jammy" - sku = "22_04-lts-gen2" - version = "latest" - } - - tags = var.tags -} diff --git a/beispiel-terraform/outputs.tf b/beispiel-terraform/outputs.tf deleted file mode 100644 index afefb82..0000000 --- a/beispiel-terraform/outputs.tf +++ /dev/null @@ -1,56 +0,0 @@ -output "resource_group_name" { - description = "Name of the created resource group" - value = azurerm_resource_group.main.name -} - -output "resource_group_id" { - description = "ID of the created resource group" - value = azurerm_resource_group.main.id -} - -output "location" { - description = "Location of the resource group" - value = azurerm_resource_group.main.location -} - -# Network Outputs -output "vnet_name" { - description = "Name of the virtual network" - value = azurerm_virtual_network.main.name -} - -output "vnet_id" { - description = "ID of the virtual network" - value = azurerm_virtual_network.main.id -} - -output "subnet_id" { - description = "ID of the subnet" - value = azurerm_subnet.main.id -} - -# VM Outputs -output "vm_name" { - description = "Name of the virtual machine" - value = azurerm_linux_virtual_machine.main.name -} - -output "vm_id" { - description = "ID of the virtual machine" - value = azurerm_linux_virtual_machine.main.id -} - -output "vm_private_ip" { - description = "Private IP address of the VM" - value = azurerm_network_interface.main.private_ip_address -} - -output "vm_public_ip" { - description = "Public IP address of the VM" - value = azurerm_public_ip.main.ip_address -} - -output "ssh_connection_string" { - description = "SSH connection string for the VM" - value = "ssh ${azurerm_linux_virtual_machine.main.admin_username}@${azurerm_public_ip.main.ip_address}" -} diff --git a/beispiel-terraform/terraform.tfstate b/beispiel-terraform/terraform.tfstate deleted file mode 100644 index 3353b08..0000000 --- a/beispiel-terraform/terraform.tfstate +++ /dev/null @@ -1 +0,0 @@ -{"version":4,"terraform_version":"1.11.1","serial":11,"lineage":"cad35d7f-13a9-933b-a7ef-af99f16a5d08","outputs":{},"resources":[],"check_results":null} diff --git a/beispiel-terraform/terraform.tfstate.backup b/beispiel-terraform/terraform.tfstate.backup deleted file mode 100644 index fd79379..0000000 --- a/beispiel-terraform/terraform.tfstate.backup +++ /dev/null @@ -1 +0,0 @@ -{"version":4,"terraform_version":"1.11.1","serial":7,"lineage":"cad35d7f-13a9-933b-a7ef-af99f16a5d08","outputs":{"location":{"value":"austriaeast","type":"string"},"resource_group_id":{"value":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo","type":"string"},"resource_group_name":{"value":"rg-trusted-ai-demo","type":"string"},"ssh_connection_string":{"value":"ssh azureadmin@68.210.97.125","type":"string"},"subnet_id":{"value":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/virtualNetworks/rg-trusted-ai-demo-vnet/subnets/default","type":"string"},"vm_id":{"value":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Compute/virtualMachines/vm-trusted-ai","type":"string"},"vm_name":{"value":"vm-trusted-ai","type":"string"},"vm_private_ip":{"value":"10.0.1.4","type":"string"},"vm_public_ip":{"value":"68.210.97.125","type":"string"},"vnet_id":{"value":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/virtualNetworks/rg-trusted-ai-demo-vnet","type":"string"},"vnet_name":{"value":"rg-trusted-ai-demo-vnet","type":"string"}},"resources":[{"mode":"managed","type":"azurerm_linux_virtual_machine","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"additional_capabilities":[],"admin_password":"Hab2009Keins!","admin_ssh_key":[],"admin_username":"azureadmin","allow_extension_operations":true,"availability_set_id":"","boot_diagnostics":[],"bypass_platform_safety_checks_on_user_schedule_enabled":false,"capacity_reservation_group_id":"","computer_name":"vm-trusted-ai","custom_data":null,"dedicated_host_group_id":"","dedicated_host_id":"","disable_password_authentication":false,"disk_controller_type":"SCSI","edge_zone":"","encryption_at_host_enabled":false,"eviction_policy":"","extensions_time_budget":"PT1H30M","gallery_application":[],"id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Compute/virtualMachines/vm-trusted-ai","identity":[],"license_type":"","location":"austriaeast","max_bid_price":-1,"name":"vm-trusted-ai","network_interface_ids":["/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/networkInterfaces/vm-trusted-ai-nic"],"os_disk":[{"caching":"ReadWrite","diff_disk_settings":[],"disk_encryption_set_id":"","disk_size_gb":30,"name":"vm-trusted-ai_OsDisk_1_26ed4d6fa684410abb7d858ef85be362","secure_vm_disk_encryption_set_id":"","security_encryption_type":"","storage_account_type":"Standard_LRS","write_accelerator_enabled":false}],"os_image_notification":[],"patch_assessment_mode":"ImageDefault","patch_mode":"ImageDefault","plan":[],"platform_fault_domain":-1,"priority":"Regular","private_ip_address":"10.0.1.4","private_ip_addresses":["10.0.1.4"],"provision_vm_agent":true,"proximity_placement_group_id":"","public_ip_address":"68.210.97.125","public_ip_addresses":["68.210.97.125"],"reboot_setting":"","resource_group_name":"rg-trusted-ai-demo","secret":[],"secure_boot_enabled":false,"size":"Standard_B2ats_v2","source_image_id":"","source_image_reference":[{"offer":"0001-com-ubuntu-server-jammy","publisher":"Canonical","sku":"22_04-lts-gen2","version":"latest"}],"tags":{"Environment":"dev","ManagedBy":"OpenTofu","Project":"trusted-ai-demo"},"termination_notification":null,"timeouts":null,"user_data":"","virtual_machine_id":"c0bc058a-065f-44e0-9bf7-e9343e91e666","virtual_machine_scale_set_id":"","vm_agent_platform_updates_enabled":false,"vtpm_enabled":false,"zone":""},"sensitive_attributes":[[{"type":"get_attr","value":"admin_password"}],[{"type":"get_attr","value":"custom_data"}]],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoyNzAwMDAwMDAwMDAwLCJkZWxldGUiOjI3MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoyNzAwMDAwMDAwMDAwfX0=","dependencies":["azurerm_network_interface.main","azurerm_public_ip.main","azurerm_resource_group.main","azurerm_subnet.main","azurerm_virtual_network.main"]}]},{"mode":"managed","type":"azurerm_network_interface","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"accelerated_networking_enabled":false,"applied_dns_servers":[],"auxiliary_mode":"","auxiliary_sku":"","dns_servers":[],"edge_zone":"","enable_accelerated_networking":false,"enable_ip_forwarding":false,"id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/networkInterfaces/vm-trusted-ai-nic","internal_dns_name_label":"","internal_domain_name_suffix":"cu22vk1awgdetoispofbty41oa.viex.internal.cloudapp.net","ip_configuration":[{"gateway_load_balancer_frontend_ip_configuration_id":"","name":"internal","primary":true,"private_ip_address":"10.0.1.4","private_ip_address_allocation":"Dynamic","private_ip_address_version":"IPv4","public_ip_address_id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/publicIPAddresses/vm-trusted-ai-pip","subnet_id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/virtualNetworks/rg-trusted-ai-demo-vnet/subnets/default"}],"ip_forwarding_enabled":false,"location":"austriaeast","mac_address":"7C-1E-52-8E-8B-F8","name":"vm-trusted-ai-nic","private_ip_address":"10.0.1.4","private_ip_addresses":["10.0.1.4"],"resource_group_name":"rg-trusted-ai-demo","tags":{"Environment":"dev","ManagedBy":"OpenTofu","Project":"trusted-ai-demo"},"timeouts":null,"virtual_machine_id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Compute/virtualMachines/vm-trusted-ai"},"sensitive_attributes":[],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=","dependencies":["azurerm_public_ip.main","azurerm_resource_group.main","azurerm_subnet.main","azurerm_virtual_network.main"]}]},{"mode":"managed","type":"azurerm_network_interface_security_group_association","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/networkInterfaces/vm-trusted-ai-nic|/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/networkSecurityGroups/vm-trusted-ai-nsg","network_interface_id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/networkInterfaces/vm-trusted-ai-nic","network_security_group_id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/networkSecurityGroups/vm-trusted-ai-nsg","timeouts":null},"sensitive_attributes":[],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMH19","dependencies":["azurerm_network_interface.main","azurerm_network_security_group.main","azurerm_public_ip.main","azurerm_resource_group.main","azurerm_subnet.main","azurerm_virtual_network.main"]}]},{"mode":"managed","type":"azurerm_network_security_group","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/networkSecurityGroups/vm-trusted-ai-nsg","location":"austriaeast","name":"vm-trusted-ai-nsg","resource_group_name":"rg-trusted-ai-demo","security_rule":[{"access":"Allow","description":"","destination_address_prefix":"*","destination_address_prefixes":[],"destination_application_security_group_ids":[],"destination_port_range":"22","destination_port_ranges":[],"direction":"Inbound","name":"SSH","priority":1001,"protocol":"Tcp","source_address_prefix":"*","source_address_prefixes":[],"source_application_security_group_ids":[],"source_port_range":"*","source_port_ranges":[]}],"tags":{"Environment":"dev","ManagedBy":"OpenTofu","Project":"trusted-ai-demo"},"timeouts":null},"sensitive_attributes":[],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=","dependencies":["azurerm_resource_group.main"]}]},{"mode":"managed","type":"azurerm_public_ip","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"allocation_method":"Static","ddos_protection_mode":"VirtualNetworkInherited","ddos_protection_plan_id":null,"domain_name_label":null,"edge_zone":"","fqdn":null,"id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/publicIPAddresses/vm-trusted-ai-pip","idle_timeout_in_minutes":4,"ip_address":"68.210.97.125","ip_tags":{},"ip_version":"IPv4","location":"austriaeast","name":"vm-trusted-ai-pip","public_ip_prefix_id":null,"resource_group_name":"rg-trusted-ai-demo","reverse_fqdn":null,"sku":"Standard","sku_tier":"Regional","tags":{"Environment":"dev","ManagedBy":"OpenTofu","Project":"trusted-ai-demo"},"timeouts":null,"zones":[]},"sensitive_attributes":[],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfSwic2NoZW1hX3ZlcnNpb24iOiIwIn0=","dependencies":["azurerm_resource_group.main"]}]},{"mode":"managed","type":"azurerm_resource_group","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo","location":"austriaeast","managed_by":"","name":"rg-trusted-ai-demo","tags":{"Environment":"dev","ManagedBy":"OpenTofu","Project":"trusted-ai-demo"},"timeouts":null},"sensitive_attributes":[],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo1NDAwMDAwMDAwMDAwLCJkZWxldGUiOjU0MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjo1NDAwMDAwMDAwMDAwfX0="}]},{"mode":"managed","type":"azurerm_subnet","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"address_prefixes":["10.0.1.0/24"],"default_outbound_access_enabled":true,"delegation":[],"enforce_private_link_endpoint_network_policies":false,"enforce_private_link_service_network_policies":false,"id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/virtualNetworks/rg-trusted-ai-demo-vnet/subnets/default","name":"default","private_endpoint_network_policies":"Enabled","private_endpoint_network_policies_enabled":true,"private_link_service_network_policies_enabled":true,"resource_group_name":"rg-trusted-ai-demo","service_endpoint_policy_ids":[],"service_endpoints":[],"timeouts":null,"virtual_network_name":"rg-trusted-ai-demo-vnet"},"sensitive_attributes":[],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=","dependencies":["azurerm_resource_group.main","azurerm_virtual_network.main"]}]},{"mode":"managed","type":"azurerm_virtual_network","name":"main","provider":"provider[\"registry.opentofu.org/hashicorp/azurerm\"]","instances":[{"schema_version":0,"attributes":{"address_space":["10.0.0.0/16"],"bgp_community":"","ddos_protection_plan":[],"dns_servers":[],"edge_zone":"","encryption":[],"flow_timeout_in_minutes":0,"guid":"abca3915-b160-4986-b912-7b8a19e3db70","id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/virtualNetworks/rg-trusted-ai-demo-vnet","location":"austriaeast","name":"rg-trusted-ai-demo-vnet","resource_group_name":"rg-trusted-ai-demo","subnet":[{"address_prefix":"10.0.1.0/24","id":"/subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/rg-trusted-ai-demo/providers/Microsoft.Network/virtualNetworks/rg-trusted-ai-demo-vnet/subnets/default","name":"default","security_group":""}],"tags":{"Environment":"dev","ManagedBy":"OpenTofu","Project":"trusted-ai-demo"},"timeouts":null},"sensitive_attributes":[],"private":"eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInJlYWQiOjMwMDAwMDAwMDAwMCwidXBkYXRlIjoxODAwMDAwMDAwMDAwfX0=","dependencies":["azurerm_resource_group.main"]}]}],"check_results":null} diff --git a/beispiel-terraform/terraform.tfvars b/beispiel-terraform/terraform.tfvars deleted file mode 100644 index 0366df6..0000000 --- a/beispiel-terraform/terraform.tfvars +++ /dev/null @@ -1,23 +0,0 @@ -# Copy this file to terraform.tfvars and customize as needed - -# Resource Group Configuration -resource_group_name = "rg-trusted-ai-demo" -location = "austriaeast" - -# Network Configuration -vnet_address_space = "10.0.0.0/16" -subnet_address_prefix = "10.0.1.0/24" -allowed_ssh_source = "*" # Change to your public IP for better security, e.g., "1.2.3.4/32" - -# Virtual Machine Configuration -vm_name = "vm-trusted-ai" -vm_size = "Standard_B2ats_v2" -admin_username = "azureadmin" -admin_password = "Hab2009Keins!" - -# Tags -tags = { - Environment = "dev" - Project = "trusted-ai-demo" - ManagedBy = "OpenTofu" -} diff --git a/beispiel-terraform/terraform.tfvars.example b/beispiel-terraform/terraform.tfvars.example deleted file mode 100644 index 353f170..0000000 --- a/beispiel-terraform/terraform.tfvars.example +++ /dev/null @@ -1,23 +0,0 @@ -# Copy this file to terraform.tfvars and customize as needed - -# Resource Group Configuration -resource_group_name = "rg-trusted-ai-demo" -location = "westus" - -# Network Configuration -vnet_address_space = "10.0.0.0/16" -subnet_address_prefix = "10.0.1.0/24" -allowed_rdp_source = "*" # Change to your public IP for better security, e.g., "1.2.3.4/32" - -# Virtual Machine Configuration -vm_name = "vm-trusted-ai" -vm_size = "Standard_B2s" -admin_username = "azureadmin" -admin_password = "YourSecurePassword123!" # IMPORTANT: Change this! Min 12 characters, must include upper, lower, number - -# Tags -tags = { - Environment = "dev" - Project = "trusted-ai-demo" - ManagedBy = "OpenTofu" -} diff --git a/beispiel-terraform/variables.tf b/beispiel-terraform/variables.tf deleted file mode 100644 index d2abc25..0000000 --- a/beispiel-terraform/variables.tf +++ /dev/null @@ -1,65 +0,0 @@ -variable "resource_group_name" { - description = "Name of the resource group" - type = string - default = "rg-trusted-ai-demo" -} - -variable "location" { - description = "Azure region for resources" - type = string - default = "austriaeast" -} - -variable "tags" { - description = "Tags to apply to all resources" - type = map(string) - default = { - Environment = "dev" - Project = "trusted-ai-demo" - ManagedBy = "OpenTofu" - } -} - -# Network Configuration -variable "vnet_address_space" { - description = "Address space for the virtual network" - type = string - default = "10.0.0.0/16" -} - -variable "subnet_address_prefix" { - description = "Address prefix for the subnet" - type = string - default = "10.0.1.0/24" -} - -variable "allowed_ssh_source" { - description = "Source IP address or range allowed to SSH to the VM (use your public IP or '*' for any - not recommended)" - type = string - default = "*" -} - -# Virtual Machine Configuration -variable "vm_name" { - description = "Name of the virtual machine" - type = string - default = "vm-trusted-ai" -} - -variable "vm_size" { - description = "Size of the virtual machine" - type = string - default = "Standard_B2s" -} - -variable "admin_username" { - description = "Admin username for the virtual machine" - type = string - default = "azureadmin" -} - -variable "admin_password" { - description = "Admin password for the virtual machine (use strong password, min 12 characters)" - type = string - sensitive = true -}