diff --git a/0_core-infrastructure/README.md b/0_core-infrastructure/README.md
index 819ea3f..eb56e60 100644
--- a/0_core-infrastructure/README.md
+++ b/0_core-infrastructure/README.md
@@ -24,7 +24,7 @@ Last updated: 2026-02-09
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/0_core-infrastructure/azure-bastion/README.md b/0_core-infrastructure/azure-bastion/README.md
index 988877b..abd85cd 100644
--- a/0_core-infrastructure/azure-bastion/README.md
+++ b/0_core-infrastructure/azure-bastion/README.md
@@ -45,7 +45,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/0_core-infrastructure/azure-dns/README.md b/0_core-infrastructure/azure-dns/README.md
index 498fc52..f9a4038 100644
--- a/0_core-infrastructure/azure-dns/README.md
+++ b/0_core-infrastructure/azure-dns/README.md
@@ -40,7 +40,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/0_core-infrastructure/network-security-group/README.md b/0_core-infrastructure/network-security-group/README.md
index 3db0728..d60ef00 100644
--- a/0_core-infrastructure/network-security-group/README.md
+++ b/0_core-infrastructure/network-security-group/README.md
@@ -40,7 +40,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/0_core-infrastructure/public-ip/README.md b/0_core-infrastructure/public-ip/README.md
index b1e2206..1e8b47c 100644
--- a/0_core-infrastructure/public-ip/README.md
+++ b/0_core-infrastructure/public-ip/README.md
@@ -42,7 +42,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/0_core-infrastructure/resource-group/README.md b/0_core-infrastructure/resource-group/README.md
index 82db997..751afb3 100644
--- a/0_core-infrastructure/resource-group/README.md
+++ b/0_core-infrastructure/resource-group/README.md
@@ -33,7 +33,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/0_core-infrastructure/subnet/README.md b/0_core-infrastructure/subnet/README.md
index 59cda00..f469f8d 100644
--- a/0_core-infrastructure/subnet/README.md
+++ b/0_core-infrastructure/subnet/README.md
@@ -43,7 +43,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/0_core-infrastructure/virtual-network/README.md b/0_core-infrastructure/virtual-network/README.md
index 9389e20..9ee60f6 100644
--- a/0_core-infrastructure/virtual-network/README.md
+++ b/0_core-infrastructure/virtual-network/README.md
@@ -41,7 +41,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/10_migration-backup/README.md b/10_migration-backup/README.md
index d964047..dfef29f 100644
--- a/10_migration-backup/README.md
+++ b/10_migration-backup/README.md
@@ -19,7 +19,7 @@ Last updated: 2026-02-09
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/10_migration-backup/backup/README.md b/10_migration-backup/backup/README.md
index ba7e8dd..e4d07ac 100644
--- a/10_migration-backup/backup/README.md
+++ b/10_migration-backup/backup/README.md
@@ -52,7 +52,7 @@ terraform apply
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/10_migration-backup/site-recovery/README.md b/10_migration-backup/site-recovery/README.md
index da62721..848a1fe 100644
--- a/10_migration-backup/site-recovery/README.md
+++ b/10_migration-backup/site-recovery/README.md
@@ -52,7 +52,7 @@ terraform apply
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/11_media-services/README.md b/11_media-services/README.md
index 8e09a40..f1e26b9 100644
--- a/11_media-services/README.md
+++ b/11_media-services/README.md
@@ -19,7 +19,7 @@ Last updated: 2026-02-11
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/11_media-services/ai-video-indexer/README.md b/11_media-services/ai-video-indexer/README.md
index f901318..48c1d1e 100644
--- a/11_media-services/ai-video-indexer/README.md
+++ b/11_media-services/ai-video-indexer/README.md
@@ -78,7 +78,7 @@ Last updated: 2026-02-10
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/11_media-services/cdn/README.md b/11_media-services/cdn/README.md
index 66ed946..17bfa4f 100644
--- a/11_media-services/cdn/README.md
+++ b/11_media-services/cdn/README.md
@@ -85,7 +85,7 @@ Last updated: 2026-02-10
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/1_storage-databases/README.md b/1_storage-databases/README.md
index 1e97e27..5bbf8ce 100644
--- a/1_storage-databases/README.md
+++ b/1_storage-databases/README.md
@@ -26,7 +26,7 @@ Last updated: 2026-02-09
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/1_storage-databases/blob-storage/README.md b/1_storage-databases/blob-storage/README.md
index d88e701..ed34222 100644
--- a/1_storage-databases/blob-storage/README.md
+++ b/1_storage-databases/blob-storage/README.md
@@ -45,7 +45,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/1_storage-databases/cosmos-db/README.md b/1_storage-databases/cosmos-db/README.md
index 682fa09..6abb98e 100644
--- a/1_storage-databases/cosmos-db/README.md
+++ b/1_storage-databases/cosmos-db/README.md
@@ -40,7 +40,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/1_storage-databases/data-lake-storage/README.md b/1_storage-databases/data-lake-storage/README.md
index b5b618d..a6c4d65 100644
--- a/1_storage-databases/data-lake-storage/README.md
+++ b/1_storage-databases/data-lake-storage/README.md
@@ -42,7 +42,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/1_storage-databases/file-storage/README.md b/1_storage-databases/file-storage/README.md
index b13b41f..65b891f 100644
--- a/1_storage-databases/file-storage/README.md
+++ b/1_storage-databases/file-storage/README.md
@@ -44,7 +44,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/1_storage-databases/mongo-atlas/README.md b/1_storage-databases/mongo-atlas/README.md
index 1cdfd0e..648c597 100644
--- a/1_storage-databases/mongo-atlas/README.md
+++ b/1_storage-databases/mongo-atlas/README.md
@@ -133,7 +133,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/1_storage-databases/mongo-atlas/known_errors.md b/1_storage-databases/mongo-atlas/known_errors.md
index 674fc30..65b6e24 100644
--- a/1_storage-databases/mongo-atlas/known_errors.md
+++ b/1_storage-databases/mongo-atlas/known_errors.md
@@ -62,7 +62,7 @@ Last updated: 2026-02-09
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/1_storage-databases/mysql-flexible-server/README.md b/1_storage-databases/mysql-flexible-server/README.md
index 044c4d4..4e21eb5 100644
--- a/1_storage-databases/mysql-flexible-server/README.md
+++ b/1_storage-databases/mysql-flexible-server/README.md
@@ -49,7 +49,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/1_storage-databases/postgresql/README.md b/1_storage-databases/postgresql/README.md
index 660c956..19c31d4 100644
--- a/1_storage-databases/postgresql/README.md
+++ b/1_storage-databases/postgresql/README.md
@@ -48,7 +48,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/1_storage-databases/sql-database/README.md b/1_storage-databases/sql-database/README.md
index 8a27d57..fd843f0 100644
--- a/1_storage-databases/sql-database/README.md
+++ b/1_storage-databases/sql-database/README.md
@@ -44,7 +44,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/1_storage-databases/storage-account/README.md b/1_storage-databases/storage-account/README.md
index 375ff77..8a34a9b 100644
--- a/1_storage-databases/storage-account/README.md
+++ b/1_storage-databases/storage-account/README.md
@@ -42,7 +42,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/2_compute-containers/README.md b/2_compute-containers/README.md
index cb6793d..4b24c6f 100644
--- a/2_compute-containers/README.md
+++ b/2_compute-containers/README.md
@@ -24,7 +24,7 @@ Last updated: 2026-02-09
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/2_compute-containers/app-service/README.md b/2_compute-containers/app-service/README.md
index b8a003b..f6e865e 100644
--- a/2_compute-containers/app-service/README.md
+++ b/2_compute-containers/app-service/README.md
@@ -43,7 +43,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/2_compute-containers/batch/README.md b/2_compute-containers/batch/README.md
index abcb567..b135c09 100644
--- a/2_compute-containers/batch/README.md
+++ b/2_compute-containers/batch/README.md
@@ -40,7 +40,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/2_compute-containers/container-instances/README.md b/2_compute-containers/container-instances/README.md
index c77efc4..f7fbebd 100644
--- a/2_compute-containers/container-instances/README.md
+++ b/2_compute-containers/container-instances/README.md
@@ -45,7 +45,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/2_compute-containers/function-app/README.md b/2_compute-containers/function-app/README.md
index 1bbd8e3..f323b03 100644
--- a/2_compute-containers/function-app/README.md
+++ b/2_compute-containers/function-app/README.md
@@ -43,7 +43,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/2_compute-containers/kubernetes-service/README.md b/2_compute-containers/kubernetes-service/README.md
index 079e2c8..5893a95 100644
--- a/2_compute-containers/kubernetes-service/README.md
+++ b/2_compute-containers/kubernetes-service/README.md
@@ -50,7 +50,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/2_compute-containers/virtual-desktop/README.md b/2_compute-containers/virtual-desktop/README.md
index 8de4801..fa3d8b3 100644
--- a/2_compute-containers/virtual-desktop/README.md
+++ b/2_compute-containers/virtual-desktop/README.md
@@ -46,7 +46,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/2_compute-containers/virtual-machine/README.md b/2_compute-containers/virtual-machine/README.md
index 05d2450..f86e326 100644
--- a/2_compute-containers/virtual-machine/README.md
+++ b/2_compute-containers/virtual-machine/README.md
@@ -45,7 +45,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/3_networking/README.md b/3_networking/README.md
index b8f04e2..d017c05 100644
--- a/3_networking/README.md
+++ b/3_networking/README.md
@@ -25,7 +25,7 @@ Last updated: 2026-02-09
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/3_networking/application-gateway/README.md b/3_networking/application-gateway/README.md
index 91e9ea5..8a3da88 100644
--- a/3_networking/application-gateway/README.md
+++ b/3_networking/application-gateway/README.md
@@ -65,7 +65,7 @@ terraform apply
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/3_networking/cdn/README.md b/3_networking/cdn/README.md
index e233d6b..e2446e6 100644
--- a/3_networking/cdn/README.md
+++ b/3_networking/cdn/README.md
@@ -57,7 +57,7 @@ terraform apply
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/3_networking/expressroute/README.md b/3_networking/expressroute/README.md
index fc55660..e7a0494 100644
--- a/3_networking/expressroute/README.md
+++ b/3_networking/expressroute/README.md
@@ -60,7 +60,7 @@ terraform apply
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/3_networking/firewall/README.md b/3_networking/firewall/README.md
index de18527..c4b9c60 100644
--- a/3_networking/firewall/README.md
+++ b/3_networking/firewall/README.md
@@ -56,7 +56,7 @@ terraform apply
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/3_networking/front-door/README.md b/3_networking/front-door/README.md
index 48b170e..869b420 100644
--- a/3_networking/front-door/README.md
+++ b/3_networking/front-door/README.md
@@ -58,7 +58,7 @@ terraform apply
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/3_networking/load-balancer/README.md b/3_networking/load-balancer/README.md
index 199e1d7..523d89e 100644
--- a/3_networking/load-balancer/README.md
+++ b/3_networking/load-balancer/README.md
@@ -71,7 +71,7 @@ terraform apply
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/3_networking/traffic-manager/README.md b/3_networking/traffic-manager/README.md
index 41e0778..94ae7f9 100644
--- a/3_networking/traffic-manager/README.md
+++ b/3_networking/traffic-manager/README.md
@@ -63,7 +63,7 @@ terraform apply
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/3_networking/vpn-gateway/README.md b/3_networking/vpn-gateway/README.md
index e218152..6c62c85 100644
--- a/3_networking/vpn-gateway/README.md
+++ b/3_networking/vpn-gateway/README.md
@@ -57,7 +57,7 @@ terraform apply
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/4_identity-security/README.md b/4_identity-security/README.md
index 59293b3..60c0252 100644
--- a/4_identity-security/README.md
+++ b/4_identity-security/README.md
@@ -21,7 +21,7 @@ Last updated: 2026-02-09
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/4_identity-security/entra_id/README.md b/4_identity-security/entra_id/README.md
index a3c8ab1..8955ca2 100644
--- a/4_identity-security/entra_id/README.md
+++ b/4_identity-security/entra_id/README.md
@@ -74,7 +74,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/4_identity-security/key-vault/README.md b/4_identity-security/key-vault/README.md
index e01c317..e34dc1f 100644
--- a/4_identity-security/key-vault/README.md
+++ b/4_identity-security/key-vault/README.md
@@ -91,7 +91,7 @@ Below is a list of variables used in this template, their expected values, types
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/4_identity-security/managed-identity/README.md b/4_identity-security/managed-identity/README.md
index 96f50d6..3a4f170 100644
--- a/4_identity-security/managed-identity/README.md
+++ b/4_identity-security/managed-identity/README.md
@@ -74,7 +74,7 @@ Last updated: 2026-02-09
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/4_identity-security/policy/README.md b/4_identity-security/policy/README.md
index 46eca67..0579f10 100644
--- a/4_identity-security/policy/README.md
+++ b/4_identity-security/policy/README.md
@@ -86,7 +86,7 @@ Last updated: 2026-02-10
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/5_analytics-bigdata/README.md b/5_analytics-bigdata/README.md
index e9f6942..aa13d02 100644
--- a/5_analytics-bigdata/README.md
+++ b/5_analytics-bigdata/README.md
@@ -22,7 +22,7 @@ Last updated: 2026-02-16
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/5_analytics-bigdata/data-factory/README.md b/5_analytics-bigdata/data-factory/README.md
index 218b8fc..2b10654 100644
--- a/5_analytics-bigdata/data-factory/README.md
+++ b/5_analytics-bigdata/data-factory/README.md
@@ -83,7 +83,7 @@ Last updated: 2026-02-11
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/5_analytics-bigdata/databricks/README.md b/5_analytics-bigdata/databricks/README.md
index 0c4a346..ec5802f 100644
--- a/5_analytics-bigdata/databricks/README.md
+++ b/5_analytics-bigdata/databricks/README.md
@@ -81,7 +81,7 @@ Last updated: 2026-02-12
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/5_analytics-bigdata/synapse-analytics/README.md b/5_analytics-bigdata/synapse-analytics/README.md
index 520a117..d1b9801 100644
--- a/5_analytics-bigdata/synapse-analytics/README.md
+++ b/5_analytics-bigdata/synapse-analytics/README.md
@@ -100,7 +100,7 @@ Last updated: 2026-02-12
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/6_monitoring-management/README.md b/6_monitoring-management/README.md
index 252062c..6164935 100644
--- a/6_monitoring-management/README.md
+++ b/6_monitoring-management/README.md
@@ -21,7 +21,7 @@ Last updated: 2026-02-16
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/7_iot/README.md b/7_iot/README.md
index be58e2a..9b0bb1b 100644
--- a/7_iot/README.md
+++ b/7_iot/README.md
@@ -14,7 +14,7 @@ Last updated: 2026-02-09
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/8_ai-ml/README.md b/8_ai-ml/README.md
index 56ef391..e678608 100644
--- a/8_ai-ml/README.md
+++ b/8_ai-ml/README.md
@@ -14,7 +14,7 @@ Last updated: 2026-02-09
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/8_ai-ml/machine-learning/README.md b/8_ai-ml/machine-learning/README.md
new file mode 100644
index 0000000..cd09652
--- /dev/null
+++ b/8_ai-ml/machine-learning/README.md
@@ -0,0 +1,28 @@
+# Terraform Template - Azure Machine Learning Workspace
+
+Costa Rica
+
+[](https://github.com/)
+[brown9804](https://github.com/brown9804)
+
+Last updated: 2026-02-17
+
+------------------------------------------
+
+> This template creates an Azure Machine Learning workspace and its common dependencies (Storage Account, Key Vault, Application Insights, Container Registry).
+
+
+
+
+
+
+
+## Usage
+
+```sh
+az login
+terraform init -upgrade
+terraform validate
+terraform plan
+terraform apply -auto-approve
+```
diff --git a/8_ai-ml/machine-learning/main.tf b/8_ai-ml/machine-learning/main.tf
new file mode 100644
index 0000000..a72833a
--- /dev/null
+++ b/8_ai-ml/machine-learning/main.tf
@@ -0,0 +1,165 @@
+data "azurerm_client_config" "current" {}
+
+resource "azapi_resource" "resource_group" {
+ type = "Microsoft.Resources/resourceGroups@2022-09-01"
+ name = var.resource_group_name
+ location = var.location
+ parent_id = "/subscriptions/${data.azurerm_client_config.current.subscription_id}"
+
+ body = jsonencode({
+ tags = var.tags
+ })
+
+ response_export_values = [
+ "id",
+ "name"
+ ]
+}
+
+resource "random_string" "suffix" {
+ length = var.random_suffix_length
+ upper = false
+ special = false
+ numeric = true
+
+ keepers = {
+ resource_group_name = var.resource_group_name
+ location = var.location
+ workspace_base = var.workspace_name
+ }
+}
+
+locals {
+ suffix = var.append_random_suffix ? random_string.suffix.result : ""
+ hyphen_suffix = var.append_random_suffix ? "-${local.suffix}" : ""
+
+ workspace_name = "${var.workspace_name}${local.hyphen_suffix}"
+
+ storage_account_name_raw = lower("${var.storage_account_name_prefix}${local.suffix}")
+ storage_account_name = substr(join("", regexall("[a-z0-9]", local.storage_account_name_raw)), 0, 24)
+
+ key_vault_name_raw = lower("${var.key_vault_name_prefix}${local.suffix}")
+ key_vault_name = substr(join("", regexall("[a-z0-9-]", local.key_vault_name_raw)), 0, 24)
+
+ container_registry_name_raw = lower("${var.container_registry_name_prefix}${local.suffix}")
+ container_registry_name = substr(join("", regexall("[a-z0-9]", local.container_registry_name_raw)), 0, 50)
+
+ application_insights_name = "${var.application_insights_name_prefix}${local.hyphen_suffix}"
+}
+
+resource "azurerm_storage_account" "sa" {
+ name = local.storage_account_name
+ resource_group_name = var.resource_group_name
+ location = var.location
+ account_tier = "Standard"
+ account_replication_type = "LRS"
+
+ shared_access_key_enabled = false
+ default_to_oauth_authentication = true
+
+ tags = var.tags
+
+ depends_on = [
+ azapi_resource.resource_group
+ ]
+
+ lifecycle {
+ precondition {
+ condition = length(local.storage_account_name) >= 3
+ error_message = "Generated storage account name is too short. Adjust storage_account_name_prefix/random_suffix_length."
+ }
+ }
+}
+
+resource "azurerm_key_vault" "kv" {
+ name = local.key_vault_name
+ location = var.location
+ resource_group_name = var.resource_group_name
+
+ tenant_id = data.azurerm_client_config.current.tenant_id
+ sku_name = "standard"
+
+ soft_delete_retention_days = 7
+ purge_protection_enabled = false
+ enable_rbac_authorization = true
+ public_network_access_enabled = true
+
+ tags = var.tags
+
+ depends_on = [
+ azapi_resource.resource_group
+ ]
+
+ lifecycle {
+ precondition {
+ condition = length(local.key_vault_name) >= 3
+ error_message = "Generated key vault name is too short. Adjust key_vault_name_prefix/random_suffix_length."
+ }
+ }
+}
+
+resource "azurerm_application_insights" "appi" {
+ name = local.application_insights_name
+ location = var.location
+ resource_group_name = var.resource_group_name
+ application_type = "web"
+
+ lifecycle {
+ ignore_changes = [
+ workspace_id
+ ]
+ }
+
+ tags = var.tags
+
+ depends_on = [
+ azapi_resource.resource_group
+ ]
+}
+
+resource "azurerm_container_registry" "acr" {
+ name = local.container_registry_name
+ location = var.location
+ resource_group_name = var.resource_group_name
+ sku = "Basic"
+ admin_enabled = false
+
+ tags = var.tags
+
+ depends_on = [
+ azapi_resource.resource_group
+ ]
+
+ lifecycle {
+ precondition {
+ condition = length(local.container_registry_name) >= 5
+ error_message = "Generated container registry name is too short. Adjust container_registry_name_prefix/random_suffix_length."
+ }
+ }
+}
+
+resource "azurerm_machine_learning_workspace" "mlw" {
+ name = local.workspace_name
+ location = var.location
+ resource_group_name = var.resource_group_name
+
+ application_insights_id = azurerm_application_insights.appi.id
+ key_vault_id = azurerm_key_vault.kv.id
+ storage_account_id = azurerm_storage_account.sa.id
+ container_registry_id = azurerm_container_registry.acr.id
+
+ public_network_access_enabled = var.public_network_access_enabled
+
+ dynamic "identity" {
+ for_each = var.enable_system_assigned_identity ? [1] : []
+ content {
+ type = "SystemAssigned"
+ }
+ }
+
+ tags = var.tags
+
+ depends_on = [
+ azapi_resource.resource_group
+ ]
+}
diff --git a/8_ai-ml/machine-learning/outputs.tf b/8_ai-ml/machine-learning/outputs.tf
new file mode 100644
index 0000000..7e7d442
--- /dev/null
+++ b/8_ai-ml/machine-learning/outputs.tf
@@ -0,0 +1,29 @@
+output "resource_group_id" {
+ description = "The resource ID of the Resource Group."
+ value = azapi_resource.resource_group.id
+}
+
+output "machine_learning_workspace_id" {
+ description = "The resource ID of the Azure Machine Learning workspace."
+ value = azurerm_machine_learning_workspace.mlw.id
+}
+
+output "machine_learning_workspace_name" {
+ description = "The name of the Azure Machine Learning workspace."
+ value = azurerm_machine_learning_workspace.mlw.name
+}
+
+output "storage_account_name" {
+ description = "The generated storage account name used by the workspace."
+ value = azurerm_storage_account.sa.name
+}
+
+output "key_vault_name" {
+ description = "The generated key vault name used by the workspace."
+ value = azurerm_key_vault.kv.name
+}
+
+output "container_registry_name" {
+ description = "The generated container registry name used by the workspace."
+ value = azurerm_container_registry.acr.name
+}
diff --git a/8_ai-ml/machine-learning/provider.tf b/8_ai-ml/machine-learning/provider.tf
new file mode 100644
index 0000000..95d5571
--- /dev/null
+++ b/8_ai-ml/machine-learning/provider.tf
@@ -0,0 +1,43 @@
+terraform {
+ required_version = ">= 1.8, < 2.0"
+
+ required_providers {
+ azurerm = {
+ source = "hashicorp/azurerm"
+ version = "~> 3.116"
+ }
+
+ azapi = {
+ source = "Azure/azapi"
+ version = "~> 1.13"
+ }
+
+ random = {
+ source = "hashicorp/random"
+ version = "~> 3.6"
+ }
+ }
+}
+
+provider "azurerm" {
+ features {
+ resource_group {
+ prevent_deletion_if_contains_resources = false
+ }
+ key_vault {
+ purge_soft_delete_on_destroy = false
+ recover_soft_deleted_key_vaults = true
+ }
+ }
+
+ # Required when the environment/policies disable Storage Account shared-key auth.
+ # This makes the AzureRM provider use Azure AD for storage data-plane operations.
+ storage_use_azuread = true
+
+ # Uses the current Azure CLI context (az login + az account set)
+ skip_provider_registration = false
+}
+
+provider "azapi" {
+ # Uses the current Azure CLI context (az login + az account set)
+}
diff --git a/8_ai-ml/machine-learning/terraform.tfvars b/8_ai-ml/machine-learning/terraform.tfvars
new file mode 100644
index 0000000..82469ce
--- /dev/null
+++ b/8_ai-ml/machine-learning/terraform.tfvars
@@ -0,0 +1,21 @@
+resource_group_name = "rg-ai-ml-dev"
+location = "eastus"
+
+append_random_suffix = true
+random_suffix_length = 6
+
+workspace_name = "mlw-dev"
+
+storage_account_name_prefix = "stml"
+key_vault_name_prefix = "kvml"
+container_registry_name_prefix = "acrml"
+application_insights_name_prefix = "appi-ml"
+
+public_network_access_enabled = true
+enable_system_assigned_identity = true
+
+tags = {
+ env = "dev"
+ area = "ai-ml"
+ iac = "terraform"
+}
diff --git a/8_ai-ml/machine-learning/variables.tf b/8_ai-ml/machine-learning/variables.tf
new file mode 100644
index 0000000..26a29b1
--- /dev/null
+++ b/8_ai-ml/machine-learning/variables.tf
@@ -0,0 +1,88 @@
+variable "resource_group_name" {
+ description = "The name of the Azure Resource Group to deploy into. This template will create the RG if it does not exist (idempotent ARM PUT)."
+ type = string
+
+ validation {
+ condition = length(trimspace(var.resource_group_name)) > 0
+ error_message = "resource_group_name must not be empty."
+ }
+}
+
+variable "location" {
+ description = "The Azure region for the deployment."
+ type = string
+
+ validation {
+ condition = length(trimspace(var.location)) > 0
+ error_message = "location must not be empty."
+ }
+}
+
+variable "append_random_suffix" {
+ description = "Whether to append a random suffix to names to reduce naming collisions."
+ type = bool
+ default = true
+}
+
+variable "random_suffix_length" {
+ description = "Length of the random suffix appended when append_random_suffix is true."
+ type = number
+ default = 6
+
+ validation {
+ condition = var.random_suffix_length >= 4 && var.random_suffix_length <= 16
+ error_message = "random_suffix_length must be between 4 and 16."
+ }
+}
+
+variable "workspace_name" {
+ description = "Base name of the Azure Machine Learning workspace. If append_random_suffix is true, the final name will be '-'."
+ type = string
+
+ validation {
+ condition = length(trimspace(var.workspace_name)) >= 3 && length(var.workspace_name) <= 64
+ error_message = "workspace_name must be between 3 and 64 characters."
+ }
+}
+
+variable "storage_account_name_prefix" {
+ description = "Prefix used to generate the Storage Account name for the AML workspace (will be sanitized to meet naming rules)."
+ type = string
+ default = "stml"
+}
+
+variable "key_vault_name_prefix" {
+ description = "Prefix used to generate the Key Vault name for the AML workspace (will be sanitized to meet naming rules)."
+ type = string
+ default = "kvml"
+}
+
+variable "container_registry_name_prefix" {
+ description = "Prefix used to generate the Container Registry name for the AML workspace (will be sanitized to meet naming rules)."
+ type = string
+ default = "acrml"
+}
+
+variable "application_insights_name_prefix" {
+ description = "Prefix used to generate the Application Insights name for the AML workspace."
+ type = string
+ default = "appi-ml"
+}
+
+variable "public_network_access_enabled" {
+ description = "Whether public network access is enabled for the Azure Machine Learning workspace."
+ type = bool
+ default = true
+}
+
+variable "enable_system_assigned_identity" {
+ description = "Whether to enable a System Assigned Managed Identity on the Azure Machine Learning workspace."
+ type = bool
+ default = true
+}
+
+variable "tags" {
+ description = "A map of tags to assign to resources."
+ type = map(string)
+ default = {}
+}
diff --git a/9_developer-tools/README.md b/9_developer-tools/README.md
index 41b1b4b..270c586 100644
--- a/9_developer-tools/README.md
+++ b/9_developer-tools/README.md
@@ -14,7 +14,7 @@ Last updated: 2026-02-09
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17
diff --git a/README.md b/README.md
index 10bbdc0..3c46772 100644
--- a/README.md
+++ b/README.md
@@ -263,8 +263,8 @@ graph TD;
-

-
Refresh Date: 2026-02-16
+

+
Refresh Date: 2026-02-17