modules/terraform/setup/table-data-connections/main.tf (131 lines of code) (raw):
terraform {
required_version = ">=1.5.6"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "<= 3.93.0"
}
}
}
provider "azurerm" {
features {}
storage_use_azuread = true
}
locals {
tags = {
owner = var.owner
}
_scenario_type = replace(trimspace(var.scenario_type), "/[./-]/", "_")
_scenario_name = replace(trimspace(var.scenario_name), "/[./-]/", "_")
_scenario_version = replace(trimspace(var.scenario_version), "/[./-]/", "_")
kusto_table_name = "${local._scenario_name}_${local._scenario_version}"
kusto_database_name = local._scenario_type
data_connection_name = substr("${trimspace(var.scenario_name)}-${replace(trimspace(var.scenario_version), "/[/]/", "-")}", 0, 40)
}
# Resource Group
data "azurerm_resource_group" "rg" {
name = var.resource_group_name
}
# Storage Account
data "azurerm_storage_account" "storage" {
name = var.storage_account_name
resource_group_name = data.azurerm_resource_group.rg.name
}
# Storage Container
data "azurerm_storage_container" "container" {
name = var.scenario_type
storage_account_name = data.azurerm_storage_account.storage.name
}
# Azure Data Explorer Cluster
data "azurerm_kusto_cluster" "cluster" {
name = var.kusto_cluster_name
resource_group_name = data.azurerm_resource_group.rg.name
}
# Bash Script
resource "local_file" "bash_script" {
filename = "${path.module}/table_script.sh"
content = <<-EOT
#!/bin/bash
set -e
eval "$(jq -r '@sh "KUSTO_TABLE_NAME=\(.KUSTO_TABLE_NAME)"')"
result_file="./result.json"
table_script_path="../../../python/kusto"
table_creation_script=$(python3 $table_script_path/generate_commands.py "$KUSTO_TABLE_NAME" "$result_file")
jq -n --arg table_script "$table_creation_script" '{"table_creation_script":$table_script}'
EOT
}
data "external" "bash_script" {
program = ["bash", local_file.bash_script.filename]
query = {
KUSTO_TABLE_NAME = local.kusto_table_name
}
}
# Azure Data Explorer Database
data "azurerm_kusto_database" "database" {
name = local.kusto_database_name
resource_group_name = data.azurerm_resource_group.rg.name
cluster_name = data.azurerm_kusto_cluster.cluster.name
}
resource "azurerm_kusto_script" "script" {
name = "kusto-script-${formatdate("MM-DD-YYYY-hh-mm-ss", timestamp())}"
database_id = data.azurerm_kusto_database.database.id
continue_on_errors_enabled = false
force_an_update_when_value_changed = "first"
script_content = base64decode(data.external.bash_script.result["table_creation_script"])
}
data "azurerm_eventhub_namespace" "eventhub_ns" {
count = var.create_eventhub_namespace ? 0 : 1
name = var.eventhub_namespace
resource_group_name = data.azurerm_resource_group.rg.name
}
resource "azurerm_eventhub_namespace" "eventhub_ns" {
count = var.create_eventhub_namespace ? 1 : 0
name = "ADX-EG-telescope-${formatdate("MM-DD-YYYY-hh-mm-ss", timestamp())}"
location = data.azurerm_resource_group.rg.location
resource_group_name = data.azurerm_resource_group.rg.name
sku = "Standard"
capacity = 1
local_authentication_enabled = true
tags = local.tags
}
resource "azurerm_eventhub" "eventhub" {
name = "adx-eg-${formatdate("MM-DD-YYYY-hh-mm-ss", timestamp())}"
namespace_name = var.create_eventhub_namespace ? azurerm_eventhub_namespace.eventhub_ns[0].name : data.azurerm_eventhub_namespace.eventhub_ns[0].name
resource_group_name = data.azurerm_resource_group.rg.name
partition_count = 8
message_retention = 7
}
resource "azurerm_role_assignment" "eventhub_role_assignment" {
scope = azurerm_eventhub.eventhub.id
role_definition_name = "Azure Event Hubs Data Receiver"
principal_id = data.azurerm_kusto_cluster.cluster.identity[0].principal_id
}
resource "azurerm_eventhub_consumer_group" "consumer_group" {
name = "default"
namespace_name = var.create_eventhub_namespace ? azurerm_eventhub_namespace.eventhub_ns[0].name : data.azurerm_eventhub_namespace.eventhub_ns[0].name
eventhub_name = azurerm_eventhub.eventhub.name
resource_group_name = data.azurerm_resource_group.rg.name
}
resource "azurerm_eventgrid_event_subscription" "event_subscription" {
name = "ADX-EG-${formatdate("MM-DD-YYYY-hh-mm-ss", timestamp())}"
scope = data.azurerm_storage_account.storage.id
event_delivery_schema = "EventGridSchema"
eventhub_endpoint_id = azurerm_eventhub.eventhub.id
included_event_types = ["Microsoft.Storage.BlobCreated"]
subject_filter {
subject_begins_with = "/blobServices/default/containers/${var.scenario_type}/blobs/${var.scenario_name}/${var.scenario_version}"
}
advanced_filtering_on_arrays_enabled = true
depends_on = [data.azurerm_storage_container.container]
}
resource "azurerm_kusto_eventgrid_data_connection" "evengrid_connection" {
name = local.data_connection_name
resource_group_name = data.azurerm_resource_group.rg.name
location = data.azurerm_resource_group.rg.location
cluster_name = data.azurerm_kusto_cluster.cluster.name
database_name = data.azurerm_kusto_database.database.name
storage_account_id = data.azurerm_storage_account.storage.id
blob_storage_event_type = "Microsoft.Storage.BlobCreated"
eventgrid_resource_id = azurerm_eventgrid_event_subscription.event_subscription.id
eventhub_id = azurerm_eventhub.eventhub.id
eventhub_consumer_group_name = azurerm_eventhub_consumer_group.consumer_group.name
managed_identity_resource_id = data.azurerm_kusto_cluster.cluster.id
database_routing_type = "Single"
table_name = local.kusto_table_name
data_format = "JSON"
mapping_rule_name = "${local.kusto_table_name}_mapping"
depends_on = [azurerm_eventgrid_event_subscription.event_subscription, azurerm_kusto_script.script, azurerm_eventhub_consumer_group.consumer_group]
}