From b533e11611088d486d5e88538a8e343911ecac91 Mon Sep 17 00:00:00 2001 From: Jake Pullen Date: Mon, 10 Nov 2025 06:48:33 +0000 Subject: [PATCH] Daily snapshot: 2025-11-10 --- .../rules/module-dependency-best-practices.md | 9 ++++ environments/dev/main.tf | 16 ++++++ environments/dev/variables.tf | 20 ++++++- modules/compute/main.tf | 4 ++ modules/data_factory/main.tf | 20 ++++++- modules/data_factory/variables.tf | 19 ++++++- modules/database/main.tf | 54 +++++++++++++++++++ modules/database/outputs.tf | 3 ++ modules/database/variables.tf | 31 +++++++++++ 9 files changed, 173 insertions(+), 3 deletions(-) create mode 100644 .continue/rules/module-dependency-best-practices.md diff --git a/.continue/rules/module-dependency-best-practices.md b/.continue/rules/module-dependency-best-practices.md new file mode 100644 index 0000000..75e14d9 --- /dev/null +++ b/.continue/rules/module-dependency-best-practices.md @@ -0,0 +1,9 @@ +--- +globs: "**/*.tf" +description: When a module depends on another module, it should only reference + the outputs of that module, not its internal resources or variables. This + promotes loose coupling and better maintainability. +alwaysApply: true +--- + +Avoid tight coupling between modules by having one module depend on another's internal implementation details \ No newline at end of file diff --git a/environments/dev/main.tf b/environments/dev/main.tf index e898f42..1e2a2bf 100644 --- a/environments/dev/main.tf +++ b/environments/dev/main.tf @@ -52,6 +52,17 @@ module "network" { project = var.project_name } +module "sql_server" { + source = "../../modules/database" + resource_group_name = var.resource_group_name + location = var.location + environment = var.environment + sql_admin_password = var.sql_admin_password + sql_server_name = var.sql_server_name + olap_database_name = var.olap_database_name + oltp_database_name = var.oltp_database_name +} + module "data_factory" { source = "../../modules/data_factory" resource_group_name = var.resource_group_name @@ -59,8 +70,13 @@ module "data_factory" { environment = var.environment storage_account_url = local.storage_account_url data_factory_name = var.data_factory_name + sql_admin_password = var.sql_admin_password + sql_server_name = var.sql_server_name + olap_database_name = var.olap_database_name + oltp_database_name = var.oltp_database_name } + # module "compute" { # source = "../../modules/compute" # resource_group_name = var.resource_group_name diff --git a/environments/dev/variables.tf b/environments/dev/variables.tf index 6845c6a..6fac824 100644 --- a/environments/dev/variables.tf +++ b/environments/dev/variables.tf @@ -22,4 +22,22 @@ variable "data_factory_name" { description = "The unique name of the data factory" type = string default = "data-sandbox-factory-dev" -} \ No newline at end of file +} + +variable "sql_admin_password" { + description = "SQL Server administrator password" + type = string + default = "4-v3ry-53cr37-p455w0rd" # terraform docs +} + +variable "sql_server_name" { + default = "aiimi-cop-sandbox-sql-server" +} + +variable "oltp_database_name" { + default = "oltp_master" +} + +variable "olap_database_name" { + default = "olap_master" +} diff --git a/modules/compute/main.tf b/modules/compute/main.tf index a6c34d7..c818e18 100644 --- a/modules/compute/main.tf +++ b/modules/compute/main.tf @@ -64,4 +64,8 @@ resource "azurerm_linux_virtual_machine" "vm" { sku = "server" version = "latest" } + + tags = { + volatile = true + } } diff --git a/modules/data_factory/main.tf b/modules/data_factory/main.tf index a547098..8417b33 100644 --- a/modules/data_factory/main.tf +++ b/modules/data_factory/main.tf @@ -2,6 +2,24 @@ resource "azurerm_data_factory" "factory" { name = var.data_factory_name location = var.location resource_group_name = var.resource_group_name + + tags = { + volatile = true + } +} + + +# Linked services for SQL databases +resource "azurerm_data_factory_linked_service_azure_sql_database" "ls_oltp_database" { + name = "ls_oltp_database" + data_factory_id = azurerm_data_factory.factory.id + connection_string = "data source=${var.sql_server_name}.database.windows.net;initial catalog=${var.oltp_database_name};user id=4dm1n157r470r;Password=${var.sql_admin_password};integrated security=False;encrypt=True;connection timeout=30" +} + +resource "azurerm_data_factory_linked_service_azure_sql_database" "ls_olap_database" { + name = "ls_olap_database" + data_factory_id = azurerm_data_factory.factory.id + connection_string = "data source=${var.sql_server_name}.database.windows.net;initial catalog=${var.olap_database_name};user id=4dm1n157r470r;Password=${var.sql_admin_password};integrated security=False;encrypt=True;connection timeout=30" } # TODO: Set up linked services and datasets @@ -10,4 +28,4 @@ resource "azurerm_data_factory" "factory" { # data_factory_id = azurerm_data_factory.factory.id # url = var.storage_account_url -# } \ No newline at end of file +# } diff --git a/modules/data_factory/variables.tf b/modules/data_factory/variables.tf index af4e806..5635b83 100644 --- a/modules/data_factory/variables.tf +++ b/modules/data_factory/variables.tf @@ -27,4 +27,21 @@ variable "storage_account_url" { variable "data_factory_name" { description = "The unique name of the data factory" type = string -} \ No newline at end of file +} + +variable "sql_admin_password" { + description = "SQL Server administrator password" + type = string +} + +variable "sql_server_name" { + type = string +} + +variable "oltp_database_name" { + type = string +} + +variable "olap_database_name" { + type = string +} diff --git a/modules/database/main.tf b/modules/database/main.tf index e69de29..a8efb88 100644 --- a/modules/database/main.tf +++ b/modules/database/main.tf @@ -0,0 +1,54 @@ + +resource "azurerm_mssql_server" "sql_server" { + name = var.sql_server_name + resource_group_name = var.resource_group_name + location = var.location + version = "12.0" + administrator_login = "4dm1n157r470r" # terraform docs + administrator_login_password = var.sql_admin_password +} + +resource "azurerm_mssql_database" "oltp_database" { + name = var.oltp_database_name + server_id = azurerm_mssql_server.sql_server.id + collation = "SQL_Latin1_General_CP1_CI_AS" + license_type = "LicenseIncluded" # tbc, developer? + sku_name = "S0" # az sql db list-editions -l uksouth -o table + storage_account_type = "Local" + geo_backup_enabled = false + + tags = { + volatile = true + } + + + lifecycle { + # prevent_destroy = true + prevent_destroy = false + # it should actually be true, so data is safe + # however our sandbox environment should be + # ripped out completely. + } +} + +resource "azurerm_mssql_database" "olap_database" { + name = var.olap_database_name + server_id = azurerm_mssql_server.sql_server.id + collation = "SQL_Latin1_General_CP1_CI_AS" + license_type = "LicenseIncluded" # tbc, developer? + sku_name = "S0" # az sql db list-editions -l uksouth -o table + storage_account_type = "Local" + geo_backup_enabled = false + + tags = { + volatile = true + } + + lifecycle { + # prevent_destroy = true + prevent_destroy = false + # it should actually be true, so data is safe + # however our sandbox environment should be + # ripped out completely. + } +} \ No newline at end of file diff --git a/modules/database/outputs.tf b/modules/database/outputs.tf index e69de29..59697f1 100644 --- a/modules/database/outputs.tf +++ b/modules/database/outputs.tf @@ -0,0 +1,3 @@ +output "sql_server_id" { + value = azurerm_mssql_server.sql_server.id +} diff --git a/modules/database/variables.tf b/modules/database/variables.tf index e69de29..c5ce59f 100644 --- a/modules/database/variables.tf +++ b/modules/database/variables.tf @@ -0,0 +1,31 @@ +variable "resource_group_name" { + description = "Resource Group to create resources in" + type = string +} + +variable "location" { + description = "Azure region" + type = string +} + +variable "environment" { + description = "Environment tag (dev/prod)" + type = string +} + +variable "sql_admin_password" { + description = "SQL Server administrator password" + type = string +} + +variable "sql_server_name" { + type = string +} + +variable "oltp_database_name" { + type = string +} + +variable "olap_database_name" { + type = string +}