diff --git a/0_core-infrastructure/README.md b/0_core-infrastructure/README.md
index eb56e60..1defa2e 100644
--- a/0_core-infrastructure/README.md
+++ b/0_core-infrastructure/README.md
@@ -25,6 +25,6 @@ Last updated: 2026-02-09

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

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

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

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

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

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

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

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/11_media-services/README.md b/10_media-services/README.md
similarity index 95%
rename from 11_media-services/README.md
rename to 10_media-services/README.md
index f1e26b9..5c910a9 100644
--- a/11_media-services/README.md
+++ b/10_media-services/README.md
@@ -20,6 +20,6 @@ Last updated: 2026-02-11

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/11_media-services/ai-video-indexer/README.md b/10_media-services/ai-video-indexer/README.md
similarity index 98%
rename from 11_media-services/ai-video-indexer/README.md
rename to 10_media-services/ai-video-indexer/README.md
index 48c1d1e..e102065 100644
--- a/11_media-services/ai-video-indexer/README.md
+++ b/10_media-services/ai-video-indexer/README.md
@@ -79,6 +79,6 @@ Last updated: 2026-02-10

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/11_media-services/ai-video-indexer/main.tf b/10_media-services/ai-video-indexer/main.tf
similarity index 100%
rename from 11_media-services/ai-video-indexer/main.tf
rename to 10_media-services/ai-video-indexer/main.tf
diff --git a/11_media-services/ai-video-indexer/outputs.tf b/10_media-services/ai-video-indexer/outputs.tf
similarity index 100%
rename from 11_media-services/ai-video-indexer/outputs.tf
rename to 10_media-services/ai-video-indexer/outputs.tf
diff --git a/11_media-services/ai-video-indexer/provider.tf b/10_media-services/ai-video-indexer/provider.tf
similarity index 100%
rename from 11_media-services/ai-video-indexer/provider.tf
rename to 10_media-services/ai-video-indexer/provider.tf
diff --git a/11_media-services/ai-video-indexer/terraform.tfvars b/10_media-services/ai-video-indexer/terraform.tfvars
similarity index 100%
rename from 11_media-services/ai-video-indexer/terraform.tfvars
rename to 10_media-services/ai-video-indexer/terraform.tfvars
diff --git a/11_media-services/ai-video-indexer/variables.tf b/10_media-services/ai-video-indexer/variables.tf
similarity index 100%
rename from 11_media-services/ai-video-indexer/variables.tf
rename to 10_media-services/ai-video-indexer/variables.tf
diff --git a/11_media-services/cdn/README.md b/10_media-services/cdn/README.md
similarity index 99%
rename from 11_media-services/cdn/README.md
rename to 10_media-services/cdn/README.md
index 17bfa4f..fa2e0f7 100644
--- a/11_media-services/cdn/README.md
+++ b/10_media-services/cdn/README.md
@@ -86,6 +86,6 @@ Last updated: 2026-02-10

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/11_media-services/cdn/main.tf b/10_media-services/cdn/main.tf
similarity index 100%
rename from 11_media-services/cdn/main.tf
rename to 10_media-services/cdn/main.tf
diff --git a/11_media-services/cdn/outputs.tf b/10_media-services/cdn/outputs.tf
similarity index 100%
rename from 11_media-services/cdn/outputs.tf
rename to 10_media-services/cdn/outputs.tf
diff --git a/11_media-services/cdn/provider.tf b/10_media-services/cdn/provider.tf
similarity index 100%
rename from 11_media-services/cdn/provider.tf
rename to 10_media-services/cdn/provider.tf
diff --git a/11_media-services/cdn/terraform.tfvars b/10_media-services/cdn/terraform.tfvars
similarity index 100%
rename from 11_media-services/cdn/terraform.tfvars
rename to 10_media-services/cdn/terraform.tfvars
diff --git a/11_media-services/cdn/variables.tf b/10_media-services/cdn/variables.tf
similarity index 100%
rename from 11_media-services/cdn/variables.tf
rename to 10_media-services/cdn/variables.tf
diff --git a/1_storage-databases/README.md b/1_storage-databases/README.md
index 5bbf8ce..f5a5b5f 100644
--- a/1_storage-databases/README.md
+++ b/1_storage-databases/README.md
@@ -27,6 +27,6 @@ Last updated: 2026-02-09

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

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

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

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

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

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/1_storage-databases/mongo-atlas/known_errors.md b/1_storage-databases/mongo-atlas/known_errors.md
index 65b6e24..a5c8e9e 100644
--- a/1_storage-databases/mongo-atlas/known_errors.md
+++ b/1_storage-databases/mongo-atlas/known_errors.md
@@ -63,6 +63,6 @@ Last updated: 2026-02-09

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

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

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

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

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/2_compute-containers/README.md b/2_compute-containers/README.md
index 4b24c6f..31ba976 100644
--- a/2_compute-containers/README.md
+++ b/2_compute-containers/README.md
@@ -25,6 +25,6 @@ Last updated: 2026-02-09

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

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

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

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

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

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

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

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/3_networking/README.md b/3_networking/README.md
index d017c05..2876eb1 100644
--- a/3_networking/README.md
+++ b/3_networking/README.md
@@ -26,6 +26,6 @@ Last updated: 2026-02-09

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/3_networking/application-gateway/README.md b/3_networking/application-gateway/README.md
index 8a3da88..d23b23d 100644
--- a/3_networking/application-gateway/README.md
+++ b/3_networking/application-gateway/README.md
@@ -66,6 +66,6 @@ terraform apply

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/3_networking/cdn/README.md b/3_networking/cdn/README.md
index e2446e6..69fb813 100644
--- a/3_networking/cdn/README.md
+++ b/3_networking/cdn/README.md
@@ -58,6 +58,6 @@ terraform apply

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/3_networking/expressroute/README.md b/3_networking/expressroute/README.md
index e7a0494..c12c7e6 100644
--- a/3_networking/expressroute/README.md
+++ b/3_networking/expressroute/README.md
@@ -61,6 +61,6 @@ terraform apply

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/3_networking/firewall/README.md b/3_networking/firewall/README.md
index c4b9c60..e6b4f2f 100644
--- a/3_networking/firewall/README.md
+++ b/3_networking/firewall/README.md
@@ -57,6 +57,6 @@ terraform apply

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/3_networking/front-door/README.md b/3_networking/front-door/README.md
index 869b420..e979f31 100644
--- a/3_networking/front-door/README.md
+++ b/3_networking/front-door/README.md
@@ -59,6 +59,6 @@ terraform apply

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/3_networking/load-balancer/README.md b/3_networking/load-balancer/README.md
index 523d89e..b4d9a70 100644
--- a/3_networking/load-balancer/README.md
+++ b/3_networking/load-balancer/README.md
@@ -72,6 +72,6 @@ terraform apply

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/3_networking/traffic-manager/README.md b/3_networking/traffic-manager/README.md
index 94ae7f9..a55061c 100644
--- a/3_networking/traffic-manager/README.md
+++ b/3_networking/traffic-manager/README.md
@@ -64,6 +64,6 @@ terraform apply

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

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/4_identity-security/README.md b/4_identity-security/README.md
index 60c0252..a32b52a 100644
--- a/4_identity-security/README.md
+++ b/4_identity-security/README.md
@@ -22,6 +22,6 @@ Last updated: 2026-02-09

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

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

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/4_identity-security/managed-identity/README.md b/4_identity-security/managed-identity/README.md
index 3a4f170..8b9c191 100644
--- a/4_identity-security/managed-identity/README.md
+++ b/4_identity-security/managed-identity/README.md
@@ -75,6 +75,6 @@ Last updated: 2026-02-09

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/4_identity-security/policy/README.md b/4_identity-security/policy/README.md
index 0579f10..6b603a9 100644
--- a/4_identity-security/policy/README.md
+++ b/4_identity-security/policy/README.md
@@ -87,6 +87,6 @@ Last updated: 2026-02-10

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/5_analytics-bigdata/README.md b/5_analytics-bigdata/README.md
index aa13d02..59647dd 100644
--- a/5_analytics-bigdata/README.md
+++ b/5_analytics-bigdata/README.md
@@ -23,6 +23,6 @@ Last updated: 2026-02-16

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/5_analytics-bigdata/data-factory/README.md b/5_analytics-bigdata/data-factory/README.md
index 2b10654..24300c0 100644
--- a/5_analytics-bigdata/data-factory/README.md
+++ b/5_analytics-bigdata/data-factory/README.md
@@ -84,6 +84,6 @@ Last updated: 2026-02-11

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/5_analytics-bigdata/databricks/README.md b/5_analytics-bigdata/databricks/README.md
index ec5802f..ffa1122 100644
--- a/5_analytics-bigdata/databricks/README.md
+++ b/5_analytics-bigdata/databricks/README.md
@@ -82,6 +82,6 @@ Last updated: 2026-02-12

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/5_analytics-bigdata/event-hub/README.md b/5_analytics-bigdata/event-hub/README.md
index 3b2bc5c..2a3ca2f 100644
--- a/5_analytics-bigdata/event-hub/README.md
+++ b/5_analytics-bigdata/event-hub/README.md
@@ -82,6 +82,6 @@ Last updated: 2026-02-17

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/5_analytics-bigdata/fabric/README.md b/5_analytics-bigdata/fabric/README.md
index 0519f55..2d5d490 100644
--- a/5_analytics-bigdata/fabric/README.md
+++ b/5_analytics-bigdata/fabric/README.md
@@ -87,6 +87,6 @@ Last updated: 2026-02-17

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/5_analytics-bigdata/synapse-analytics/README.md b/5_analytics-bigdata/synapse-analytics/README.md
index d1b9801..eb24a87 100644
--- a/5_analytics-bigdata/synapse-analytics/README.md
+++ b/5_analytics-bigdata/synapse-analytics/README.md
@@ -101,6 +101,6 @@ Last updated: 2026-02-12

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

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/6_monitoring-management/advisor/README.md b/6_monitoring-management/advisor/README.md
index 4f37a8f..3df9610 100644
--- a/6_monitoring-management/advisor/README.md
+++ b/6_monitoring-management/advisor/README.md
@@ -29,6 +29,6 @@ terraform apply -auto-approve

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/6_monitoring-management/automation/README.md b/6_monitoring-management/automation/README.md
index 0f52f58..442a93f 100644
--- a/6_monitoring-management/automation/README.md
+++ b/6_monitoring-management/automation/README.md
@@ -36,6 +36,6 @@ terraform apply -auto-approve

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/6_monitoring-management/log-analytics/README.md b/6_monitoring-management/log-analytics/README.md
index af82fd4..857b91f 100644
--- a/6_monitoring-management/log-analytics/README.md
+++ b/6_monitoring-management/log-analytics/README.md
@@ -53,6 +53,6 @@ terraform apply -auto-approve

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/6_monitoring-management/monitor/README.md b/6_monitoring-management/monitor/README.md
index e3f430c..d35418b 100644
--- a/6_monitoring-management/monitor/README.md
+++ b/6_monitoring-management/monitor/README.md
@@ -26,6 +26,6 @@ terraform apply -auto-approve

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/7_iot/README.md b/7_iot/README.md
index 9b0bb1b..29e574f 100644
--- a/7_iot/README.md
+++ b/7_iot/README.md
@@ -5,16 +5,22 @@ Costa Rica
[](https://github.com/)
[brown9804](https://github.com/brown9804)
-Last updated: 2026-02-09
+Last updated: 2026-02-17
------------------------------------------
> [!IMPORTANT]
> This folder contains sample Terraform templates for Azure IoT services. These templates are starting points and should be customized based on your application needs.
+## Templates available
+
+- [Azure IoT Hub](./iot-hub)
+- [Azure IoT Edge (Device Update for IoT Hub)](./iot-edge)
+- [Azure Digital Twins](./digital-twins)
+

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/7_iot/digital-twins/README.md b/7_iot/digital-twins/README.md
new file mode 100644
index 0000000..884b302
--- /dev/null
+++ b/7_iot/digital-twins/README.md
@@ -0,0 +1,35 @@
+# Terraform Template - Azure Digital Twins
+
+Costa Rica
+
+[](https://github.com/)
+[brown9804](https://github.com/brown9804)
+
+Last updated: 2026-02-17
+
+------------------------------------------
+
+> This template creates an Azure Digital Twins instance.
+
+
+
+
+
+
+
+## Usage
+
+```sh
+az login
+terraform init -upgrade
+terraform validate
+terraform plan
+terraform apply -auto-approve
+```
+
+
+
+

+
Refresh Date: 2026-02-18
+
+
diff --git a/7_iot/digital-twins/main.tf b/7_iot/digital-twins/main.tf
new file mode 100644
index 0000000..eb48d22
--- /dev/null
+++ b/7_iot/digital-twins/main.tf
@@ -0,0 +1,54 @@
+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
+ base_name = var.digital_twins_name
+ }
+}
+
+locals {
+ suffix = var.append_random_suffix ? random_string.suffix.result : ""
+ name_raw = var.append_random_suffix ? "${var.digital_twins_name}-${local.suffix}" : var.digital_twins_name
+}
+
+resource "azurerm_digital_twins_instance" "dt" {
+ name = local.name_raw
+ location = var.location
+ resource_group_name = var.resource_group_name
+
+ 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/7_iot/digital-twins/outputs.tf b/7_iot/digital-twins/outputs.tf
new file mode 100644
index 0000000..dfacb0b
--- /dev/null
+++ b/7_iot/digital-twins/outputs.tf
@@ -0,0 +1,19 @@
+output "resource_group_id" {
+ description = "The resource ID of the Resource Group."
+ value = azapi_resource.resource_group.id
+}
+
+output "digital_twins_instance_id" {
+ description = "The resource ID of the Azure Digital Twins instance."
+ value = azurerm_digital_twins_instance.dt.id
+}
+
+output "digital_twins_instance_name" {
+ description = "The name of the Azure Digital Twins instance."
+ value = azurerm_digital_twins_instance.dt.name
+}
+
+output "digital_twins_host_name" {
+ description = "The host name for the Azure Digital Twins instance."
+ value = azurerm_digital_twins_instance.dt.host_name
+}
diff --git a/7_iot/digital-twins/provider.tf b/7_iot/digital-twins/provider.tf
new file mode 100644
index 0000000..e3a2be8
--- /dev/null
+++ b/7_iot/digital-twins/provider.tf
@@ -0,0 +1,35 @@
+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
+ }
+ }
+
+ # 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/7_iot/digital-twins/terraform.tfvars b/7_iot/digital-twins/terraform.tfvars
new file mode 100644
index 0000000..4f15848
--- /dev/null
+++ b/7_iot/digital-twins/terraform.tfvars
@@ -0,0 +1,8 @@
+resource_group_name = "rg-digital-twins-dev"
+location = "eastus"
+
+digital_twins_name = "dt-dev"
+
+tags = {
+ env = "dev"
+}
diff --git a/7_iot/digital-twins/variables.tf b/7_iot/digital-twins/variables.tf
new file mode 100644
index 0000000..95898cd
--- /dev/null
+++ b/7_iot/digital-twins/variables.tf
@@ -0,0 +1,58 @@
+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 the Digital Twins instance name 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 "digital_twins_name" {
+ description = "Base name for the Azure Digital Twins instance. If append_random_suffix is true, the final name will be '-'."
+ type = string
+
+ validation {
+ condition = length(trimspace(var.digital_twins_name)) >= 3
+ error_message = "digital_twins_name must be at least 3 characters."
+ }
+}
+
+variable "enable_system_assigned_identity" {
+ description = "Whether to enable a System Assigned Managed Identity on the Digital Twins instance."
+ type = bool
+ default = true
+}
+
+variable "tags" {
+ description = "A map of tags to assign to resources."
+ type = map(string)
+ default = {}
+}
diff --git a/7_iot/iot-edge/README.md b/7_iot/iot-edge/README.md
new file mode 100644
index 0000000..54171aa
--- /dev/null
+++ b/7_iot/iot-edge/README.md
@@ -0,0 +1,47 @@
+# Terraform Template - Azure IoT Edge (Device Update for IoT Hub)
+
+Costa Rica
+
+[](https://github.com/)
+[brown9804](https://github.com/brown9804)
+
+Last updated: 2026-02-17
+
+------------------------------------------
+
+> This template creates an Azure IoT Hub and a Device Update for IoT Hub account + instance.
+
+> [!IMPORTANT]
+> If your subscription is not registered for `Microsoft.DeviceUpdate`, the apply can fail with `MissingSubscriptionRegistration`. This template attempts to register the provider automatically via AzAPI (`register_deviceupdate_resource_provider = true`).
+>
+> Manual fallback:
+>
+> ```sh
+> az provider register --namespace Microsoft.DeviceUpdate
+> az provider show --namespace Microsoft.DeviceUpdate --query registrationState -o tsv
+> ```
+
+
+
+
+
+
+
+
+
+## Usage
+
+```sh
+az login
+terraform init -upgrade
+terraform validate
+terraform plan
+terraform apply -auto-approve
+```
+
+
+
+

+
Refresh Date: 2026-02-18
+
+
diff --git a/7_iot/iot-edge/main.tf b/7_iot/iot-edge/main.tf
new file mode 100644
index 0000000..e109cff
--- /dev/null
+++ b/7_iot/iot-edge/main.tf
@@ -0,0 +1,98 @@
+data "azurerm_client_config" "current" {}
+
+resource "azapi_resource_action" "register_deviceupdate" {
+ count = var.register_deviceupdate_resource_provider ? 1 : 0
+
+ type = "Microsoft.Resources/providers@2021-04-01"
+ resource_id = "/subscriptions/${data.azurerm_client_config.current.subscription_id}/providers/Microsoft.DeviceUpdate"
+ action = "register"
+ method = "POST"
+
+ response_export_values = [
+ "registrationState"
+ ]
+}
+
+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
+ iothub_base_name = var.iothub_name
+ dua_base_name = var.device_update_account_name
+ }
+}
+
+locals {
+ suffix = var.append_random_suffix ? random_string.suffix.result : ""
+ iothub_name_final = var.append_random_suffix ? "${var.iothub_name}-${local.suffix}" : var.iothub_name
+ device_update_account_raw = var.append_random_suffix ? "${var.device_update_account_name}-${local.suffix}" : var.device_update_account_name
+}
+
+resource "azurerm_iothub" "hub" {
+ name = local.iothub_name_final
+ location = var.location
+ resource_group_name = var.resource_group_name
+
+ sku {
+ name = var.iothub_sku_name
+ capacity = var.iothub_sku_capacity
+ }
+
+ tags = var.tags
+
+ depends_on = [
+ azapi_resource.resource_group
+ ]
+}
+
+resource "azurerm_iothub_device_update_account" "dua" {
+ name = local.device_update_account_raw
+ location = var.location
+ resource_group_name = var.resource_group_name
+
+ dynamic "identity" {
+ for_each = var.enable_device_update_system_assigned_identity ? [1] : []
+ content {
+ type = "SystemAssigned"
+ }
+ }
+
+ tags = var.tags
+
+ depends_on = [
+ azapi_resource.resource_group,
+ azapi_resource_action.register_deviceupdate
+ ]
+}
+
+resource "azurerm_iothub_device_update_instance" "instance" {
+ name = var.device_update_instance_name
+ device_update_account_id = azurerm_iothub_device_update_account.dua.id
+ iothub_id = azurerm_iothub.hub.id
+
+ depends_on = [
+ azurerm_iothub.hub,
+ azurerm_iothub_device_update_account.dua
+ ]
+}
diff --git a/7_iot/iot-edge/outputs.tf b/7_iot/iot-edge/outputs.tf
new file mode 100644
index 0000000..ece8088
--- /dev/null
+++ b/7_iot/iot-edge/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 "iothub_id" {
+ description = "The resource ID of the IoT Hub."
+ value = azurerm_iothub.hub.id
+}
+
+output "iothub_name" {
+ description = "The name of the IoT Hub."
+ value = azurerm_iothub.hub.name
+}
+
+output "device_update_account_id" {
+ description = "The resource ID of the Device Update for IoT Hub account."
+ value = azurerm_iothub_device_update_account.dua.id
+}
+
+output "device_update_account_name" {
+ description = "The name of the Device Update for IoT Hub account."
+ value = azurerm_iothub_device_update_account.dua.name
+}
+
+output "device_update_instance_id" {
+ description = "The resource ID of the Device Update instance."
+ value = azurerm_iothub_device_update_instance.instance.id
+}
diff --git a/7_iot/iot-edge/provider.tf b/7_iot/iot-edge/provider.tf
new file mode 100644
index 0000000..e3a2be8
--- /dev/null
+++ b/7_iot/iot-edge/provider.tf
@@ -0,0 +1,35 @@
+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
+ }
+ }
+
+ # 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/7_iot/iot-edge/terraform.tfvars b/7_iot/iot-edge/terraform.tfvars
new file mode 100644
index 0000000..acf056f
--- /dev/null
+++ b/7_iot/iot-edge/terraform.tfvars
@@ -0,0 +1,11 @@
+resource_group_name = "rg-iot-edge-dev"
+location = "eastus"
+
+iothub_name = "iothub-edge-dev"
+
+device_update_account_name = "du-edge-dev"
+device_update_instance_name = "default"
+
+tags = {
+ env = "dev"
+}
diff --git a/7_iot/iot-edge/variables.tf b/7_iot/iot-edge/variables.tf
new file mode 100644
index 0000000..1bd4730
--- /dev/null
+++ b/7_iot/iot-edge/variables.tf
@@ -0,0 +1,102 @@
+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 globally-unique 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 "iothub_name" {
+ description = "Base name for the Azure IoT Hub. If append_random_suffix is true, the final name will be '-'. IoT Hub names must be lowercase and globally unique."
+ type = string
+
+ validation {
+ condition = can(regex("^[a-z0-9]([a-z0-9-]{1,48})[a-z0-9]$", var.iothub_name))
+ error_message = "iothub_name must be 3-50 characters, lowercase letters/numbers/hyphens, and must start/end with an alphanumeric character."
+ }
+}
+
+variable "iothub_sku_name" {
+ description = "IoT Hub SKU name (F1, B1, S1, S2, S3)."
+ type = string
+ default = "S1"
+}
+
+variable "iothub_sku_capacity" {
+ description = "IoT Hub SKU capacity (number of units)."
+ type = number
+ default = 1
+
+ validation {
+ condition = var.iothub_sku_capacity >= 1
+ error_message = "iothub_sku_capacity must be >= 1."
+ }
+}
+
+variable "device_update_account_name" {
+ description = "Base name for the Device Update for IoT Hub account. If append_random_suffix is true, the final name will be '-'."
+ type = string
+
+ validation {
+ condition = length(trimspace(var.device_update_account_name)) >= 3
+ error_message = "device_update_account_name must be at least 3 characters."
+ }
+}
+
+variable "device_update_instance_name" {
+ description = "Name for the Device Update instance."
+ type = string
+ default = "default"
+
+ validation {
+ condition = length(trimspace(var.device_update_instance_name)) > 0
+ error_message = "device_update_instance_name must not be empty."
+ }
+}
+
+variable "enable_device_update_system_assigned_identity" {
+ description = "Whether to enable a System Assigned Managed Identity on the Device Update account."
+ type = bool
+ default = true
+}
+
+variable "register_deviceupdate_resource_provider" {
+ description = "Whether Terraform should attempt to register the 'Microsoft.DeviceUpdate' resource provider in the current subscription before creating Device Update resources."
+ type = bool
+ default = true
+}
+
+variable "tags" {
+ description = "A map of tags to assign to resources."
+ type = map(string)
+ default = {}
+}
diff --git a/7_iot/iot-hub/README.md b/7_iot/iot-hub/README.md
new file mode 100644
index 0000000..7dccea0
--- /dev/null
+++ b/7_iot/iot-hub/README.md
@@ -0,0 +1,35 @@
+# Terraform Template - Azure IoT Hub
+
+Costa Rica
+
+[](https://github.com/)
+[brown9804](https://github.com/brown9804)
+
+Last updated: 2026-02-17
+
+------------------------------------------
+
+> This template creates an Azure IoT Hub.
+
+
+
+
+
+
+
+## Usage
+
+```sh
+az login
+terraform init -upgrade
+terraform validate
+terraform plan
+terraform apply -auto-approve
+```
+
+
+
+

+
Refresh Date: 2026-02-18
+
+
diff --git a/7_iot/iot-hub/main.tf b/7_iot/iot-hub/main.tf
new file mode 100644
index 0000000..b104cb4
--- /dev/null
+++ b/7_iot/iot-hub/main.tf
@@ -0,0 +1,59 @@
+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
+ base_name = var.iothub_name
+ sku = var.sku_name
+ }
+}
+
+locals {
+ suffix = var.append_random_suffix ? random_string.suffix.result : ""
+ name_raw = var.append_random_suffix ? "${var.iothub_name}-${local.suffix}" : var.iothub_name
+}
+
+resource "azurerm_iothub" "hub" {
+ name = local.name_raw
+ location = var.location
+ resource_group_name = var.resource_group_name
+
+ sku {
+ name = var.sku_name
+ capacity = var.sku_capacity
+ }
+
+ public_network_access_enabled = var.public_network_access_enabled
+ local_authentication_enabled = var.local_authentication_enabled
+ event_hub_partition_count = var.event_hub_partition_count
+ event_hub_retention_in_days = var.event_hub_retention_in_days
+ min_tls_version = var.min_tls_version
+
+ tags = var.tags
+
+ depends_on = [
+ azapi_resource.resource_group
+ ]
+}
diff --git a/7_iot/iot-hub/outputs.tf b/7_iot/iot-hub/outputs.tf
new file mode 100644
index 0000000..931aa79
--- /dev/null
+++ b/7_iot/iot-hub/outputs.tf
@@ -0,0 +1,39 @@
+output "resource_group_id" {
+ description = "The resource ID of the Resource Group."
+ value = azapi_resource.resource_group.id
+}
+
+output "iothub_id" {
+ description = "The resource ID of the IoT Hub."
+ value = azurerm_iothub.hub.id
+}
+
+output "iothub_name" {
+ description = "The name of the IoT Hub."
+ value = azurerm_iothub.hub.name
+}
+
+output "iothub_hostname" {
+ description = "The hostname of the IoT Hub."
+ value = azurerm_iothub.hub.hostname
+}
+
+output "event_hub_events_endpoint" {
+ description = "The Event Hub-compatible endpoint for the built-in events endpoint."
+ value = azurerm_iothub.hub.event_hub_events_endpoint
+}
+
+output "event_hub_events_path" {
+ description = "The Event Hub-compatible path for the built-in events endpoint."
+ value = azurerm_iothub.hub.event_hub_events_path
+}
+
+output "event_hub_operations_endpoint" {
+ description = "The Event Hub-compatible endpoint for the built-in operations endpoint."
+ value = azurerm_iothub.hub.event_hub_operations_endpoint
+}
+
+output "event_hub_operations_path" {
+ description = "The Event Hub-compatible path for the built-in operations endpoint."
+ value = azurerm_iothub.hub.event_hub_operations_path
+}
diff --git a/7_iot/iot-hub/provider.tf b/7_iot/iot-hub/provider.tf
new file mode 100644
index 0000000..e3a2be8
--- /dev/null
+++ b/7_iot/iot-hub/provider.tf
@@ -0,0 +1,35 @@
+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
+ }
+ }
+
+ # 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/7_iot/iot-hub/terraform.tfvars b/7_iot/iot-hub/terraform.tfvars
new file mode 100644
index 0000000..caaed19
--- /dev/null
+++ b/7_iot/iot-hub/terraform.tfvars
@@ -0,0 +1,11 @@
+resource_group_name = "rg-iot-dev"
+location = "eastus"
+
+iothub_name = "iothub-dev"
+
+sku_name = "S1"
+sku_capacity = 1
+
+tags = {
+ env = "dev"
+}
diff --git a/7_iot/iot-hub/variables.tf b/7_iot/iot-hub/variables.tf
new file mode 100644
index 0000000..e630f24
--- /dev/null
+++ b/7_iot/iot-hub/variables.tf
@@ -0,0 +1,109 @@
+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 the IoT Hub name 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 "iothub_name" {
+ description = "Base name for the Azure IoT Hub. If append_random_suffix is true, the final name will be '-'. IoT Hub names must be lowercase and globally unique."
+ type = string
+
+ validation {
+ condition = can(regex("^[a-z0-9]([a-z0-9-]{1,48})[a-z0-9]$", var.iothub_name))
+ error_message = "iothub_name must be 3-50 characters, lowercase letters/numbers/hyphens, and must start/end with an alphanumeric character."
+ }
+}
+
+variable "sku_name" {
+ description = "IoT Hub SKU name (F1, B1, S1, S2, S3)."
+ type = string
+ default = "S1"
+}
+
+variable "sku_capacity" {
+ description = "IoT Hub SKU capacity (number of units)."
+ type = number
+ default = 1
+
+ validation {
+ condition = var.sku_capacity >= 1
+ error_message = "sku_capacity must be >= 1."
+ }
+}
+
+variable "event_hub_partition_count" {
+ description = "Number of partitions for the built-in Event Hub-compatible endpoint."
+ type = number
+ default = 2
+
+ validation {
+ condition = var.event_hub_partition_count >= 2 && var.event_hub_partition_count <= 128
+ error_message = "event_hub_partition_count must be between 2 and 128."
+ }
+}
+
+variable "event_hub_retention_in_days" {
+ description = "Retention time in days for the built-in Event Hub-compatible endpoint. Must be between 1 and 7."
+ type = number
+ default = 1
+
+ validation {
+ condition = var.event_hub_retention_in_days >= 1 && var.event_hub_retention_in_days <= 7
+ error_message = "event_hub_retention_in_days must be between 1 and 7."
+ }
+}
+
+variable "min_tls_version" {
+ description = "Minimum TLS version enforced by the IoT Hub."
+ type = string
+ default = "1.2"
+}
+
+variable "public_network_access_enabled" {
+ description = "Whether public network access is enabled for the IoT Hub."
+ type = bool
+ default = true
+}
+
+variable "local_authentication_enabled" {
+ description = "Whether local (SAS key) authentication is enabled."
+ type = bool
+ default = true
+}
+
+variable "tags" {
+ description = "A map of tags to assign to resources."
+ type = map(string)
+ default = {}
+}
diff --git a/8_ai-ml/README.md b/8_ai-ml/README.md
index 4a3e54a..3b4c17a 100644
--- a/8_ai-ml/README.md
+++ b/8_ai-ml/README.md
@@ -22,6 +22,6 @@ Last updated: 2026-02-16

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/8_ai-ml/ai-foundry/README.md b/8_ai-ml/ai-foundry/README.md
index 83fb52b..e416a0b 100644
--- a/8_ai-ml/ai-foundry/README.md
+++ b/8_ai-ml/ai-foundry/README.md
@@ -30,6 +30,6 @@ terraform apply -auto-approve

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/8_ai-ml/ai-search/README.md b/8_ai-ml/ai-search/README.md
index 7107c4d..e6ade6c 100644
--- a/8_ai-ml/ai-search/README.md
+++ b/8_ai-ml/ai-search/README.md
@@ -28,6 +28,6 @@ terraform apply -auto-approve

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/8_ai-ml/ai-services/README.md b/8_ai-ml/ai-services/README.md
index 8152cf1..a406af5 100644
--- a/8_ai-ml/ai-services/README.md
+++ b/8_ai-ml/ai-services/README.md
@@ -28,6 +28,6 @@ terraform apply -auto-approve

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/8_ai-ml/machine-learning/README.md b/8_ai-ml/machine-learning/README.md
index 7a0ae34..d164fd3 100644
--- a/8_ai-ml/machine-learning/README.md
+++ b/8_ai-ml/machine-learning/README.md
@@ -30,6 +30,6 @@ terraform apply -auto-approve

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/9_developer-tools/README.md b/9_developer-tools/README.md
deleted file mode 100644
index 270c586..0000000
--- a/9_developer-tools/README.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# Developer Tools: Samples
-
-Costa Rica
-
-[](https://github.com/)
-[brown9804](https://github.com/brown9804)
-
-Last updated: 2026-02-09
-
-------------------------------------------
-
-> [!IMPORTANT]
-> This folder contains sample Terraform templates for Azure developer tools. These templates are starting points and should be customized based on your application needs.
-
-
-
-

-
Refresh Date: 2026-02-17
-
-
diff --git a/10_migration-backup/README.md b/9_migration-backup/README.md
similarity index 95%
rename from 10_migration-backup/README.md
rename to 9_migration-backup/README.md
index dfef29f..7db5f95 100644
--- a/10_migration-backup/README.md
+++ b/9_migration-backup/README.md
@@ -20,6 +20,6 @@ Last updated: 2026-02-09

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/10_migration-backup/backup/README.md b/9_migration-backup/backup/README.md
similarity index 98%
rename from 10_migration-backup/backup/README.md
rename to 9_migration-backup/backup/README.md
index e4d07ac..f654da0 100644
--- a/10_migration-backup/backup/README.md
+++ b/9_migration-backup/backup/README.md
@@ -53,6 +53,6 @@ terraform apply

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/10_migration-backup/backup/main.tf b/9_migration-backup/backup/main.tf
similarity index 100%
rename from 10_migration-backup/backup/main.tf
rename to 9_migration-backup/backup/main.tf
diff --git a/10_migration-backup/backup/outputs.tf b/9_migration-backup/backup/outputs.tf
similarity index 100%
rename from 10_migration-backup/backup/outputs.tf
rename to 9_migration-backup/backup/outputs.tf
diff --git a/10_migration-backup/backup/provider.tf b/9_migration-backup/backup/provider.tf
similarity index 100%
rename from 10_migration-backup/backup/provider.tf
rename to 9_migration-backup/backup/provider.tf
diff --git a/10_migration-backup/backup/terraform.tfvars b/9_migration-backup/backup/terraform.tfvars
similarity index 100%
rename from 10_migration-backup/backup/terraform.tfvars
rename to 9_migration-backup/backup/terraform.tfvars
diff --git a/10_migration-backup/backup/variables.tf b/9_migration-backup/backup/variables.tf
similarity index 100%
rename from 10_migration-backup/backup/variables.tf
rename to 9_migration-backup/backup/variables.tf
diff --git a/10_migration-backup/site-recovery/README.md b/9_migration-backup/site-recovery/README.md
similarity index 98%
rename from 10_migration-backup/site-recovery/README.md
rename to 9_migration-backup/site-recovery/README.md
index 848a1fe..e56c002 100644
--- a/10_migration-backup/site-recovery/README.md
+++ b/9_migration-backup/site-recovery/README.md
@@ -53,6 +53,6 @@ terraform apply

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
diff --git a/10_migration-backup/site-recovery/main.tf b/9_migration-backup/site-recovery/main.tf
similarity index 100%
rename from 10_migration-backup/site-recovery/main.tf
rename to 9_migration-backup/site-recovery/main.tf
diff --git a/10_migration-backup/site-recovery/outputs.tf b/9_migration-backup/site-recovery/outputs.tf
similarity index 100%
rename from 10_migration-backup/site-recovery/outputs.tf
rename to 9_migration-backup/site-recovery/outputs.tf
diff --git a/10_migration-backup/site-recovery/provider.tf b/9_migration-backup/site-recovery/provider.tf
similarity index 100%
rename from 10_migration-backup/site-recovery/provider.tf
rename to 9_migration-backup/site-recovery/provider.tf
diff --git a/10_migration-backup/site-recovery/terraform.tfvars b/9_migration-backup/site-recovery/terraform.tfvars
similarity index 100%
rename from 10_migration-backup/site-recovery/terraform.tfvars
rename to 9_migration-backup/site-recovery/terraform.tfvars
diff --git a/10_migration-backup/site-recovery/variables.tf b/9_migration-backup/site-recovery/variables.tf
similarity index 100%
rename from 10_migration-backup/site-recovery/variables.tf
rename to 9_migration-backup/site-recovery/variables.tf
diff --git a/README.md b/README.md
index 96d6989..04bd4ff 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ Costa Rica
[](https://github.com/)
[brown9804](https://github.com/brown9804)
-Last updated: 2026-02-16
+Last updated: 2026-02-17
----------
@@ -128,6 +128,9 @@ Last updated: 2026-02-16
IoT (Click to expand)
- [IoT](./7_iot)
+ - [Azure IoT Hub](./7_iot/iot-hub)
+ - [Azure IoT Edge (Device Update for IoT Hub)](./7_iot/iot-edge)
+ - [Azure Digital Twins](./7_iot/digital-twins)
@@ -142,28 +145,21 @@ Last updated: 2026-02-16
-
- Developer Tools (Click to expand)
-
-- [Developer Tools](./9_developer-tools)
-
-
-
Migration and Backup (Click to expand)
-- [Migration and Backup](./10_migration-backup)
- - [Azure Data Protection Backup Vault](./10_migration-backup/backup)
- - [Azure Site Recovery (Recovery Services Vault)](./10_migration-backup/site-recovery)
+- [Migration and Backup](./9_migration-backup)
+ - [Azure Data Protection Backup Vault](./9_migration-backup/backup)
+ - [Azure Site Recovery (Recovery Services Vault)](./9_migration-backup/site-recovery)
Media Services (Click to expand)
-- [Media Services](./11_media-services)
- - [CDN (Front Door Standard/Premium)](./11_media-services/cdn)
- - [Azure AI Video Indexer](./11_media-services/ai-video-indexer)
+- [Media Services](./10_media-services)
+ - [CDN (Front Door Standard/Premium)](./10_media-services/cdn)
+ - [Azure AI Video Indexer](./10_media-services/ai-video-indexer)
@@ -268,8 +264,6 @@ graph TD;

-
Refresh Date: 2026-02-17
+
Refresh Date: 2026-02-18
-
-