From fa4e2f38799ea6fe72b3741f04e04d8c4637356e Mon Sep 17 00:00:00 2001 From: brown9804 Date: Tue, 17 Feb 2026 16:54:50 -0600 Subject: [PATCH 1/9] struc + iot ready --- 7_iot/README.md | 9 +- 7_iot/digital-twins/README.md | 29 +++++ 7_iot/digital-twins/main.tf | 54 ++++++++ 7_iot/digital-twins/outputs.tf | 19 +++ 7_iot/digital-twins/provider.tf | 35 ++++++ 7_iot/digital-twins/terraform.tfvars | 8 ++ 7_iot/digital-twins/variables.tf | 58 +++++++++ 7_iot/iot-edge/README.md | 39 ++++++ 7_iot/iot-edge/main.tf | 98 +++++++++++++++ 7_iot/iot-edge/outputs.tf | 29 +++++ 7_iot/iot-edge/provider.tf | 35 ++++++ 7_iot/iot-edge/terraform.tfvars | 11 ++ 7_iot/iot-edge/variables.tf | 102 +++++++++++++++ 7_iot/iot-hub/README.md | 29 +++++ 7_iot/iot-hub/main.tf | 58 +++++++++ 7_iot/iot-hub/outputs.tf | 39 ++++++ 7_iot/iot-hub/provider.tf | 35 ++++++ 7_iot/iot-hub/terraform.tfvars | 11 ++ 7_iot/iot-hub/variables.tf | 98 +++++++++++++++ 7_iot/time-series-insights/README.md | 29 +++++ 7_iot/time-series-insights/main.tf | 107 ++++++++++++++++ 7_iot/time-series-insights/outputs.tf | 34 +++++ 7_iot/time-series-insights/provider.tf | 35 ++++++ 7_iot/time-series-insights/terraform.tfvars | 13 ++ 7_iot/time-series-insights/variables.tf | 133 ++++++++++++++++++++ README.md | 6 +- 26 files changed, 1151 insertions(+), 2 deletions(-) create mode 100644 7_iot/digital-twins/README.md create mode 100644 7_iot/digital-twins/main.tf create mode 100644 7_iot/digital-twins/outputs.tf create mode 100644 7_iot/digital-twins/provider.tf create mode 100644 7_iot/digital-twins/terraform.tfvars create mode 100644 7_iot/digital-twins/variables.tf create mode 100644 7_iot/iot-edge/README.md create mode 100644 7_iot/iot-edge/main.tf create mode 100644 7_iot/iot-edge/outputs.tf create mode 100644 7_iot/iot-edge/provider.tf create mode 100644 7_iot/iot-edge/terraform.tfvars create mode 100644 7_iot/iot-edge/variables.tf create mode 100644 7_iot/iot-hub/README.md create mode 100644 7_iot/iot-hub/main.tf create mode 100644 7_iot/iot-hub/outputs.tf create mode 100644 7_iot/iot-hub/provider.tf create mode 100644 7_iot/iot-hub/terraform.tfvars create mode 100644 7_iot/iot-hub/variables.tf create mode 100644 7_iot/time-series-insights/README.md create mode 100644 7_iot/time-series-insights/main.tf create mode 100644 7_iot/time-series-insights/outputs.tf create mode 100644 7_iot/time-series-insights/provider.tf create mode 100644 7_iot/time-series-insights/terraform.tfvars create mode 100644 7_iot/time-series-insights/variables.tf diff --git a/7_iot/README.md b/7_iot/README.md index 9b0bb1b..bd95116 100644 --- a/7_iot/README.md +++ b/7_iot/README.md @@ -5,13 +5,20 @@ Costa Rica [![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](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) +- [Azure Time Series Insights (IoT)](./time-series-insights) +
Total views diff --git a/7_iot/digital-twins/README.md b/7_iot/digital-twins/README.md new file mode 100644 index 0000000..ccf7523 --- /dev/null +++ b/7_iot/digital-twins/README.md @@ -0,0 +1,29 @@ +# Terraform Template - Azure Digital Twins + +Costa Rica + +[![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](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 +``` + + +
+ Total views +

Refresh Date: 2026-02-17

+
+ 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..882348b --- /dev/null +++ b/7_iot/iot-edge/README.md @@ -0,0 +1,39 @@ +# Terraform Template - Azure IoT Edge (Device Update for IoT Hub) + +Costa Rica + +[![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](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 +``` + + +
+ Total views +

Refresh Date: 2026-02-17

+
+ 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..167c2bc --- /dev/null +++ b/7_iot/iot-hub/README.md @@ -0,0 +1,29 @@ +# Terraform Template - Azure IoT Hub + +Costa Rica + +[![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](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 +``` + + +
+ Total views +

Refresh Date: 2026-02-17

+
+ diff --git a/7_iot/iot-hub/main.tf b/7_iot/iot-hub/main.tf new file mode 100644 index 0000000..d4ab1ec --- /dev/null +++ b/7_iot/iot-hub/main.tf @@ -0,0 +1,58 @@ +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 + 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..f194242 --- /dev/null +++ b/7_iot/iot-hub/variables.tf @@ -0,0 +1,98 @@ +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 "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/7_iot/time-series-insights/README.md b/7_iot/time-series-insights/README.md new file mode 100644 index 0000000..e537f43 --- /dev/null +++ b/7_iot/time-series-insights/README.md @@ -0,0 +1,29 @@ +# Terraform Template - Azure Time Series Insights (IoT) + +Costa Rica + +[![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](https://github.com/) +[brown9804](https://github.com/brown9804) + +Last updated: 2026-02-17 + +------------------------------------------ + +> This template creates a Time Series Insights environment and configures an IoT Hub event source. + +## Usage + +```sh +az login +terraform init -upgrade +terraform validate +terraform plan +terraform apply -auto-approve +``` + + +
+ Total views +

Refresh Date: 2026-02-17

+
+ diff --git a/7_iot/time-series-insights/main.tf b/7_iot/time-series-insights/main.tf new file mode 100644 index 0000000..d31b19a --- /dev/null +++ b/7_iot/time-series-insights/main.tf @@ -0,0 +1,107 @@ +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 + iothub_base_name = var.iothub_name + tsi_base_name = var.tsi_environment_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 + tsi_environment_final = var.append_random_suffix ? "${var.tsi_environment_name}-${local.suffix}" : var.tsi_environment_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_consumer_group" "tsi" { + name = var.iothub_consumer_group_name + iothub_name = azurerm_iothub.hub.name + resource_group_name = var.resource_group_name + eventhub_endpoint_name = var.iothub_eventhub_endpoint_name +} + +resource "azurerm_iothub_shared_access_policy" "tsi" { + name = var.iothub_sas_policy_name + resource_group_name = var.resource_group_name + iothub_name = azurerm_iothub.hub.name + + service_connect = true +} + +resource "azurerm_iot_time_series_insights_standard_environment" "env" { + name = local.tsi_environment_final + location = var.location + resource_group_name = var.resource_group_name + + sku_name = var.tsi_sku_name + data_retention_time = var.tsi_data_retention_time + + tags = var.tags + + depends_on = [ + azapi_resource.resource_group + ] +} + +resource "azurerm_iot_time_series_insights_event_source_iothub" "es" { + name = var.tsi_event_source_name + location = var.location + environment_id = azurerm_iot_time_series_insights_standard_environment.env.id + + event_source_resource_id = azurerm_iothub.hub.id + iothub_name = azurerm_iothub.hub.name + consumer_group_name = azurerm_iothub_consumer_group.tsi.name + + shared_access_key_name = azurerm_iothub_shared_access_policy.tsi.name + shared_access_key = azurerm_iothub_shared_access_policy.tsi.primary_key +} + +resource "azurerm_iot_time_series_insights_access_policy" "access" { + count = var.access_policy_principal_object_id == null ? 0 : 1 + + name = var.access_policy_name + + time_series_insights_environment_id = azurerm_iot_time_series_insights_standard_environment.env.id + principal_object_id = var.access_policy_principal_object_id + roles = var.access_policy_roles +} diff --git a/7_iot/time-series-insights/outputs.tf b/7_iot/time-series-insights/outputs.tf new file mode 100644 index 0000000..25e6519 --- /dev/null +++ b/7_iot/time-series-insights/outputs.tf @@ -0,0 +1,34 @@ +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 "tsi_environment_id" { + description = "The resource ID of the Time Series Insights environment." + value = azurerm_iot_time_series_insights_standard_environment.env.id +} + +output "tsi_environment_name" { + description = "The name of the Time Series Insights environment." + value = azurerm_iot_time_series_insights_standard_environment.env.name +} + +output "tsi_event_source_id" { + description = "The resource ID of the Time Series Insights event source." + value = azurerm_iot_time_series_insights_event_source_iothub.es.id +} + +output "iothub_consumer_group_name" { + description = "The name of the IoT Hub consumer group used by the event source." + value = azurerm_iothub_consumer_group.tsi.name +} diff --git a/7_iot/time-series-insights/provider.tf b/7_iot/time-series-insights/provider.tf new file mode 100644 index 0000000..e3a2be8 --- /dev/null +++ b/7_iot/time-series-insights/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/time-series-insights/terraform.tfvars b/7_iot/time-series-insights/terraform.tfvars new file mode 100644 index 0000000..37acb92 --- /dev/null +++ b/7_iot/time-series-insights/terraform.tfvars @@ -0,0 +1,13 @@ +resource_group_name = "rg-tsi-dev" +location = "eastus" + +iothub_name = "iothub-tsi-dev" + +tsi_environment_name = "tsi-dev" +tsi_sku_name = "S1" +tsi_data_retention_time = "P31D" +tsi_event_source_name = "iothub" + +tags = { + env = "dev" +} diff --git a/7_iot/time-series-insights/variables.tf b/7_iot/time-series-insights/variables.tf new file mode 100644 index 0000000..d20cc72 --- /dev/null +++ b/7_iot/time-series-insights/variables.tf @@ -0,0 +1,133 @@ +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 used as the ingestion source. 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 "iothub_eventhub_endpoint_name" { + description = "Event Hub endpoint name on the IoT Hub to bind the consumer group to. Usually 'events'." + type = string + default = "events" +} + +variable "iothub_consumer_group_name" { + description = "Consumer group name to create for the Time Series Insights event source." + type = string + default = "tsi" +} + +variable "iothub_sas_policy_name" { + description = "Shared access policy name used by the Time Series Insights event source to read from the IoT Hub." + type = string + default = "tsi" +} + +variable "tsi_environment_name" { + description = "Base name for the Time Series Insights environment. If append_random_suffix is true, the final name will be '-'." + type = string + + validation { + condition = length(trimspace(var.tsi_environment_name)) >= 3 + error_message = "tsi_environment_name must be at least 3 characters." + } +} + +variable "tsi_sku_name" { + description = "Time Series Insights environment SKU name." + type = string + default = "S1" +} + +variable "tsi_data_retention_time" { + description = "ISO 8601 duration for data retention (for example 'P31D')." + type = string + default = "P31D" +} + +variable "tsi_event_source_name" { + description = "Name of the Time Series Insights event source." + type = string + default = "iothub" +} + +variable "access_policy_principal_object_id" { + description = "Optional Entra ID object ID to grant access to the Time Series Insights environment (access policy). If null, no access policy is created." + type = string + default = null +} + +variable "access_policy_name" { + description = "Name for the Time Series Insights access policy (only used when access_policy_principal_object_id is set)." + type = string + default = "default" +} + +variable "access_policy_roles" { + description = "Roles to grant in the Time Series Insights access policy." + type = list(string) + default = ["Reader"] +} + +variable "tags" { + description = "A map of tags to assign to resources." + type = map(string) + default = {} +} diff --git a/README.md b/README.md index 96d6989..9b7116b 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Costa Rica [![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](https://github.com/) [brown9804](https://github.com/brown9804) -Last updated: 2026-02-16 +Last updated: 2026-02-17 ---------- @@ -128,6 +128,10 @@ 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) + - [Azure Time Series Insights (IoT)](./7_iot/time-series-insights) From 87c9b673609ddaf30f1b55f1e5041be3ffc8bb67 Mon Sep 17 00:00:00 2001 From: Timna Brown <24630902+brown9804@users.noreply.github.com> Date: Tue, 17 Feb 2026 16:56:41 -0600 Subject: [PATCH 2/9] Add images to README for enhanced documentation Added images to the README for better visualization. --- 7_iot/iot-edge/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/7_iot/iot-edge/README.md b/7_iot/iot-edge/README.md index 882348b..3dad1e8 100644 --- a/7_iot/iot-edge/README.md +++ b/7_iot/iot-edge/README.md @@ -21,6 +21,14 @@ Last updated: 2026-02-17 > az provider show --namespace Microsoft.DeviceUpdate --query registrationState -o tsv > ``` +image + +image + +image + +image + ## Usage ```sh From a36eb9f690bf94561d9e96080acefc76f216c5cf Mon Sep 17 00:00:00 2001 From: brown9804 Date: Tue, 17 Feb 2026 21:43:09 -0600 Subject: [PATCH 3/9] iot hub in place --- 7_iot/iot-hub/main.tf | 1 + 7_iot/iot-hub/variables.tf | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/7_iot/iot-hub/main.tf b/7_iot/iot-hub/main.tf index d4ab1ec..b104cb4 100644 --- a/7_iot/iot-hub/main.tf +++ b/7_iot/iot-hub/main.tf @@ -48,6 +48,7 @@ resource "azurerm_iothub" "hub" { 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 diff --git a/7_iot/iot-hub/variables.tf b/7_iot/iot-hub/variables.tf index f194242..e630f24 100644 --- a/7_iot/iot-hub/variables.tf +++ b/7_iot/iot-hub/variables.tf @@ -73,6 +73,17 @@ variable "event_hub_partition_count" { } } +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 From c24d2de79714fb4f8bc29e37a6d31172ae28ea70 Mon Sep 17 00:00:00 2001 From: Timna Brown <24630902+brown9804@users.noreply.github.com> Date: Tue, 17 Feb 2026 21:44:45 -0600 Subject: [PATCH 4/9] Enhance README with additional images Added images to the README for better visualization. --- 7_iot/iot-hub/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/7_iot/iot-hub/README.md b/7_iot/iot-hub/README.md index 167c2bc..822a80f 100644 --- a/7_iot/iot-hub/README.md +++ b/7_iot/iot-hub/README.md @@ -11,6 +11,13 @@ Last updated: 2026-02-17 > This template creates an Azure IoT Hub. + +image + +image + +image + ## Usage ```sh From 40aebd4a855ffaefd3555e951e5caecf346c0a7f Mon Sep 17 00:00:00 2001 From: Timna Brown <24630902+brown9804@users.noreply.github.com> Date: Tue, 17 Feb 2026 22:05:03 -0600 Subject: [PATCH 5/9] Enhance README with additional images Added images to the README for better visualization. --- 7_iot/digital-twins/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/7_iot/digital-twins/README.md b/7_iot/digital-twins/README.md index ccf7523..475c9a2 100644 --- a/7_iot/digital-twins/README.md +++ b/7_iot/digital-twins/README.md @@ -11,6 +11,12 @@ Last updated: 2026-02-17 > This template creates an Azure Digital Twins instance. +image + +image + +image + ## Usage ```sh From 562c29ea92e161322b2e4e9bfd9646fd6eb69439 Mon Sep 17 00:00:00 2001 From: brown9804 Date: Tue, 17 Feb 2026 22:34:24 -0600 Subject: [PATCH 6/9] 1st stable versions --- .../README.md | 0 .../ai-video-indexer/README.md | 0 .../ai-video-indexer/main.tf | 0 .../ai-video-indexer/outputs.tf | 0 .../ai-video-indexer/provider.tf | 0 .../ai-video-indexer/terraform.tfvars | 0 .../ai-video-indexer/variables.tf | 0 .../cdn/README.md | 0 .../cdn/main.tf | 0 .../cdn/outputs.tf | 0 .../cdn/provider.tf | 0 .../cdn/terraform.tfvars | 0 .../cdn/variables.tf | 0 7_iot/README.md | 1 - 7_iot/time-series-insights/README.md | 29 ---- 7_iot/time-series-insights/main.tf | 107 -------------- 7_iot/time-series-insights/outputs.tf | 34 ----- 7_iot/time-series-insights/provider.tf | 35 ----- 7_iot/time-series-insights/terraform.tfvars | 13 -- 7_iot/time-series-insights/variables.tf | 133 ------------------ 9_developer-tools/README.md | 20 --- .../README.md | 0 .../backup/README.md | 0 .../backup/main.tf | 0 .../backup/outputs.tf | 0 .../backup/provider.tf | 0 .../backup/terraform.tfvars | 0 .../backup/variables.tf | 0 .../site-recovery/README.md | 0 .../site-recovery/main.tf | 0 .../site-recovery/outputs.tf | 0 .../site-recovery/provider.tf | 0 .../site-recovery/terraform.tfvars | 0 .../site-recovery/variables.tf | 0 README.md | 22 +-- 35 files changed, 6 insertions(+), 388 deletions(-) rename {11_media-services => 10_media-services}/README.md (100%) rename {11_media-services => 10_media-services}/ai-video-indexer/README.md (100%) rename {11_media-services => 10_media-services}/ai-video-indexer/main.tf (100%) rename {11_media-services => 10_media-services}/ai-video-indexer/outputs.tf (100%) rename {11_media-services => 10_media-services}/ai-video-indexer/provider.tf (100%) rename {11_media-services => 10_media-services}/ai-video-indexer/terraform.tfvars (100%) rename {11_media-services => 10_media-services}/ai-video-indexer/variables.tf (100%) rename {11_media-services => 10_media-services}/cdn/README.md (100%) rename {11_media-services => 10_media-services}/cdn/main.tf (100%) rename {11_media-services => 10_media-services}/cdn/outputs.tf (100%) rename {11_media-services => 10_media-services}/cdn/provider.tf (100%) rename {11_media-services => 10_media-services}/cdn/terraform.tfvars (100%) rename {11_media-services => 10_media-services}/cdn/variables.tf (100%) delete mode 100644 7_iot/time-series-insights/README.md delete mode 100644 7_iot/time-series-insights/main.tf delete mode 100644 7_iot/time-series-insights/outputs.tf delete mode 100644 7_iot/time-series-insights/provider.tf delete mode 100644 7_iot/time-series-insights/terraform.tfvars delete mode 100644 7_iot/time-series-insights/variables.tf delete mode 100644 9_developer-tools/README.md rename {10_migration-backup => 9_migration-backup}/README.md (100%) rename {10_migration-backup => 9_migration-backup}/backup/README.md (100%) rename {10_migration-backup => 9_migration-backup}/backup/main.tf (100%) rename {10_migration-backup => 9_migration-backup}/backup/outputs.tf (100%) rename {10_migration-backup => 9_migration-backup}/backup/provider.tf (100%) rename {10_migration-backup => 9_migration-backup}/backup/terraform.tfvars (100%) rename {10_migration-backup => 9_migration-backup}/backup/variables.tf (100%) rename {10_migration-backup => 9_migration-backup}/site-recovery/README.md (100%) rename {10_migration-backup => 9_migration-backup}/site-recovery/main.tf (100%) rename {10_migration-backup => 9_migration-backup}/site-recovery/outputs.tf (100%) rename {10_migration-backup => 9_migration-backup}/site-recovery/provider.tf (100%) rename {10_migration-backup => 9_migration-backup}/site-recovery/terraform.tfvars (100%) rename {10_migration-backup => 9_migration-backup}/site-recovery/variables.tf (100%) diff --git a/11_media-services/README.md b/10_media-services/README.md similarity index 100% rename from 11_media-services/README.md rename to 10_media-services/README.md diff --git a/11_media-services/ai-video-indexer/README.md b/10_media-services/ai-video-indexer/README.md similarity index 100% rename from 11_media-services/ai-video-indexer/README.md rename to 10_media-services/ai-video-indexer/README.md 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 100% rename from 11_media-services/cdn/README.md rename to 10_media-services/cdn/README.md 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/7_iot/README.md b/7_iot/README.md index bd95116..358d4bb 100644 --- a/7_iot/README.md +++ b/7_iot/README.md @@ -17,7 +17,6 @@ Last updated: 2026-02-17 - [Azure IoT Hub](./iot-hub) - [Azure IoT Edge (Device Update for IoT Hub)](./iot-edge) - [Azure Digital Twins](./digital-twins) -- [Azure Time Series Insights (IoT)](./time-series-insights)
diff --git a/7_iot/time-series-insights/README.md b/7_iot/time-series-insights/README.md deleted file mode 100644 index e537f43..0000000 --- a/7_iot/time-series-insights/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Terraform Template - Azure Time Series Insights (IoT) - -Costa Rica - -[![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](https://github.com/) -[brown9804](https://github.com/brown9804) - -Last updated: 2026-02-17 - ------------------------------------------- - -> This template creates a Time Series Insights environment and configures an IoT Hub event source. - -## Usage - -```sh -az login -terraform init -upgrade -terraform validate -terraform plan -terraform apply -auto-approve -``` - - -
- Total views -

Refresh Date: 2026-02-17

-
- diff --git a/7_iot/time-series-insights/main.tf b/7_iot/time-series-insights/main.tf deleted file mode 100644 index d31b19a..0000000 --- a/7_iot/time-series-insights/main.tf +++ /dev/null @@ -1,107 +0,0 @@ -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 - iothub_base_name = var.iothub_name - tsi_base_name = var.tsi_environment_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 - tsi_environment_final = var.append_random_suffix ? "${var.tsi_environment_name}-${local.suffix}" : var.tsi_environment_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_consumer_group" "tsi" { - name = var.iothub_consumer_group_name - iothub_name = azurerm_iothub.hub.name - resource_group_name = var.resource_group_name - eventhub_endpoint_name = var.iothub_eventhub_endpoint_name -} - -resource "azurerm_iothub_shared_access_policy" "tsi" { - name = var.iothub_sas_policy_name - resource_group_name = var.resource_group_name - iothub_name = azurerm_iothub.hub.name - - service_connect = true -} - -resource "azurerm_iot_time_series_insights_standard_environment" "env" { - name = local.tsi_environment_final - location = var.location - resource_group_name = var.resource_group_name - - sku_name = var.tsi_sku_name - data_retention_time = var.tsi_data_retention_time - - tags = var.tags - - depends_on = [ - azapi_resource.resource_group - ] -} - -resource "azurerm_iot_time_series_insights_event_source_iothub" "es" { - name = var.tsi_event_source_name - location = var.location - environment_id = azurerm_iot_time_series_insights_standard_environment.env.id - - event_source_resource_id = azurerm_iothub.hub.id - iothub_name = azurerm_iothub.hub.name - consumer_group_name = azurerm_iothub_consumer_group.tsi.name - - shared_access_key_name = azurerm_iothub_shared_access_policy.tsi.name - shared_access_key = azurerm_iothub_shared_access_policy.tsi.primary_key -} - -resource "azurerm_iot_time_series_insights_access_policy" "access" { - count = var.access_policy_principal_object_id == null ? 0 : 1 - - name = var.access_policy_name - - time_series_insights_environment_id = azurerm_iot_time_series_insights_standard_environment.env.id - principal_object_id = var.access_policy_principal_object_id - roles = var.access_policy_roles -} diff --git a/7_iot/time-series-insights/outputs.tf b/7_iot/time-series-insights/outputs.tf deleted file mode 100644 index 25e6519..0000000 --- a/7_iot/time-series-insights/outputs.tf +++ /dev/null @@ -1,34 +0,0 @@ -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 "tsi_environment_id" { - description = "The resource ID of the Time Series Insights environment." - value = azurerm_iot_time_series_insights_standard_environment.env.id -} - -output "tsi_environment_name" { - description = "The name of the Time Series Insights environment." - value = azurerm_iot_time_series_insights_standard_environment.env.name -} - -output "tsi_event_source_id" { - description = "The resource ID of the Time Series Insights event source." - value = azurerm_iot_time_series_insights_event_source_iothub.es.id -} - -output "iothub_consumer_group_name" { - description = "The name of the IoT Hub consumer group used by the event source." - value = azurerm_iothub_consumer_group.tsi.name -} diff --git a/7_iot/time-series-insights/provider.tf b/7_iot/time-series-insights/provider.tf deleted file mode 100644 index e3a2be8..0000000 --- a/7_iot/time-series-insights/provider.tf +++ /dev/null @@ -1,35 +0,0 @@ -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/time-series-insights/terraform.tfvars b/7_iot/time-series-insights/terraform.tfvars deleted file mode 100644 index 37acb92..0000000 --- a/7_iot/time-series-insights/terraform.tfvars +++ /dev/null @@ -1,13 +0,0 @@ -resource_group_name = "rg-tsi-dev" -location = "eastus" - -iothub_name = "iothub-tsi-dev" - -tsi_environment_name = "tsi-dev" -tsi_sku_name = "S1" -tsi_data_retention_time = "P31D" -tsi_event_source_name = "iothub" - -tags = { - env = "dev" -} diff --git a/7_iot/time-series-insights/variables.tf b/7_iot/time-series-insights/variables.tf deleted file mode 100644 index d20cc72..0000000 --- a/7_iot/time-series-insights/variables.tf +++ /dev/null @@ -1,133 +0,0 @@ -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 used as the ingestion source. 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 "iothub_eventhub_endpoint_name" { - description = "Event Hub endpoint name on the IoT Hub to bind the consumer group to. Usually 'events'." - type = string - default = "events" -} - -variable "iothub_consumer_group_name" { - description = "Consumer group name to create for the Time Series Insights event source." - type = string - default = "tsi" -} - -variable "iothub_sas_policy_name" { - description = "Shared access policy name used by the Time Series Insights event source to read from the IoT Hub." - type = string - default = "tsi" -} - -variable "tsi_environment_name" { - description = "Base name for the Time Series Insights environment. If append_random_suffix is true, the final name will be '-'." - type = string - - validation { - condition = length(trimspace(var.tsi_environment_name)) >= 3 - error_message = "tsi_environment_name must be at least 3 characters." - } -} - -variable "tsi_sku_name" { - description = "Time Series Insights environment SKU name." - type = string - default = "S1" -} - -variable "tsi_data_retention_time" { - description = "ISO 8601 duration for data retention (for example 'P31D')." - type = string - default = "P31D" -} - -variable "tsi_event_source_name" { - description = "Name of the Time Series Insights event source." - type = string - default = "iothub" -} - -variable "access_policy_principal_object_id" { - description = "Optional Entra ID object ID to grant access to the Time Series Insights environment (access policy). If null, no access policy is created." - type = string - default = null -} - -variable "access_policy_name" { - description = "Name for the Time Series Insights access policy (only used when access_policy_principal_object_id is set)." - type = string - default = "default" -} - -variable "access_policy_roles" { - description = "Roles to grant in the Time Series Insights access policy." - type = list(string) - default = ["Reader"] -} - -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 deleted file mode 100644 index 270c586..0000000 --- a/9_developer-tools/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Developer Tools: Samples - -Costa Rica - -[![GitHub](https://img.shields.io/badge/--181717?logo=github&logoColor=ffffff)](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. - - -
- Total views -

Refresh Date: 2026-02-17

-
- diff --git a/10_migration-backup/README.md b/9_migration-backup/README.md similarity index 100% rename from 10_migration-backup/README.md rename to 9_migration-backup/README.md diff --git a/10_migration-backup/backup/README.md b/9_migration-backup/backup/README.md similarity index 100% rename from 10_migration-backup/backup/README.md rename to 9_migration-backup/backup/README.md 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 100% rename from 10_migration-backup/site-recovery/README.md rename to 9_migration-backup/site-recovery/README.md 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 9b7116b..1dcbe7a 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,6 @@ Last updated: 2026-02-17 - [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) - - [Azure Time Series Insights (IoT)](./7_iot/time-series-insights) @@ -146,28 +145,21 @@ Last updated: 2026-02-17 -
- 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)
@@ -275,5 +267,3 @@ graph TD;

Refresh Date: 2026-02-17

- -
From 2e6d3a8e0f5d2d6c52f3d045aec4b234ca4153fd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 18 Feb 2026 04:34:50 +0000 Subject: [PATCH 7/9] Fix Markdown syntax issues --- 7_iot/iot-hub/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/7_iot/iot-hub/README.md b/7_iot/iot-hub/README.md index 822a80f..2e071c0 100644 --- a/7_iot/iot-hub/README.md +++ b/7_iot/iot-hub/README.md @@ -11,7 +11,6 @@ Last updated: 2026-02-17 > This template creates an Azure IoT Hub. - image image From d15c8f015034e91ba86d4101ef13bb00e11fd99c Mon Sep 17 00:00:00 2001 From: Timna Brown <24630902+brown9804@users.noreply.github.com> Date: Tue, 17 Feb 2026 22:35:34 -0600 Subject: [PATCH 8/9] Fix comment syntax in README.md From 42371ca1b89fb1d96f644b826e6fa57755fd2a7f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 18 Feb 2026 04:35:47 +0000 Subject: [PATCH 9/9] Update visitor count --- 0_core-infrastructure/README.md | 2 +- 0_core-infrastructure/azure-bastion/README.md | 2 +- 0_core-infrastructure/azure-dns/README.md | 2 +- 0_core-infrastructure/network-security-group/README.md | 2 +- 0_core-infrastructure/public-ip/README.md | 2 +- 0_core-infrastructure/resource-group/README.md | 2 +- 0_core-infrastructure/subnet/README.md | 2 +- 0_core-infrastructure/virtual-network/README.md | 2 +- 10_media-services/README.md | 2 +- 10_media-services/ai-video-indexer/README.md | 2 +- 10_media-services/cdn/README.md | 2 +- 1_storage-databases/README.md | 2 +- 1_storage-databases/blob-storage/README.md | 2 +- 1_storage-databases/cosmos-db/README.md | 2 +- 1_storage-databases/data-lake-storage/README.md | 2 +- 1_storage-databases/file-storage/README.md | 2 +- 1_storage-databases/mongo-atlas/README.md | 2 +- 1_storage-databases/mongo-atlas/known_errors.md | 2 +- 1_storage-databases/mysql-flexible-server/README.md | 2 +- 1_storage-databases/postgresql/README.md | 2 +- 1_storage-databases/sql-database/README.md | 2 +- 1_storage-databases/storage-account/README.md | 2 +- 2_compute-containers/README.md | 2 +- 2_compute-containers/app-service/README.md | 2 +- 2_compute-containers/batch/README.md | 2 +- 2_compute-containers/container-instances/README.md | 2 +- 2_compute-containers/function-app/README.md | 2 +- 2_compute-containers/kubernetes-service/README.md | 2 +- 2_compute-containers/virtual-desktop/README.md | 2 +- 2_compute-containers/virtual-machine/README.md | 2 +- 3_networking/README.md | 2 +- 3_networking/application-gateway/README.md | 2 +- 3_networking/cdn/README.md | 2 +- 3_networking/expressroute/README.md | 2 +- 3_networking/firewall/README.md | 2 +- 3_networking/front-door/README.md | 2 +- 3_networking/load-balancer/README.md | 2 +- 3_networking/traffic-manager/README.md | 2 +- 3_networking/vpn-gateway/README.md | 2 +- 4_identity-security/README.md | 2 +- 4_identity-security/entra_id/README.md | 2 +- 4_identity-security/key-vault/README.md | 2 +- 4_identity-security/managed-identity/README.md | 2 +- 4_identity-security/policy/README.md | 2 +- 5_analytics-bigdata/README.md | 2 +- 5_analytics-bigdata/data-factory/README.md | 2 +- 5_analytics-bigdata/databricks/README.md | 2 +- 5_analytics-bigdata/event-hub/README.md | 2 +- 5_analytics-bigdata/fabric/README.md | 2 +- 5_analytics-bigdata/synapse-analytics/README.md | 2 +- 6_monitoring-management/README.md | 2 +- 6_monitoring-management/advisor/README.md | 2 +- 6_monitoring-management/automation/README.md | 2 +- 6_monitoring-management/log-analytics/README.md | 2 +- 6_monitoring-management/monitor/README.md | 2 +- 7_iot/README.md | 2 +- 7_iot/digital-twins/README.md | 2 +- 7_iot/iot-edge/README.md | 2 +- 7_iot/iot-hub/README.md | 2 +- 8_ai-ml/README.md | 2 +- 8_ai-ml/ai-foundry/README.md | 2 +- 8_ai-ml/ai-search/README.md | 2 +- 8_ai-ml/ai-services/README.md | 2 +- 8_ai-ml/machine-learning/README.md | 2 +- 9_migration-backup/README.md | 2 +- 9_migration-backup/backup/README.md | 2 +- 9_migration-backup/site-recovery/README.md | 2 +- README.md | 2 +- 68 files changed, 68 insertions(+), 68 deletions(-) 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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

Refresh Date: 2026-02-17

+

Refresh Date: 2026-02-18

diff --git a/10_media-services/README.md b/10_media-services/README.md index f1e26b9..5c910a9 100644 --- a/10_media-services/README.md +++ b/10_media-services/README.md @@ -20,6 +20,6 @@ Last updated: 2026-02-11
Total views -

Refresh Date: 2026-02-17

+

Refresh Date: 2026-02-18

diff --git a/10_media-services/ai-video-indexer/README.md b/10_media-services/ai-video-indexer/README.md index 48c1d1e..e102065 100644 --- a/10_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
Total views -

Refresh Date: 2026-02-17

+

Refresh Date: 2026-02-18

diff --git a/10_media-services/cdn/README.md b/10_media-services/cdn/README.md index 17bfa4f..fa2e0f7 100644 --- a/10_media-services/cdn/README.md +++ b/10_media-services/cdn/README.md @@ -86,6 +86,6 @@ Last updated: 2026-02-10
Total views -

Refresh Date: 2026-02-17

+

Refresh Date: 2026-02-18

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

Refresh Date: 2026-02-17

+

Refresh Date: 2026-02-18

diff --git a/7_iot/README.md b/7_iot/README.md index 358d4bb..29e574f 100644 --- a/7_iot/README.md +++ b/7_iot/README.md @@ -21,6 +21,6 @@ Last updated: 2026-02-17
Total views -

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 index 475c9a2..884b302 100644 --- a/7_iot/digital-twins/README.md +++ b/7_iot/digital-twins/README.md @@ -30,6 +30,6 @@ terraform apply -auto-approve
Total views -

Refresh Date: 2026-02-17

+

Refresh Date: 2026-02-18

diff --git a/7_iot/iot-edge/README.md b/7_iot/iot-edge/README.md index 3dad1e8..54171aa 100644 --- a/7_iot/iot-edge/README.md +++ b/7_iot/iot-edge/README.md @@ -42,6 +42,6 @@ terraform apply -auto-approve
Total views -

Refresh Date: 2026-02-17

+

Refresh Date: 2026-02-18

diff --git a/7_iot/iot-hub/README.md b/7_iot/iot-hub/README.md index 2e071c0..7dccea0 100644 --- a/7_iot/iot-hub/README.md +++ b/7_iot/iot-hub/README.md @@ -30,6 +30,6 @@ terraform apply -auto-approve
Total views -

Refresh Date: 2026-02-17

+

Refresh Date: 2026-02-18

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
Total views -

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
Total views -

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
Total views -

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
Total views -

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
Total views -

Refresh Date: 2026-02-17

+

Refresh Date: 2026-02-18

diff --git a/9_migration-backup/README.md b/9_migration-backup/README.md index dfef29f..7db5f95 100644 --- a/9_migration-backup/README.md +++ b/9_migration-backup/README.md @@ -20,6 +20,6 @@ Last updated: 2026-02-09
Total views -

Refresh Date: 2026-02-17

+

Refresh Date: 2026-02-18

diff --git a/9_migration-backup/backup/README.md b/9_migration-backup/backup/README.md index e4d07ac..f654da0 100644 --- a/9_migration-backup/backup/README.md +++ b/9_migration-backup/backup/README.md @@ -53,6 +53,6 @@ terraform apply
Total views -

Refresh Date: 2026-02-17

+

Refresh Date: 2026-02-18

diff --git a/9_migration-backup/site-recovery/README.md b/9_migration-backup/site-recovery/README.md index 848a1fe..e56c002 100644 --- a/9_migration-backup/site-recovery/README.md +++ b/9_migration-backup/site-recovery/README.md @@ -53,6 +53,6 @@ terraform apply
Total views -

Refresh Date: 2026-02-17

+

Refresh Date: 2026-02-18

diff --git a/README.md b/README.md index 1dcbe7a..04bd4ff 100644 --- a/README.md +++ b/README.md @@ -264,6 +264,6 @@ graph TD;
Total views -

Refresh Date: 2026-02-17

+

Refresh Date: 2026-02-18