From d18fd18af04df39fb68d20526e244d33949ed75c Mon Sep 17 00:00:00 2001 From: Mahsa Hanifi Date: Thu, 16 Jul 2020 09:45:20 -0700 Subject: [PATCH] added the first draft of the az-svc-data-integration-mlw ran the terraform recursive and fixed it changed the cares name into sample Add adf and fix AF to use id --- .../providers/azure/data-factory/README.md | 11 +- .../providers/azure/data-factory/datasets.tf | 8 - .../azure/data-factory/linkedservices.tf | 8 - .../providers/azure/data-factory/output.tf | 10 - .../data-factory/terraform.tfvars.template | 5 +- .../data_factory_integration_test.go | 10 - .../azure/data-factory/tests/test.tfvars | 18 +- .../tests/unit/data_factory_unit_test.go | 26 +- .../providers/azure/data-factory/variables.tf | 30 -- .../az-svc-data-integration-mlw/.env.template | 12 + .../az-svc-data-integration-mlw/README.md | 139 +++++++++ .../az-svc-data-integration-mlw/app.tf | 126 ++++++++ .../az-svc-data-integration-mlw/backend.tf | 10 + .../az-svc-data-integration-mlw/commons.tf | 131 ++++++++ .../docs/design/README.md | 236 +++++++++++++++ .../design/images/deployment-topology.drawio | 1 + .../design/images/deployment-topology.jpg | Bin 0 -> 138236 bytes .../docs/design/images/template-design.drawio | 1 + .../docs/design/images/template-design.jpg | Bin 0 -> 132436 bytes .../az-svc-data-integration-mlw/keyvault.tf | 62 ++++ .../az-svc-data-integration-mlw/output.tf | 114 +++++++ .../az-svc-data-integration-mlw/security.tf | 93 ++++++ .../az-svc-data-integration-mlw/storage.tf | 63 ++++ .../terraform.tfvars | 58 ++++ .../tests/integration/appservices.go | 52 ++++ .../tests/integration/integration_test.go | 51 ++++ .../tests/integration/service_principal.go | 55 ++++ .../tests/unit/appservice.go | 36 +++ .../tests/unit/autoscale.go | 41 +++ .../tests/unit/common.go | 23 ++ .../tests/unit/cosmosdb.go | 39 +++ .../tests/unit/datafactory.go | 15 + .../tests/unit/functionapp.go | 19 ++ .../tests/unit/keyvault.go | 58 ++++ .../tests/unit/mlworkspace.go | 17 ++ .../tests/unit/storage.go | 30 ++ .../tests/unit/unit_test.go | 74 +++++ .../az-svc-data-integration-mlw/variables.tf | 286 ++++++++++++++++++ .../az-svc-data-integration-mlw/version.tf | 3 + 39 files changed, 1855 insertions(+), 116 deletions(-) delete mode 100644 infra/modules/providers/azure/data-factory/datasets.tf delete mode 100644 infra/modules/providers/azure/data-factory/linkedservices.tf create mode 100644 infra/templates/az-svc-data-integration-mlw/.env.template create mode 100644 infra/templates/az-svc-data-integration-mlw/README.md create mode 100644 infra/templates/az-svc-data-integration-mlw/app.tf create mode 100644 infra/templates/az-svc-data-integration-mlw/backend.tf create mode 100644 infra/templates/az-svc-data-integration-mlw/commons.tf create mode 100644 infra/templates/az-svc-data-integration-mlw/docs/design/README.md create mode 100644 infra/templates/az-svc-data-integration-mlw/docs/design/images/deployment-topology.drawio create mode 100644 infra/templates/az-svc-data-integration-mlw/docs/design/images/deployment-topology.jpg create mode 100644 infra/templates/az-svc-data-integration-mlw/docs/design/images/template-design.drawio create mode 100644 infra/templates/az-svc-data-integration-mlw/docs/design/images/template-design.jpg create mode 100644 infra/templates/az-svc-data-integration-mlw/keyvault.tf create mode 100644 infra/templates/az-svc-data-integration-mlw/output.tf create mode 100644 infra/templates/az-svc-data-integration-mlw/security.tf create mode 100644 infra/templates/az-svc-data-integration-mlw/storage.tf create mode 100644 infra/templates/az-svc-data-integration-mlw/terraform.tfvars create mode 100644 infra/templates/az-svc-data-integration-mlw/tests/integration/appservices.go create mode 100644 infra/templates/az-svc-data-integration-mlw/tests/integration/integration_test.go create mode 100644 infra/templates/az-svc-data-integration-mlw/tests/integration/service_principal.go create mode 100644 infra/templates/az-svc-data-integration-mlw/tests/unit/appservice.go create mode 100644 infra/templates/az-svc-data-integration-mlw/tests/unit/autoscale.go create mode 100644 infra/templates/az-svc-data-integration-mlw/tests/unit/common.go create mode 100644 infra/templates/az-svc-data-integration-mlw/tests/unit/cosmosdb.go create mode 100644 infra/templates/az-svc-data-integration-mlw/tests/unit/datafactory.go create mode 100644 infra/templates/az-svc-data-integration-mlw/tests/unit/functionapp.go create mode 100644 infra/templates/az-svc-data-integration-mlw/tests/unit/keyvault.go create mode 100644 infra/templates/az-svc-data-integration-mlw/tests/unit/mlworkspace.go create mode 100644 infra/templates/az-svc-data-integration-mlw/tests/unit/storage.go create mode 100644 infra/templates/az-svc-data-integration-mlw/tests/unit/unit_test.go create mode 100644 infra/templates/az-svc-data-integration-mlw/variables.tf create mode 100644 infra/templates/az-svc-data-integration-mlw/version.tf diff --git a/infra/modules/providers/azure/data-factory/README.md b/infra/modules/providers/azure/data-factory/README.md index fd47441c..ef528613 100644 --- a/infra/modules/providers/azure/data-factory/README.md +++ b/infra/modules/providers/azure/data-factory/README.md @@ -17,15 +17,13 @@ An instance of the `data-factory` module deploys the _**Data Factory**_ in order - Ability to provision a single Data Factory instance - Ability to provision a configurable Pipeline - Ability to configure Trigger -- Ability to configure SQL server Dataset -- Ability to configure SQL server Linked Service + ## Out Of Scope The following are not support in the time being - Creating Multiple pipelines -- Only SQL server Dataset/Linked Service are implemented. ## Definition @@ -35,8 +33,6 @@ Terraform resources used to define the `data-factory` module include the followi - [azurerm_data_factory_integration_runtime_managed](https://www.terraform.io/docs/providers/azurerm/r/data_factory_integration_runtime_managed.html) - [azurerm_data_factory_pipeline](https://www.terraform.io/docs/providers/azurerm/r/data_factory_pipeline.html) - [azurerm_data_factory_trigger_schedule](https://www.terraform.io/docs/providers/azurerm/r/data_factory_trigger_schedule.html) -- [azurerm_data_factory_dataset_sql_server](https://www.terraform.io/docs/providers/azurerm/r/data_factory_dataset_sql_server_table.html) -- [azurerm_data_factory_linked_service_sql_server](https://www.terraform.io/docs/providers/azurerm/r/data_factory_linked_service_sql_server.html) ## Usage @@ -60,11 +56,6 @@ module "data_factory" { data_factory_trigger_name = "adftrigger" data_factory_trigger_interval = 1 data_factory_trigger_frequency = "Minute" - data_factory_dataset_sql_name = "adfsqldataset" - data_factory_dataset_sql_table_name = "adfsqldatasettable" - data_factory_dataset_sql_folder = "" - data_factory_linked_sql_name = "adfsqllinked" - data_factory_linked_sql_connection_string = "Server=tcp:adfsql..." } ``` diff --git a/infra/modules/providers/azure/data-factory/datasets.tf b/infra/modules/providers/azure/data-factory/datasets.tf deleted file mode 100644 index 8133ddba..00000000 --- a/infra/modules/providers/azure/data-factory/datasets.tf +++ /dev/null @@ -1,8 +0,0 @@ - -resource "azurerm_data_factory_dataset_sql_server_table" "main" { - name = var.data_factory_dataset_sql_name - resource_group_name = data.azurerm_resource_group.main.name - data_factory_name = azurerm_data_factory.main.name - linked_service_name = azurerm_data_factory_linked_service_sql_server.main.name - table_name = var.data_factory_dataset_sql_table_name -} \ No newline at end of file diff --git a/infra/modules/providers/azure/data-factory/linkedservices.tf b/infra/modules/providers/azure/data-factory/linkedservices.tf deleted file mode 100644 index 1c4d5c60..00000000 --- a/infra/modules/providers/azure/data-factory/linkedservices.tf +++ /dev/null @@ -1,8 +0,0 @@ - -resource "azurerm_data_factory_linked_service_sql_server" "main" { - name = var.data_factory_linked_sql_name - resource_group_name = data.azurerm_resource_group.main.name - data_factory_name = azurerm_data_factory.main.name - connection_string = var.data_factory_linked_sql_connection_string - integration_runtime_name = azurerm_data_factory_integration_runtime_managed.main.name -} diff --git a/infra/modules/providers/azure/data-factory/output.tf b/infra/modules/providers/azure/data-factory/output.tf index 41183a80..c51ba94a 100644 --- a/infra/modules/providers/azure/data-factory/output.tf +++ b/infra/modules/providers/azure/data-factory/output.tf @@ -28,16 +28,6 @@ output "trigger_interval" { value = azurerm_data_factory_trigger_schedule.main.interval } -output "sql_dataset_id" { - description = "The ID of the SQL server dataset created" - value = azurerm_data_factory_dataset_sql_server_table.main.id -} - -output "sql_linked_service_id" { - description = "The ID of the SQL server Linked service created" - value = azurerm_data_factory_linked_service_sql_server.main.id -} - output "adf_identity_principal_id" { description = "The ID of the principal(client) in Azure active directory" value = azurerm_data_factory.main.identity[0].principal_id diff --git a/infra/modules/providers/azure/data-factory/terraform.tfvars.template b/infra/modules/providers/azure/data-factory/terraform.tfvars.template index 84048298..8bbae88c 100644 --- a/infra/modules/providers/azure/data-factory/terraform.tfvars.template +++ b/infra/modules/providers/azure/data-factory/terraform.tfvars.template @@ -2,10 +2,7 @@ resource_group_name = "" data_factory_name = "" data_factory_runtime_name = "" data_factory_pipeline_name = "" -data_factory_dataset_sql_name = "" -data_factory_dataset_sql_table_name = "" -data_factory_linked_sql_name = "" -data_factory_linked_sql_connection_string = "" +data_factory_trigger_name = "" vnet_integration = { vnet_id = "" subnet_name = "" diff --git a/infra/modules/providers/azure/data-factory/tests/integration/data_factory_integration_test.go b/infra/modules/providers/azure/data-factory/tests/integration/data_factory_integration_test.go index 66c11b36..19efe05b 100644 --- a/infra/modules/providers/azure/data-factory/tests/integration/data_factory_integration_test.go +++ b/infra/modules/providers/azure/data-factory/tests/integration/data_factory_integration_test.go @@ -25,16 +25,6 @@ func TestDataFactory(t *testing.T) { "data_factory_name", "pipeline_name", ), - VerifyCreatedDataset(subscription, - "resource_group_name", - "data_factory_name", - "sql_dataset_id", - ), - VerifyCreatedLinkedService(subscription, - "resource_group_name", - "data_factory_name", - "sql_linked_service_id", - ), }, } integration.RunIntegrationTests(&testFixture) diff --git a/infra/modules/providers/azure/data-factory/tests/test.tfvars b/infra/modules/providers/azure/data-factory/tests/test.tfvars index e2166811..8bbae88c 100644 --- a/infra/modules/providers/azure/data-factory/tests/test.tfvars +++ b/infra/modules/providers/azure/data-factory/tests/test.tfvars @@ -1,13 +1,9 @@ -resource_group_name = "adftest" -data_factory_name = "adftest" -data_factory_runtime_name = "adfrttest" -data_factory_pipeline_name = "testpipeline" -data_factory_trigger_name = "testtrigger" -data_factory_dataset_sql_name = "testsql" -data_factory_dataset_sql_table_name = "adfsqltableheba" -data_factory_linked_sql_name = "testlinkedsql" -data_factory_linked_sql_connection_string = "connectionstring" +resource_group_name = "" +data_factory_name = "" +data_factory_runtime_name = "" +data_factory_pipeline_name = "" +data_factory_trigger_name = "" vnet_integration = { - vnet_id = "/subscriptions/resourceGroups/providers/Microsoft.Network/virtualNetworks/testvnet" - subnet_name = "default" + vnet_id = "" + subnet_name = "" } diff --git a/infra/modules/providers/azure/data-factory/tests/unit/data_factory_unit_test.go b/infra/modules/providers/azure/data-factory/tests/unit/data_factory_unit_test.go index c6dd0a0f..78bf3bad 100644 --- a/infra/modules/providers/azure/data-factory/tests/unit/data_factory_unit_test.go +++ b/infra/modules/providers/azure/data-factory/tests/unit/data_factory_unit_test.go @@ -1,24 +1,11 @@ package unit import ( - "encoding/json" - "strings" "testing" - - "github.com/gruntwork-io/terratest/modules/random" tests "github.com/microsoft/cobalt/infra/modules/providers/azure/data-factory/tests" "github.com/microsoft/terratest-abstraction/unit" ) -// helper function to parse blocks of JSON into a generic Go map -func asMap(t *testing.T, jsonString string) map[string]interface{} { - var theMap map[string]interface{} - if err := json.Unmarshal([]byte(jsonString), &theMap); err != nil { - t.Fatal(err) - } - return theMap -} - func TestTemplate(t *testing.T) { expectedDataFactory := map[string]interface{}{ @@ -53,27 +40,16 @@ func TestTemplate(t *testing.T) { "frequency": "Minute", } - expectedDatasetSQL := map[string]interface{}{ - "name": "testsql", - } - - expectedLinkedSQL := map[string]interface{}{ - "name": "testlinkedsql", - "connection_string": "connectionstring", - } - testFixture := unit.UnitTestFixture{ GoTest: t, TfOptions: tests.DataFactoryTFOptions, PlanAssertions: nil, - ExpectedResourceCount: 6, + ExpectedResourceCount: 4, ExpectedResourceAttributeValues: unit.ResourceDescription{ "azurerm_data_factory.main": expectedDataFactory, "azurerm_data_factory_integration_runtime_managed.main": expectedDFIntRunTime, "azurerm_data_factory_pipeline.main": expectedPipeline, "azurerm_data_factory_trigger_schedule.main": expectedTrigger, - "azurerm_data_factory_dataset_sql_server_table.main": expectedDatasetSQL, - "azurerm_data_factory_linked_service_sql_server.main": expectedLinkedSQL, }, } diff --git a/infra/modules/providers/azure/data-factory/variables.tf b/infra/modules/providers/azure/data-factory/variables.tf index 96ab0679..e6c38bef 100644 --- a/infra/modules/providers/azure/data-factory/variables.tf +++ b/infra/modules/providers/azure/data-factory/variables.tf @@ -68,34 +68,4 @@ variable "data_factory_trigger_frequency" { description = "The trigger freqency. Valid values include Minute, Hour, Day, Week, Month. Defaults to Minute." type = string default = "Minute" -} - -variable "data_factory_dataset_sql_name" { - description = "Specifies the name of the Data Factory Dataset SQL Server Table. Only letters, numbers and '_' are allowed." - type = string - default = "" -} - -variable "data_factory_dataset_sql_table_name" { - description = "The table name of the Data Factory Dataset SQL Server Table." - type = string - default = "" -} - -variable "data_factory_dataset_sql_folder" { - description = "The folder that this Dataset is in. If not specified, the Dataset will appear at the root level." - type = string - default = "" -} - -variable "data_factory_linked_sql_name" { - description = "Specifies the name of the Data Factory Linked Service SQL Server. Changing this forces a new resource to be created." - type = string - default = "" -} - -variable "data_factory_linked_sql_connection_string" { - description = "The connection string in which to authenticate with the SQL Server." - type = string - default = "" } \ No newline at end of file diff --git a/infra/templates/az-svc-data-integration-mlw/.env.template b/infra/templates/az-svc-data-integration-mlw/.env.template new file mode 100644 index 00000000..f93d1f90 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/.env.template @@ -0,0 +1,12 @@ +export ARM_ACCESS_KEY= +export ARM_CLIENT_ID= +export ARM_CLIENT_SECRET= +export ARM_SUBSCRIPTION_ID= +export ARM_TENANT_ID= +export BUILD_BUILDID=1 +export GO_VERSION=1.12.5 +export TF_VAR_remote_state_account= +export TF_VAR_remote_state_container= +export TF_VERSION=0.12.4 +export TF_WARN_OUTPUT_ERRORS=1 +export TF_VAR_resource_group_location=eastus \ No newline at end of file diff --git a/infra/templates/az-svc-data-integration-mlw/README.md b/infra/templates/az-svc-data-integration-mlw/README.md new file mode 100644 index 00000000..f088af57 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/README.md @@ -0,0 +1,139 @@ +# Azure Application Services + +The `az-svc-data-integration-mlw` template is intended to be a reference for running a set of app services. + + +## Use-Case + +This particular template creates an Azure environment with a small set of fully managed microservices. + + +## Scenarios this template should avoid + +This template is an adequate solution where the service count is less than 10. For Azure customers interested with provisioning more than 10 services, we recommend using AKS. Reason being that with Kubernetes you can maximize cluster node CPU cores which helps minimize cloud resourcing costs. + +## Technical Design +Template design [specifications](docs/design/README.md). + +## Architecture +![Template Topology](docs/design/images/deployment-topology.jpg "Template Topology") + + +## Prerequisites + +1. Azure Subscription +2. An available Service Principal with API Permissions granted with Admin Consent within Azure app registration. The required Azure Active Directory Graph app role is `Application.ReadWrite.OwnedBy` + +![image](https://user-images.githubusercontent.com/7635865/71312782-d9b91800-23f4-11ea-80ee-cc646f1c74be.png) + +3. Terraform and Go are locally installed +4. Azure Storage Account is [setup](https://docs.microsoft.com/en-us/azure/terraform/terraform-backend) to store Terraform state +5. Set up your Local environment variables by creating a `.env` file that contains the following information: + +``` +ARM_SUBSCRIPTION_ID="" +ARM_CLIENT_ID="" +ARM_CLIENT_SECRET="" +ARM_TENANT_ID="" +ARM_ACCESS_KEY="" +TF_VAR_remote_state_account="" +TF_VAR_remote_state_container="" +``` + +## Cost + +Azure environment cost ballpark [estimate](https://azure.com/e/92b05a7cd1e646368ab74772e3122500). This is subject to change and is driven from the resource pricing tiers configured when the template is deployed. + +## Deployment Steps + +1. Execute the following commands to set up your local environment variables: + +*Note for Windows Users using WSL*: We recommend running dos2unix utility on the environment file via `dos2unix .env` prior to sourcing your environment variables to chop trailing newline and carriage return characters. + +```bash +# these commands setup all the environment variables needed to run this template +DOT_ENV= +export $(cat $DOT_ENV | xargs) +``` + +2. Execute the following command to configure your local Azure CLI. + +```bash +# This logs your local Azure CLI in using the configured service principal. +az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID +``` + +3. Navigate to the `terraform.tfvars` terraform file. Here's a sample of the terraform.tfvars file for this template. + +```HCL +resource_group_location = "centralus" +prefix = "test-services" + +# Targets that will be configured to also setup AuthN with Easy Auth +app_services = [ + { + app_name = "tf-test-svc-1" + image = null + app_settings = { + "one_sweet_app_setting" = "brilliant" + } + }, + { + app_name = "tf-test-svc-2" + image = null + app_settings = { + "another_sweet_svc_app_setting" = "ok" + } + } +] +``` + +4. Execute the following commands to set up your terraform workspace. + +```bash +# This configures terraform to leverage a remote backend that will help you and your +# team keep consistent state +terraform init -backend-config "storage_account_name=${TF_VAR_remote_state_account}" -backend-config "container_name=${TF_VAR_remote_state_container}" + +# This command configures terraform to use a workspace unique to you. This allows you to work +# without stepping over your teammate's deployments +TF_WORKSPACE="az-micro-svc-$USER" +terraform workspace new $TF_WORKSPACE || terraform workspace select $TF_WORKSPACE +``` + +5. Execute the following commands to orchestrate a deployment. + +```bash +# See what terraform will try to deploy without actually deploying +terraform plan + +# Execute a deployment +terraform apply +``` + +6. Optionally execute the following command to teardown your deployment and delete your resources. + +```bash +# Destroy resources and tear down deployment. Only do this if you want to destroy your deployment. +terraform destroy +``` + +## Automated Testing + +### Unit Testing + +Navigate to the template folder `infra/templates/az-svc-data-integration-mlw`. Unit tests can be run using the following command: + +``` +go test -v $(go list ./... | grep "unit") +``` + +### Integration Testing + +Please confirm that you've completed the `terraform apply` step before running the integration tests as we're validating the active terraform workspace. + +Integration tests can be run using the following command: + +``` +go test -v $(go list ./... | grep "integration") +``` \ No newline at end of file diff --git a/infra/templates/az-svc-data-integration-mlw/app.tf b/infra/templates/az-svc-data-integration-mlw/app.tf new file mode 100644 index 00000000..d1bc0530 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/app.tf @@ -0,0 +1,126 @@ +resource "azurerm_resource_group" "app_rg" { + name = local.app_rg_name + location = local.region +} + +# Note: this should be uncommented for production scenarios. It is commented +# to support a teardown after deployment for the CICD pipeline. +# resource "azurerm_management_lock" "app_rg_lock" { +# name = local.app_rg_lock +# scope = azurerm_resource_group.app_rg.id +# lock_level = "CanNotDelete" + +# lifecycle { +# prevent_destroy = true +# } +# } + +module "network" { + source = "../../modules/providers/azure/network" + vnet_name = local.vnet_name + resource_group_name = azurerm_resource_group.app_rg.name + address_space = var.address_space + subnets = local.subnets +} + +module "container_registry" { + source = "../../modules/providers/azure/container-registry" + container_registry_name = local.acr_name + resource_group_name = azurerm_resource_group.app_rg.name + container_registry_admin_enabled = false + // Note: only premium ACRs allow configuration of network access restrictions + container_registry_sku = var.container_registry_sku + subnet_id_whitelist = module.network.subnet_ids +} + +module "app_insights" { + source = "../../modules/providers/azure/app-insights" + service_plan_resource_group_name = azurerm_resource_group.app_rg.name + appinsights_name = local.ai_name + appinsights_application_type = "web" +} + + +module "func_app_service_plan" { + source = "../../modules/providers/azure/service-plan" + resource_group_name = azurerm_resource_group.app_rg.name + service_plan_name = local.func_app_sp_name + # scaling_rules = var.scaling_rules + service_plan_tier = var.func_app_service_plan_tier + service_plan_size = var.func_app_service_plan_size + service_plan_kind = var.func_app_service_plan_kind + service_plan_reserved = var.func_app_service_plan_reserved +} + + + + +module "app_monitoring" { + source = "../../modules/providers/azure/app-monitoring" + resource_group_name = azurerm_resource_group.app_rg.name + resource_ids = [module.func_app_service_plan.app_service_plan_id] + action_group_name = var.action_group_name + action_group_email_receiver = var.action_group_email_receiver + metric_alert_name = var.metric_alert_name + metric_alert_frequency = var.metric_alert_frequency + metric_alert_period = var.metric_alert_period + metric_alert_criteria_namespace = var.metric_alert_criteria_namespace + metric_alert_criteria_name = var.metric_alert_criteria_name + metric_alert_criteria_aggregation = var.metric_alert_criteria_aggregation + metric_alert_criteria_operator = var.metric_alert_criteria_operator + metric_alert_criteria_threshold = var.metric_alert_criteria_threshold + monitoring_dimension_values = var.monitoring_dimension_values +} + +resource "azurerm_resource_group" "mlw_rg" { + name = local.mlw_rg_name + location = local.region +} + +module "mlw_app_insights" { + source = "../../modules/providers/azure/app-insights" + service_plan_resource_group_name = azurerm_resource_group.mlw_rg.name + appinsights_name = local.mlw_ai_name + appinsights_application_type = "web" +} + +module "ml_workspace" { + source = "../../modules/providers/azure/ml-workspace" + name = local.mlw_name + resource_group_name = azurerm_resource_group.mlw_rg.name + application_insights_id = module.mlw_app_insights.id + key_vault_id = module.keyvault.keyvault_id + storage_account_id = module.sys_storage_account.id + sku_name = var.sku_name +} + +module "function_app" { + source = "../../modules/providers/azure/function-app" + fn_name_prefix = local.func_app_name_prefix + resource_group_name = azurerm_resource_group.app_rg.name + service_plan_id = module.func_app_service_plan.app_service_plan_id + storage_account_resource_group_name = module.sys_storage_account.resource_group_name + storage_account_name = module.sys_storage_account.name + vnet_subnet_id = module.network.subnet_ids[0] + fn_app_settings = local.func_app_settings + fn_app_config = var.fn_app_config +} + + +module "data_factory" { + source = "../../modules/providers/azure/data-factory" + data_factory_name = local.data_factory_name + resource_group_name = azurerm_resource_group.app_rg.name + data_factory_runtime_name = local.data_factory_runtime_name + number_of_nodes = var.adf_number_of_nodes + max_parallel_executions_per_node = var.adf_max_parallel_executions_per_node + vnet_integration = { + vnet_id = module.network.subnet_ids[0] + subnet_name = local.subnet_name + } + data_factory_pipeline_name = local.data_factory_pipeline_name + data_factory_trigger_name = local.data_factory_trigger_name + data_factory_trigger_interval = var.adf_trigger_interval + data_factory_trigger_frequency = var.adf_trigger_frequency +} + diff --git a/infra/templates/az-svc-data-integration-mlw/backend.tf b/infra/templates/az-svc-data-integration-mlw/backend.tf new file mode 100644 index 00000000..96627544 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/backend.tf @@ -0,0 +1,10 @@ +terraform { + backend "azurerm" { + key = "terraform.tfstate" + } +} + +provider "azurerm" { + version = "~>2.6.0" + features {} +} diff --git a/infra/templates/az-svc-data-integration-mlw/commons.tf b/infra/templates/az-svc-data-integration-mlw/commons.tf new file mode 100644 index 00000000..4137c63e --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/commons.tf @@ -0,0 +1,131 @@ +module "provider" { + source = "../../modules/providers/azure/provider" +} + +data "azurerm_subscription" "current" {} + +data "azurerm_client_config" "current" {} + +resource "random_string" "workspace_scope" { + keepers = { + # Generate a new id each time we switch to a new workspace or app id + ws_name = replace(trimspace(lower(terraform.workspace)), "_", "-") + app_id = replace(trimspace(lower(var.prefix)), "_", "-") + } + + length = max(1, var.randomization_level) // error for zero-length + special = false + upper = false +} + +locals { + // sanitize names + resource_prefix = replace(format("%s-%s", trimspace(lower(terraform.workspace)), random_string.workspace_scope.result), "_", "-") + app_id = random_string.workspace_scope.keepers.app_id + region = replace(trimspace(lower(var.resource_group_location)), "_", "-") + ws_name = random_string.workspace_scope.keepers.ws_name + suffix = var.randomization_level > 0 ? "-${random_string.workspace_scope.result}" : "" + base_storage_name = "${substr(replace(local.resource_prefix, "-", ""), 0, 10)}st" // storage account + sys_storage_name = "ml${local.base_storage_name}" //mlops storage account + app_storage_name = "dp${local.base_storage_name}" //dataprep storage account + + // base name for resources, name constraints documented here: https://docs.microsoft.com/en-us/azure/architecture/best-practices/naming-conventions + base_name = length(local.app_id) > 0 ? "${local.ws_name}${local.suffix}-${local.app_id}" : "${local.ws_name}${local.suffix}" + base_name_21 = length(local.base_name) < 22 ? local.base_name : "${substr(local.base_name, 0, 21 - length(local.suffix))}${local.suffix}" + base_name_46 = length(local.base_name) < 47 ? local.base_name : "${substr(local.base_name, 0, 46 - length(local.suffix))}${local.suffix}" + base_name_60 = length(local.base_name) < 61 ? local.base_name : "${substr(local.base_name, 0, 60 - length(local.suffix))}${local.suffix}" + base_name_70 = length(local.base_name) < 70 ? local.base_name : "${substr(local.base_name, 0, 70 - length(local.suffix))}${local.suffix}" + base_name_76 = length(local.base_name) < 77 ? local.base_name : "${substr(local.base_name, 0, 76 - length(local.suffix))}${local.suffix}" + base_name_83 = length(local.base_name) < 84 ? local.base_name : "${substr(local.base_name, 0, 83 - length(local.suffix))}${local.suffix}" + + tenant_id = data.azurerm_client_config.current.tenant_id + + // Resource names + app_rg_name = "${local.base_name_83}-app-rg" // app resource group (max 90 chars) + admin_rg_lock = "${local.base_name_83}-adm-rg-delete-lock" // management lock to prevent deletes + app_rg_lock = "${local.base_name_83}-app-rg-delete-lock" // management lock to prevent deletes + func_app_sp_name = "${local.base_name}-sp-fa" // service plan + ai_name = "${local.base_name}-ai" // app insights + mlw_ai_name = "${local.base_name}-mlw-ai" // ml app insights + ad_app_name = "${local.base_name}-ad-app" //service principal + ad_app_management_name = "${local.base_name}-ad-app-management" + graph_id = "00000003-0000-0000-c000-000000000000" // ID for Microsoft Graph API + graph_role_id = "e1fe6dd8-ba31-4d61-89e7-88639da4683d" // ID for User.Read API + kv_name = "${local.base_name_21}-kv" // key vault (max 24 chars) + acr_name = "${replace(local.base_name_46, "-", "")}acr" // container registry (max 50 chars, alphanumeric *only*) + vnet_name = "vnet-${local.base_name_60}" // virtual network (max 64 chars) + subnet_name = "snet-${local.base_name_76}" // subnet (max 76 chars) + function_subnet_name = "snet-func-${local.base_name_76}" // subnet (max 76 chars) + func_subnet_delegation_name = "${local.base_name_21}" // subnet (max 76 chars) + mlw_name = "${local.base_name_21}-mlw" // workspace (max 30 chars) + mlw_rg_name = "${local.base_name_83}-mlw-rg" // mlw resource group (max 90 chars) + public_pip_name = "${local.base_name_76}-ip" // public IP (max 80 chars) + svc_princ_name = "${local.base_name}-svc-principal" // service principal + acr_svc_princ_name = "${local.base_name}-acr-svc-principal" // container registry service principal + app_svc_name_prefix = local.base_name_21 + auth_svc_name_prefix = "${local.base_name_21}-au" + smpl_app_postfix = "app" + data_factory_name = "adf-cares-${local.base_name_46}" + data_factory_runtime_name = "adf-rt-cares-${local.base_name_46}" + data_factory_pipeline_name = "adf-pipeline-cares-${local.base_name_83}" + data_factory_trigger_name = "adf-trigger-cares-${local.base_name_83}" + func_app_name_prefix = "func-cares-${local.base_name_46}" // Function app name (Max 60 chars) + cosmos_account_name = "cosmos-cares-${local.base_name_21}" // Cosmos databse account name (max 44 chars) + cosmos_db_name = "cosmos-cares-db-${local.base_name_21}" // Cosmos databse account name (max 44 chars) + + app_service_global_config = { + aad_client_id = format(local.app_setting_kv_format, local.output_secret_map.aad-client-id) + appinsights_key = format(local.app_setting_kv_format, local.output_secret_map.appinsights-key) + smpl_app_endpoint = format("https://%s-%s.azurewebsites.net", local.auth_svc_name_prefix, lower(local.smpl_app_postfix)) + storage_account = module.sys_storage_account.name + storage_account_key = format(local.app_setting_kv_format, local.output_secret_map.sys-storage-account-key) + } + + mlw_service_global_config = { + mlw-appinsights-key = format(local.app_setting_kv_format, local.output_secret_map.mlw-appinsights-key) + storage_account = module.sys_storage_account.name + storage_account_key = format(local.app_setting_kv_format, local.output_secret_map.sys-storage-account-key) + } + + func_app_settings = { + clientId = format(local.app_setting_kv_format, local.output_secret_map.app-sp-username) + clientKey = format(local.app_setting_kv_format, local.output_secret_map.app-sp-password) + storageKey = format(local.app_setting_kv_format, local.output_secret_map.app-storage-account-key) + storageName = module.app_storage_account.name + tenantId = format(local.app_setting_kv_format, local.output_secret_map.app-sp-tenant-id) + statusPollingInterval = "" + waitUntil = "" + dataDriftContainer = module.app_storage_account.containers.acidatadriftdata.name + APPINSIGHTS_INSTRUMENTATIONKEY = format(local.app_setting_kv_format, local.output_secret_map.appinsights-key) + } + + subnets = [ + { + name = local.subnet_name + resource_group_name = azurerm_resource_group.app_rg.name + address_prefix = var.subnet_address_prefix + service_endpoints = var.subnet_service_endpoints + delegation = { + name = local.func_subnet_delegation_name + service_delegation = { + name = "Microsoft.Web/serverFarms" + actions = ["Microsoft.Network/virtualNetworks/subnets/action"] + } + } + }, + { + name = local.function_subnet_name + resource_group_name = azurerm_resource_group.app_rg.name + address_prefix = var.function_subnet_address_prefix + service_endpoints = var.func_subnet_service_endpoints + delegation = { + name = "" + service_delegation = { + name = "Microsoft.Web/serverFarms" + actions = ["Microsoft.Network/virtualNetworks/subnets/action"] + } + } + } + ] + +} diff --git a/infra/templates/az-svc-data-integration-mlw/docs/design/README.md b/infra/templates/az-svc-data-integration-mlw/docs/design/README.md new file mode 100644 index 00000000..fb75d02d --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/docs/design/README.md @@ -0,0 +1,236 @@ +# Technical Design + +This document contains the technical design specs for the Terraform template design and deployment for data integration service with machine learning workspace. + +## In Scope + +- Identify deployment topology +- Identify key Terraform templates needed for deployment +- Identify key Terraform modules needed for deployment +- Identify gaps in Terraform provider templates + +## Out of Scope + +- Template (Terraform, ARM) implementation +- Service Containerization + +## Deployment Topology + +This graphic shows the targeted deployment topology of this template. The deployment is deployed to a single tenant and subscription. The resources are partitioned to three resource groups to align with the different personas: + +- Resource Group 1: contains Application services related resources along with the common resources (i.e. KeyVault, app insights) +- Resource Group 2: Contains storage resources. The best practice is to separate storage resources (i.e. blob storage, SQL, CosmosDB) for protection from any accidental delete +- Resource Group 3: Contains machine learning related resources + +![Deployment Topology Diagram](images/deployment-topology.jpg) + +## Terraform Template Design + +This section shows the infrastructure design. It contains the Azure resources we need according to the architecture diagram. There are some modules that were implemented before and we can re-use them in this project that are shown in the diagram. Moreover, we identified the resources that we need to create modules for. + +## The Template Design Diagram + +The Diagram below outlines the topology of the terraform templates that will deploy the topology called out above. + +![Template Design Diagram](images/template-design.jpg) + +## Example Usage + +1. Set the path of your template directory +2. Call the terraform init, plan, apply commands to initialize the terraform deployment then write and apply the plan, + +## Template Inputs + +### General Inputs + +| name | type | default | description | +|---|---|---|---| +| `resource_group_location` | string | | The Azure region where all resources in this template should be created | +| `prefix` | string | | It serves as an identifier used to construct the names of all resources in this template +| `randomization_level` | number | | Number of additional random characters to include in resource names to insulate against unexpected resource name collisions | + + +### service_plan + +| name | type | default | description | +|---|---|---|---| +| `monitoring_dimension_values` | `["*"]` | | Dimensions used to determine service plan scaling | +| `service_plan_size` | string | S1 | The size of the service plan instance. Valid values are I1, I2, I3 | +| `service_plan_tier` | string | Standard | The tier under which the service plan is created. Details can be found at https://docs.microsoft.com/en-us/azure/app-service/overview-hosting-plans | +| `scaling_rules` | list | list | The scaling rules for the app service plan. Schema defined here: https://www.terraform.io/docs/providers/azurerm/r/monitor_autoscale_setting.html#rule. Note, the appropriate resource ID will be auto-inflated by the template | + +**Note:** Service plan name is auto generated within the template + + +### app-service + +| name | type | default | description | +|---|---|---|---| +| `app_service_settings` | list(object) | {} | Map of app settings that will be applied across all provisioned app services | +| `vnet_subnet_id` | string | | The vnet integration subnet gateway identifier | +| `auth_suffix` | string | | A name to be appended to all azure ad applications | + +### function + +| name | type | default | description | +|---|---|---|---| +| `app_services` | list(object) | | Descriptions of the app services to be deployed. Service level config settings can be provided with the required attribute app_settings | + +### app_monitoring + +- rule is a type defined [here](https://www.terraform.io/docs/providers/azurerm/r/monitor_autoscale_setting.html#rule) +- MetricsConfig is a complex map type that adheres to this schema: + +```hcl +list(map(object({ + action_group_name = string + action_group_email_receiver = string + metrics = list(map(object({ + metric_alert_name = string + metric_alert_frequency = string + metric_alert_period = string + metric_alert_criteria_namespace = string + metric_alert_criteria_name = string + metric_alert_criteria_aggregation = string + metric_alert_criteria_operator = string + metric_alert_criteria_threshold = string + }))) +}))) +``` + +### app_insight + +| name | type | default | description | +|---|---|---|---| +| `appinsights_application_type` | string | | Type of the App Insights Application. Valid values are ios for iOS, java for Java web, MobileCenter for App Center, Node.JS for Node.js, other for General, phone for Windows Phone, store for Windows Store and web for ASP.NET | + +### vnet + +| name | type | default | description | +|---|---|---|---| +| `address_space` | string | list(string) | The address space that is used the virtual network. You can supply more than one address space. Changing this forces a new resource to be created | +| `address_prefix` | list(list(string))| | The address prefix to use for the subnet | + +### keyvault + +| name | type | default | description | +|---|---|---|---| +| `keyvault_name` | string | | Name of the keyvault to create | + +### Keyvault_policy + +| name | type | default | description | +|---|---|---|---| +| `vault_id` | string | |Specifies the name of the Key Vault resource | +| `tenant_id` | string | |The Azure Active Directory tenant ID that should be used for authenticating requests to the key vault. Changing this forces a new resource to be created | +| `object_ids` | list(string) | |The object IDs of a user, service principal or security group in the Azure Active Directory tenant for the vault. The object ID must be unique for the list of access policies. Changing this forces a new resource to be created | + +### ml_workspace + +| name | type | default | description | +|---|---|---|---| +| `ml_workspace_sku_name` | string | "Enterprise" | Specifies the name of the Key Vault resource | + +### storage_account + +| name | type | default | description | +|---|---|---|---| +| `container_names` | list(string) | | The list of storage container names to create. Names must be unique per storage account | + +### container_registry + +| name | type | default | description | +|---|---|---|---| +| `container_registry_sku` | list(object) | "Standard" | The container registry SKU. ie. 'Standard' 'Premium'. | + +### data_factory + +| name | type | default | description | +|---|---|---|---| +| `adf_trigger_name` | string | | Specifies the name of the Data Factory Schedule Trigger. Changing this forces a new resource to be created. Must be globally unique | +| `pipeline_name ` | string | | The Data Factory Pipeline name that the trigger will act on | +| `interval` | number | 1 | The interval for how often the trigger occurs. This defaults to 1 | +| `frequency ` | string | "Minute" | The trigger freqency. Valid values include Minute, Hour, Day, Week, Month. Defaults to Minute. + +### private_endpoint + +| name | type | default | description | +|---|---|---|---| +| `private_connection_name` | string | | Specifies the Name of the Private Service Connection. Changing this forces a new resource to be created | +| `is_manual_connection` | boolean | false | Does the Private Endpoint require Manual Approval from the remote resource owner? Changing this forces a new resource to be created | +| `private_connection_resource_id ` | string | | The ID of the Private Link Enabled Remote Resource which this Private Endpoint should be connected to. Changing this forces a new resource to be created | + +## Template Output + +| name | type | description | +|---|---|---| +| `app_service_config` | map(string) | Map of app service name with their respective slot apps | +| `app_service_fqdns` | map(string) | Map of app service name to VNET accessible domain name | +| `app_service_names` | list(string) | List of provisioned app service names | +| `app_service_ids` | list(string) | The IDs of the app services provisioned | +| `azuread_app_ids` | list(string) | The AAD application object ids used for app service easy auth | +| `app_service_msi_object_ids` | list(string) | The app service System Assigned MSI object ids | +| `service_plan_name` | string | Service Plan Name | +| `service_plan_id` | string | Service Plan Resource ID | +| `resource_group` | string | Resource group name for the application specific resource group | +| `service_principal_application_id` | string | Service principal application ID | +| `key_vault_endpoint` | string | Key Vault endpoint | +| `blob_storage_endpoint` | string | Blob Storage endpoint | +| `sys_storage_account` | string | The name of the ml storage account | +| `sys_storage_account_id` | string | Resource Identifier of the ml storage account | +| `sys_storage_account_containers` | string | Map of the ml storage account containers | +| `app_storage_account_name` | string | Name of Storage Account | +| `app_storage_account_id` | string | Resource Identifier of the storage account | +| `app_storage_account_containers` | string | Map of storage account containers | +| `function_app_properties` | map(string) | Map of function app id and fqdn | +| `function_app_fqdns` | list(string) | The URLs of the app services created | +| `rule_resource_id` | string | The id of a metric alert rule | +| `container_registry_id` | string | The resource identifier of the container registry | +| `container_registry_name` | string | The name of the container registry. | +| `contributor_service_principal_id` | string | ID of the service principal with contributor access to provisioned resources | +| `ml_identity_principal_id` | list(string) | The id of the Azure Machine Learning service managed identity object id | +| `mlw_dev_resource_group` | string | Resource group name for the ML specific resources | +| `sql_fuuly_qualified_domain_name` | string | The fully qualified domain name of the Azure SQL Server (e.g. myServerName.database.windows.net) | +| `adf_id` | string | The ID of the Data Factory Schedule Trigger | +| `private_endpoint_id` | string | The ID of the Private Endpoint | +| `virtual_network_id` | string | The ID of the virtual network | + +## Customers/Persona + +- **Admin**: This persona represents an administrator of Azure. This persona does not implement the line of business applications but will help other teams deliver them. +- **App Developer Team**: This persona is responsible for creating and maintaining the line of business applications + +### Credentials Management + +Managed Identities (MI, or MSI) will be used to manage access to credentials when possible. This table identifies MSI support for each resource leveraged by the template (full compatability breakdown [here](https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/services-support-managed-identities)): + +| Azure Service | Supports MSI | Mitigation Strategy | +|---|---|---| +| App Service | Yes | N/A | +| Key Vault | Yes | N/A | +| Azure Functions | Yes | N/A | +| Blob Storage | Yes | N/A | +| Azure SQL | Yes | N/A | +| Azure Data Factory | Yes (System Assigned only) | N/A | +| Azure Container Registery | Yes | N/A| + + +### Risks + +- Ingress / Egress for app services, functions and storage endpoints are not restricted to virtual network(s) by default. In summary, by default these services are exposed to the public internet. + - Mitigation strategy: App Service VNET access restriction can be enabled by setting the `vnet_subnet_id` setting. We still need to support VNET restrictions for the functions and ML workspace modules. + +## Security + +Here is an overview of the security for the deployment strategy and templates discussed above: + +- **Role Assignments**: + +The service principal running the deployment will have to be an owner in the target subscription and granted admin consent to the `Application.ReadWrite.OwnedBy` role in Microsoft Graph. This template creates a new service principal that will be available for application developer team(s) to administer the provisioned Azure resources. The following role assignments will be made to that service principal: + - Contributor access to App Service & App Insights in the first Resource Group + - Contributor access to the second and third Resource Groups. *If needed, we can lock this down further by granting role access to individual resources in this RG.* +- **Service to Service communication**: For services owned by the application development team persona we will leverage Managed Service Identity (MSI) for authenticating to cloud services wherever possible. Where this is not possible, MSI will be used to pull credentials from Key Vault. This connection is done via MSI and therefore it keeps all secrets out of the codebase. This limits the attack vector of the infrastructure. [List of services that support MSI](https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/services-support-managed-identities) + +### Role Assignments + +//Add the role assignments for the project in this section diff --git a/infra/templates/az-svc-data-integration-mlw/docs/design/images/deployment-topology.drawio b/infra/templates/az-svc-data-integration-mlw/docs/design/images/deployment-topology.drawio new file mode 100644 index 00000000..16158e8b --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/docs/design/images/deployment-topology.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/infra/templates/az-svc-data-integration-mlw/docs/design/images/deployment-topology.jpg b/infra/templates/az-svc-data-integration-mlw/docs/design/images/deployment-topology.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9044721f1550ef61098c64ce0b6487fcb94791e2 GIT binary patch literal 138236 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

uhEnhfc_7lA$p?N>(WBDh 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 DXhu58 literal 0 HcmV?d00001 diff --git a/infra/templates/az-svc-data-integration-mlw/docs/design/images/template-design.drawio b/infra/templates/az-svc-data-integration-mlw/docs/design/images/template-design.drawio new file mode 100644 index 00000000..569b953f --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/docs/design/images/template-design.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/infra/templates/az-svc-data-integration-mlw/docs/design/images/template-design.jpg b/infra/templates/az-svc-data-integration-mlw/docs/design/images/template-design.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9ae4fa7db49bb6d5913a5dcba5aea083dff2855f GIT binary patch literal 132436 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 literal 0 HcmV?d00001 diff --git a/infra/templates/az-svc-data-integration-mlw/keyvault.tf b/infra/templates/az-svc-data-integration-mlw/keyvault.tf new file mode 100644 index 00000000..f22545fa --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/keyvault.tf @@ -0,0 +1,62 @@ +locals { + secrets_map = { + # App Insights Secrets + appinsights-key = module.app_insights.app_insights_instrumentation_key + mlw-appinsights-key = module.mlw_app_insights.app_insights_instrumentation_key + # Storage Account Secrets + sys-storage-account-key = module.sys_storage_account.primary_access_key + app-storage-account-key = module.app_storage_account.primary_access_key + app-sp-tenant-id = data.azurerm_client_config.current.tenant_id + # AAD Application Secrets + aad-client-id = module.ad_application.azuread_app_ids[0] + # Service Principal Secrets + app-sp-username = module.app_management_service_principal.service_principal_application_id + app-sp-password = module.app_management_service_principal.service_principal_password + # Cosmos Cluster Secrets + cosmos-endpoint = module.cosmosdb.properties.cosmosdb.endpoint + cosmos-primary-key = module.cosmosdb.properties.cosmosdb.primary_master_key + cosmos-connection = module.cosmosdb.properties.cosmosdb.connection_strings[0] + #Azure function App + function-app-key = "This will be updated in Azure DevOps pipline" + } + + output_secret_map = { + for secret in module.keyvault_secrets.keyvault_secret_attributes : + secret.name => secret.id + } + app_setting_kv_format = "@Microsoft.KeyVault(SecretUri=%s)" +} + +module "keyvault" { + source = "../../modules/providers/azure/keyvault" + keyvault_name = local.kv_name + resource_group_name = azurerm_resource_group.app_rg.name + subnet_id_whitelist = module.network.subnet_ids +} + +module "keyvault_secrets" { + source = "../../modules/providers/azure/keyvault-secret" + keyvault_id = module.keyvault.keyvault_id + secrets = local.secrets_map +} + + +module "function_app_keyvault_access_policy" { + source = "../../modules/providers/azure/keyvault-policy" + vault_id = module.keyvault.keyvault_id + tenant_id = module.function_app.function_app_identity_tenant_id + object_ids = module.function_app.function_app_identity_object_ids + key_permissions = ["get", "list"] + secret_permissions = ["get", "list"] + certificate_permissions = ["get", "list"] +} + +module "adf_keyvault_access_policy" { + source = "../../modules/providers/azure/keyvault-policy" + vault_id = module.keyvault.keyvault_id + tenant_id = module.data-factory.adf_identity_tenant_id + object_ids = [module.data-factory.adf_identity_principal_id] + key_permissions = ["get", "list"] + secret_permissions = ["get", "list"] + certificate_permissions = ["get", "list"] +} \ No newline at end of file diff --git a/infra/templates/az-svc-data-integration-mlw/output.tf b/infra/templates/az-svc-data-integration-mlw/output.tf new file mode 100644 index 00000000..6fc2ead5 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/output.tf @@ -0,0 +1,114 @@ +# output "fqdns" { +# value = [ +# for uri in concat(module.app_service.app_service_uris) : +# "http://${uri}" +# ] +# } + +# output "webapp_names" { +# value = concat(module.app_service.app_service_names) +# } + +output "app_insights_id" { + value = module.app_insights.app_insights_app_id +} + +output "service_plan_name" { + value = module.func_app_service_plan.service_plan_name +} + +output "service_plan_id" { + value = module.func_app_service_plan.app_service_plan_id +} + +output "app_dev_resource_group" { + value = azurerm_resource_group.app_rg.name +} + +output "keyvault_name" { + value = module.keyvault.keyvault_name +} + +output "keyvault_uri" { + value = module.keyvault.keyvault_uri +} + +output "keyvault_secret_attributes" { + description = "The properties of all provisioned keyvault secrets" + value = { + for secret in module.keyvault_secrets.keyvault_secret_attributes : + secret.name => { + id = secret.id + value = secret.value + version = secret.version + } + } + sensitive = true +} + +output "acr_name" { + value = module.container_registry.container_registry_name +} + +output "sys_storage_account" { + description = "The name of the ml storage account." + value = module.sys_storage_account.name +} + +output "sys_storage_account_id" { + description = "The resource identifier of the ml storage account." + value = module.sys_storage_account.id +} + +output "sys_storage_account_containers" { + description = "Map of ml storage account containers." + value = module.sys_storage_account.containers +} + +output "app_storage_account_name" { + description = "The name of the dataprep storage account." + value = module.app_storage_account.name +} + +output "app_storage_account_id" { + description = "The resource identifier of the dataprep storage account." + value = module.app_storage_account.id +} + +output "app_storage_account_containers" { + description = "Map of dataprep storage account containers." + value = module.app_storage_account.containers +} + +output "mlw_id" { + description = "The azure machine learning workspace ID." + value = module.ml_workspace.id +} + +output "mlw_dev_resource_group" { + value = azurerm_resource_group.mlw_rg.name +} + +output "data_factory_name" { + value = module.data-factory.data_factory_name +} + +output "azure_functionapp_name" { + value = module.function_app.azure_functionapp_name +} + +# This output is required for proper integration testing. +output "cosmosdb_resource_group_name" { + value = module.cosmosdb.resource_group_name +} + +# This output is required for proper integration testing. +output "cosmosdb_account_name" { + value = module.cosmosdb.account_name +} + +output "properties" { + description = "Properties of the deployed CosmosDB account." + value = module.cosmosdb.properties + sensitive = true +} \ No newline at end of file diff --git a/infra/templates/az-svc-data-integration-mlw/security.tf b/infra/templates/az-svc-data-integration-mlw/security.tf new file mode 100644 index 00000000..f97d45dc --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/security.tf @@ -0,0 +1,93 @@ +### +# This next block of Terraform configures the Service Principal +# that will be used by the application teams to deploy service +# code, configure and manage KeyVault secrets and manage App +# Service plans, among other things. +### + +locals { + rbac_contributor_scopes = concat( + # App services and the associated slots -- enables management of deployments, etc... + # Note: RBAC for slots is inherited and does not need to be configured separately + # module.app_service.app_service_ids, + + # The ML workspace Id + [module.ml_workspace.id], + + #The Function App Id + module.function_app.function_app_ids, + ) + + contributor_role_name = "Contributor" + storage_contributor_role_name = "Storage Blob Data Contributor" + +} + +module "ad_application" { + source = "../../modules/providers/azure/ad-application" + resource_access_type = "Scope" + ad_app_config = [ + { + app_name = local.ad_app_name + reply_urls = [] + } + ] + resource_app_id = local.graph_id + resource_role_id = local.graph_role_id +} + +module "app_management_service_principal" { + source = "../../modules/providers/azure/service-principal" + create_for_rbac = true + display_name = local.ad_app_management_name + role_name = "Contributor" + role_scopes = local.rbac_contributor_scopes +} + +# resource "azurerm_role_assignment" "aks_acr_pull" { +# role_definition_name = "AcrPull" +# principal_id = module.app_management_service_principal.service_principal_object_id +# scope = module.container_registry.container_registry_id +# } + +# Create a Role Assignment with Storage Blob Data Contributor role for Data Factory to access storage account +resource "azurerm_role_assignment" "adf_app_storage_role_ra" { + role_definition_name = local.storage_contributor_role_name + principal_id = module.data-factory.adf_identity_principal_id + scope = module.app_storage_account.id +} + +# Create a Role Assignment with Storage Blob Data Contributor role for Machine Learning to access storage account +resource "azurerm_role_assignment" "mlw_sys_storage_ra" { + role_definition_name = local.storage_contributor_role_name + principal_id = module.ml_workspace.mlw_identity_principal_id + scope = module.ml_workspace.id +} + +# Create a Role Assignment with Storage Blob Data Contributor role for Machine Learning to access storage account +resource "azurerm_role_assignment" "mlw_app_storage_ra" { + role_definition_name = local.storage_contributor_role_name + principal_id = module.ml_workspace.mlw_identity_principal_id + scope = module.app_storage_account.id +} + +# Create a Role Assignment with Contributor role for Machine Learning to access Container Registry +resource "azurerm_role_assignment" "mlw_acr_ra" { + scope = module.container_registry.container_registry_id + role_definition_name = local.contributor_role_name + principal_id = module.ml_workspace.mlw_identity_principal_id +} + +# Create a Role Assignment with Contributor role for Machine Learning to access Keyvault +resource "azurerm_role_assignment" "mlw_kv_ra" { + scope = module.keyvault.keyvault_id + role_definition_name = local.contributor_role_name + principal_id = module.ml_workspace.mlw_identity_principal_id +} + +# Create a Role Assignment with Contributor role for Machine Learning to access Application Insights +resource "azurerm_role_assignment" "mlw_ai_ra" { + scope = module.app_insights.id + role_definition_name = local.contributor_role_name + principal_id = module.ml_workspace.mlw_identity_principal_id +} \ No newline at end of file diff --git a/infra/templates/az-svc-data-integration-mlw/storage.tf b/infra/templates/az-svc-data-integration-mlw/storage.tf new file mode 100644 index 00000000..f53dcae2 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/storage.tf @@ -0,0 +1,63 @@ +locals { + collection_throughput = 40000 + db_throughput = 1000 + cosmos_databases = [{ + name = local.cosmos_db_name + throughput = local.db_throughput + }] + + cosmos_sql_collections = [{ + name = "scoring-data" + database_name = local.cosmos_db_name + partition_key_path = "/APPT_ID" + throughput = local.collection_throughput + }, + { + name = "scheduling-data" + database_name = local.cosmos_db_name + partition_key_path = "/id" + throughput = local.collection_throughput + }] +} + +module "sys_storage_account" { + source = "../../modules/providers/azure/storage-account" + name = local.sys_storage_name + resource_group_name = azurerm_resource_group.app_rg.name + container_names = var.sys_storage_containers +} + +module "app_storage_account" { + source = "../../modules/providers/azure/storage-account" + name = local.app_storage_name + resource_group_name = azurerm_resource_group.app_rg.name + container_names = var.app_storage_containers +} + +module "cosmosdb" { + source = "../../modules/providers/azure/cosmosdb" + account_name = local.cosmos_account_name + resource_group_name = azurerm_resource_group.app_rg.name + vnet_subnet_id = module.network.subnet_ids[0] + primary_replica_location = var.primary_replica_location + databases = local.cosmos_databases + sql_collections = local.cosmos_sql_collections +} + +# //storage for ADF data prep +# module "storage_account" "adf_dataprep_storage" { +# source = "../../modules/providers/azure/storage-account" + +# name = local.storage_name +# resource_group_name = azurerm_resource_group.app_rg.name +# container_names = var.storage_containers +# } + +# //storage for ML ops workspace +# module "storage_account" "ml_workspace_storage" { +# source = "../../modules/providers/azure/storage-account" + +# name = local.storage_name +# resource_group_name = azurerm_resource_group.app_rg.name +# container_names = var.storage_containers +# } diff --git a/infra/templates/az-svc-data-integration-mlw/terraform.tfvars b/infra/templates/az-svc-data-integration-mlw/terraform.tfvars new file mode 100644 index 00000000..f5ea4a78 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/terraform.tfvars @@ -0,0 +1,58 @@ +# Note: These values will impact the names of resources. If your deployment +# fails due to a resource name collision, consider using different values for +# the `name` variable or increasing the value for `randomization_level`. + +resource_group_location = "southcentralus" +prefix = "smpl" +randomization_level = 8 + + +app_services = [{ + app_name = "smpl" + app_command_line = null + image = null + linux_fx_version = "" + app_settings = { + service_domain_name = "contoso.com" + } +}] + +# Note: this is configured as such only to test IP Whitelists. This is a well +# known DNS address + + +sys_storage_containers = [] + +app_storage_containers = [ + "sample", + "acidatadriftdata", + "configuration", + "source", +] + +subnet_service_endpoints = [ + "Microsoft.Web", + "Microsoft.ContainerRegistry", + "Microsoft.Storage", + "Microsoft.KeyVault", + "Microsoft.AzureActiveDirectory", + "Microsoft.AzureCosmosDB", +] + +func_subnet_service_endpoints = [ + "Microsoft.Web", + "Microsoft.ContainerRegistry", + "Microsoft.Storage", + "Microsoft.KeyVault", + "Microsoft.AzureActiveDirectory" +] + +fn_app_config = { + "mlops-orchestrator" = { + image = "", + zip = "", + hash = "", + } +} + +primary_replica_location = "eastus2" \ No newline at end of file diff --git a/infra/templates/az-svc-data-integration-mlw/tests/integration/appservices.go b/infra/templates/az-svc-data-integration-mlw/tests/integration/appservices.go new file mode 100644 index 00000000..c6d6614d --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/tests/integration/appservices.go @@ -0,0 +1,52 @@ +package test + +import ( + "crypto/tls" + "strings" + "testing" + + httpClient "github.com/gruntwork-io/terratest/modules/http-helper" + "github.com/microsoft/cobalt/test-harness/terratest-extensions/modules/azure" + "github.com/microsoft/terratest-abstraction/integration" + "github.com/stretchr/testify/require" +) + +// Verifies that the provisioned webapp is properly configured. +func verifyAppServiceConfig(goTest *testing.T, output integration.TerraformOutput) { + resourceGroup := output["app_dev_resource_group"].(string) + + for _, appName := range output["webapp_names"].([]interface{}) { + appConfig := azure.WebAppSiteConfiguration(goTest, SubscriptionID, resourceGroup, appName.(string)) + linuxFxVersion := strings.Trim(*appConfig.LinuxFxVersion, "{}") + expectedLinuxFxVersion := "" + require.Equal(goTest, expectedLinuxFxVersion, linuxFxVersion) + } +} + +// Verifies that the provisioned webapp is properly configured. +func verifyAppServiceEndpointStatusCode(goTest *testing.T, output integration.TerraformOutput) { + for _, fqdn := range output["app_service_fqdns"].([]interface{}) { + require.True(goTest, httpGetRespondsWithCode(goTest, fqdn.(string), 401)) + } +} + +// Validates that the service responds with provided HTTP Code. +func httpGetRespondsWithCode(goTest *testing.T, url string, code int) bool { + + tlsConfig := tls.Config{} + statusCode, _, err := httpClient.HttpGetE(goTest, url, &tlsConfig) + if err != nil { + goTest.Fatal(err) + } + + return statusCode == code +} + +func arrayContains(arr []interface{}, str string) bool { + for _, a := range arr { + if a == str { + return true + } + } + return false +} diff --git a/infra/templates/az-svc-data-integration-mlw/tests/integration/integration_test.go b/infra/templates/az-svc-data-integration-mlw/tests/integration/integration_test.go new file mode 100644 index 00000000..55cbec60 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/tests/integration/integration_test.go @@ -0,0 +1,51 @@ +package test + +import ( + "os" + "testing" + + "github.com/gruntwork-io/terratest/modules/terraform" + cosmosdbIntegTests "github.com/microsoft/cobalt/infra/modules/providers/azure/cosmosdb/tests/integration" + datafactIntegTests "github.com/microsoft/cobalt/infra/modules/providers/azure/data-factory/tests/integration" + funcAppIntegTests "github.com/microsoft/cobalt/infra/modules/providers/azure/function-app/tests/integration" + mlWorkspaceTests "github.com/microsoft/cobalt/infra/modules/providers/azure/ml-workspace/tests/integration" + storageIntegTests "github.com/microsoft/cobalt/infra/modules/providers/azure/storage-account/tests/integration" + "github.com/microsoft/terratest-abstraction/integration" +) + +// SubscriptionID - +var SubscriptionID = os.Getenv("ARM_SUBSCRIPTION_ID") + +var tfOptions = &terraform.Options{ + TerraformDir: "../../", + BackendConfig: map[string]interface{}{ + "storage_account_name": os.Getenv("TF_VAR_remote_state_account"), + "container_name": os.Getenv("TF_VAR_remote_state_container"), + }, +} + +// Runs a suite of test assertions to validate that a provisioned set of app services +// are fully funtional. +func TestAppSvcPlanSingleRegion(t *testing.T) { + testFixture := integration.IntegrationTestFixture{ + GoTest: t, + TfOptions: tfOptions, + ExpectedTfOutputCount: 21, + TfOutputAssertions: []integration.TerraformOutputValidation{ + //verifyAppServiceConfig, + /* Now that we configured the services to run as Java containers via linux_fx_version, + we'll have to temporarily comment out the call to verifyAppServiceEndpointStatusCode... + The service(s) will be unresponsive until our Azure Pipeline deploys a jar + to the target app service. We'll remove the comment once our service CI/CD pipelines are in place. + verifyAppServiceEndpointStatusCode, + */ + storageIntegTests.InspectStorageAccount("sys_storage_account", "sys_storage_account_containers", "app_dev_resource_group"), + storageIntegTests.InspectStorageAccount("app_storage_account_name", "app_storage_account_containers", "app_dev_resource_group"), + mlWorkspaceTests.VerifyCreatedMLworkspace(SubscriptionID, "mlw_dev_resource_group", "mlw_id"), + datafactIntegTests.VerifyCreatedDataFactory(SubscriptionID, "app_dev_resource_group", "data_factory_name"), + funcAppIntegTests.VerifyCreatedFunctionApp(SubscriptionID, "azure_functionapp_name"), + cosmosdbIntegTests.VerifyProvisionedCosmosDBAccount(SubscriptionID, "cosmosdb_resource_group_name", "cosmosdb_account_name"), + }, + } + integration.RunIntegrationTests(&testFixture) +} diff --git a/infra/templates/az-svc-data-integration-mlw/tests/integration/service_principal.go b/infra/templates/az-svc-data-integration-mlw/tests/integration/service_principal.go new file mode 100644 index 00000000..11f543f2 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/tests/integration/service_principal.go @@ -0,0 +1,55 @@ +package test + +import ( + "testing" + + "github.com/microsoft/cobalt/test-harness/terratest-extensions/modules/azure" + "github.com/microsoft/terratest-abstraction/integration" + "github.com/stretchr/testify/require" +) + +// Verifies that the correct roles are assigned to the provisioned service principal +func verifyServicePrincipalRoleAssignments(t *testing.T, output integration.TerraformOutput) { + actual := getActualRoleAssignmentsMap(t, output) + expected := getExpectedRoleAssignmentsMap(output) + + // Note: there may be other role assignments added outside of this template. A good + // example of this is the role assignment that enables the services to create + // signed URLs for data that exists in storage accounts not managed by this + // template. + for k, v := range expected { + require.Equal(t, v, actual[k], "Expected role assignment is incorrect!") + } +} + +// Queries Azure for the role assignments of the provisioned SP and transforms them into +// a simple-to-consume map type. The returned map will have a key equal to a scope and +// a value equal to the role name +func getActualRoleAssignmentsMap(t *testing.T, output integration.TerraformOutput) map[string]string { + objectID := output["contributor_service_principal_id"].(string) + assignments := azure.ListRoleAssignments(t, SubscriptionID, objectID) + assignmentsMap := map[string]string{} + + for _, assignment := range *assignments { + scope := assignment.Properties.Scope + roleID := assignment.Properties.RoleDefinitionID + roleName := azure.RoleName(t, SubscriptionID, *roleID) + assignmentsMap[*scope] = roleName + } + + return assignmentsMap +} + +// Constructs the expected role assignments based off the Terraform output +func getExpectedRoleAssignmentsMap(output integration.TerraformOutput) map[string]string { + expectedAssignments := map[string]string{} + expectedAssignments[output["service_plan_id"].(string)] = "Contributor" + expectedAssignments[output["container_registry_id"].(string)] = "Contributor" + expectedAssignments[output["storage_account_id"].(string)] = "Storage Blob Data Contributor" + + for _, appID := range output["app_service_ids"].([]interface{}) { + expectedAssignments[appID.(string)] = "Contributor" + } + + return expectedAssignments +} diff --git a/infra/templates/az-svc-data-integration-mlw/tests/unit/appservice.go b/infra/templates/az-svc-data-integration-mlw/tests/unit/appservice.go new file mode 100644 index 00000000..5db9b6fc --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/tests/unit/appservice.go @@ -0,0 +1,36 @@ +package test + +import ( + "testing" + + "github.com/microsoft/terratest-abstraction/unit" +) + +func appendAppServiceTests(t *testing.T, description unit.ResourceDescription) { + + expectedAppServicePlan := asMap(t, `{ + "kind": "Linux", + "reserved": true, + "sku": [{ "capacity": 1, "size": "P3v2", "tier": "PremiumV2" }] + }`) + description["module.service_plan.azurerm_app_service_plan.svcplan"] = expectedAppServicePlan + + expectedAppService := asMap(t, `{ + "identity": [{ "type": "SystemAssigned" }], + "enabled": true, + "site_config": [{ + "always_on": true + }] + }`) + description["module.app_service.azurerm_app_service.appsvc[0]"] = expectedAppService + + expectedAppServiceSlot := asMap(t, `{ + "name": "staging", + "identity": [{ "type": "SystemAssigned" }], + "enabled": true, + "site_config": [{ + "always_on": true + }] + }`) + description["module.app_service.azurerm_app_service_slot.appsvc_staging_slot[0]"] = expectedAppServiceSlot +} diff --git a/infra/templates/az-svc-data-integration-mlw/tests/unit/autoscale.go b/infra/templates/az-svc-data-integration-mlw/tests/unit/autoscale.go new file mode 100644 index 00000000..57c423aa --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/tests/unit/autoscale.go @@ -0,0 +1,41 @@ +package test + +import ( + "testing" + + "github.com/microsoft/terratest-abstraction/unit" +) + +func appendAutoScaleTests(t *testing.T, description unit.ResourceDescription) { + v := asMap(t, `{ + "enabled": true, + "notification": [{ + "email": [{ + "send_to_subscription_administrator": true, + "send_to_subscription_co_administrator": true + }] + }], + "profile": [{ + "rule": [{ + "metric_trigger": [{ + "metric_name": "CpuPercentage", + "operator": "GreaterThan", + "statistic": "Average", + "threshold": 70, + "time_aggregation": "Average", + "time_grain": "PT1M", + "time_window": "PT5M" + }], + "scale_action": [{ + "cooldown": "PT10M", + "direction": "Increase", + "type": "ChangeCount", + "value": 1 + }] + }] + }] + }`) + + k := "module.service_plan.azurerm_monitor_autoscale_setting.app_service_auto_scale" + description[k] = v +} diff --git a/infra/templates/az-svc-data-integration-mlw/tests/unit/common.go b/infra/templates/az-svc-data-integration-mlw/tests/unit/common.go new file mode 100644 index 00000000..dac853cf --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/tests/unit/common.go @@ -0,0 +1,23 @@ +package test + +import ( + "encoding/json" + "strings" + "testing" + + "github.com/gruntwork-io/terratest/modules/random" +) + +// these are useful values used in many test +var region = "southcentralus" +var prefix = "smpl" + strings.ToLower(random.UniqueId()) +var workspace = "smpl-" + strings.ToLower(random.UniqueId()) + +// helper function to parse blocks of JSON into a generic Go map +func asMap(t *testing.T, jsonString string) map[string]interface{} { + var theMap map[string]interface{} + if err := json.Unmarshal([]byte(jsonString), &theMap); err != nil { + t.Fatal(err) + } + return theMap +} diff --git a/infra/templates/az-svc-data-integration-mlw/tests/unit/cosmosdb.go b/infra/templates/az-svc-data-integration-mlw/tests/unit/cosmosdb.go new file mode 100644 index 00000000..e6211ebb --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/tests/unit/cosmosdb.go @@ -0,0 +1,39 @@ +package test + +import ( + "testing" + + "github.com/microsoft/terratest-abstraction/unit" +) + +func appendCosmosDbTests(t *testing.T, description unit.ResourceDescription) { + + expectedcosmosdbsqlcontainercollection := asMap(t, `{ + "name" : "scoring-data", + "partition_key_path" : "/APPT_ID", + "throughput" : 40000 + }`) + description["module.cosmosdb.azurerm_cosmosdb_sql_container.cosmos_collections[0]"] = expectedcosmosdbsqlcontainercollection + + expectedschedulingcollection := asMap(t, `{ + "name" : "scheduling-data", + "partition_key_path" : "/id", + "throughput" : 40000 + }`) + description["module.cosmosdb.azurerm_cosmosdb_sql_container.cosmos_collections[1]"] = expectedschedulingcollection + + expectedcosmosdbaccount := asMap(t, `{ + "enable_automatic_failover" : false, + "enable_multiple_write_locations" : false, + "is_virtual_network_filter_enabled" : true, + "kind" : "GlobalDocumentDB", + "offer_type" : "Standard" + }`) + description["module.cosmosdb.azurerm_cosmosdb_account.main"] = expectedcosmosdbaccount + + expectedcosmosdbsqldatabase := asMap(t, `{ + "throughput" : 1000 + }`) + description["module.cosmosdb.azurerm_cosmosdb_sql_database.cosmos_dbs[0]"] = expectedcosmosdbsqldatabase + +} diff --git a/infra/templates/az-svc-data-integration-mlw/tests/unit/datafactory.go b/infra/templates/az-svc-data-integration-mlw/tests/unit/datafactory.go new file mode 100644 index 00000000..e347d8bf --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/tests/unit/datafactory.go @@ -0,0 +1,15 @@ +package test + +import ( + "testing" + + "github.com/microsoft/terratest-abstraction/unit" +) + +func appendDataFactoryTests(t *testing.T, description unit.ResourceDescription) { + + expectedDatafactoryApp := asMap(t, `{ + "identity": [{ "type": "SystemAssigned" }] + }`) + description["module.data-factory.azurerm_data_factory.main"] = expectedDatafactoryApp +} diff --git a/infra/templates/az-svc-data-integration-mlw/tests/unit/functionapp.go b/infra/templates/az-svc-data-integration-mlw/tests/unit/functionapp.go new file mode 100644 index 00000000..b220e428 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/tests/unit/functionapp.go @@ -0,0 +1,19 @@ +package test + +import ( + "testing" + + "github.com/microsoft/terratest-abstraction/unit" +) + +func appendFunctionAppTests(t *testing.T, description unit.ResourceDescription) { + + expectedFunctionApp := asMap(t, `{ + "enable_builtin_logging": true, + "enabled": true, + "https_only": false, + "version": "~3" + }`) + + description["module.function_app.azurerm_function_app.main[0]"] = expectedFunctionApp +} diff --git a/infra/templates/az-svc-data-integration-mlw/tests/unit/keyvault.go b/infra/templates/az-svc-data-integration-mlw/tests/unit/keyvault.go new file mode 100644 index 00000000..13f93bf0 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/tests/unit/keyvault.go @@ -0,0 +1,58 @@ +package test + +import ( + "fmt" + "sort" + "testing" + + "github.com/microsoft/terratest-abstraction/unit" +) + +func appendKeyVaultTests(t *testing.T, description unit.ResourceDescription) { + kvBasicExpectations(t, description) + //kvAccessPolicyExpectations(t, description) + kvSecretExpectations(t, description) +} + +func kvBasicExpectations(t *testing.T, description unit.ResourceDescription) { + k1 := "module.keyvault.azurerm_key_vault.keyvault" + e1 := asMap(t, `{ + "sku_name": "standard" + }`) + description[k1] = e1 +} + +func kvSecretExpectations(t *testing.T, description unit.ResourceDescription) { + expectedKeys := []string{ + "appinsights-key", + "mlw-appinsights-key", + "sys-storage-account-key", + "app-storage-account-key", + "app-sp-tenant-id", + "aad-client-id", + "app-sp-username", + "app-sp-password", + "cosmos-endpoint", + "cosmos-primary-key", + "cosmos-connection", + "function-app-key", + } + + // The unit test fixture will expect these secrets to match ordinals returned by terraform, which sorts by name + sort.Strings(expectedKeys) + for index, value := range expectedKeys { + key := fmt.Sprintf("module.keyvault_secrets.azurerm_key_vault_secret.secret[%v]", index) + val := asMap(t, fmt.Sprintf(`{"name": "%s"}`, value)) + description[key] = val + } +} + +func kvAccessPolicyExpectations(t *testing.T, description unit.ResourceDescription) { + e1 := asMap(t, `{ + "certificate_permissions": ["get", "list"], + "secret_permissions": ["get", "list"], + "key_permissions": ["get", "list"] + }`) + k1 := "module.app_service_keyvault_access_policy.azurerm_key_vault_access_policy.keyvault[0]" + description[k1] = e1 +} diff --git a/infra/templates/az-svc-data-integration-mlw/tests/unit/mlworkspace.go b/infra/templates/az-svc-data-integration-mlw/tests/unit/mlworkspace.go new file mode 100644 index 00000000..4ce5c6f4 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/tests/unit/mlworkspace.go @@ -0,0 +1,17 @@ +package test + +import ( + "testing" + + "github.com/microsoft/terratest-abstraction/unit" +) + +func appendMLWorkspaceTests(t *testing.T, description unit.ResourceDescription) { + + expectedMLWorkspaceResult := map[string]interface{}{ + "name": "demo0012", + "resource_group_name": "azmltest", + "sku_name": "Enterprise", + } + description["module.ml_workspace.azurerm_machine_learning_workspace.mlworkspace"] = expectedMLWorkspaceResult +} diff --git a/infra/templates/az-svc-data-integration-mlw/tests/unit/storage.go b/infra/templates/az-svc-data-integration-mlw/tests/unit/storage.go new file mode 100644 index 00000000..2d342496 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/tests/unit/storage.go @@ -0,0 +1,30 @@ +package test + +import ( + "testing" + + "github.com/microsoft/terratest-abstraction/unit" +) + +func appendStorageTests(t *testing.T, description unit.ResourceDescription) { + + expectedStorageAccount := asMap(t, `{ + "account_kind": "StorageV2", + "account_replication_type": "LRS", + "account_tier": "Standard" + }`) + description["module.sys_storage_account.azurerm_storage_account.main"] = expectedStorageAccount + + expectedDataPrepStorageAccount := asMap(t, `{ + "account_kind": "StorageV2", + "account_replication_type": "LRS", + "account_tier": "Standard" + }`) + description["module.app_storage_account.azurerm_storage_account.main"] = expectedDataPrepStorageAccount + + expectedDataPrepStorageContainerList := asMap(t, `{ + "container_access_type":"private", + "name": "sample" + }`) + description["module.app_storage_account.azurerm_storage_container.main[0]"] = expectedDataPrepStorageContainerList +} diff --git a/infra/templates/az-svc-data-integration-mlw/tests/unit/unit_test.go b/infra/templates/az-svc-data-integration-mlw/tests/unit/unit_test.go new file mode 100644 index 00000000..b96566c7 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/tests/unit/unit_test.go @@ -0,0 +1,74 @@ +package test + +import ( + "os" + "testing" + + "github.com/gruntwork-io/terratest/modules/terraform" + "github.com/microsoft/terratest-abstraction/unit" +) + +var tfOptions = &terraform.Options{ + TerraformDir: "../../", + Upgrade: true, + Vars: map[string]interface{}{ + "resource_group_location": region, + "prefix": prefix, + "app_services": []interface{}{ + map[string]interface{}{ + "app_name": "smpl", + "image": *new(string), + "app_command_line": *new(string), + "linux_fx_version": *new(string), + "app_settings": make(map[string]string, 0), + }, + }, + }, + BackendConfig: map[string]interface{}{ + "storage_account_name": os.Getenv("TF_VAR_remote_state_account"), + "container_name": os.Getenv("TF_VAR_remote_state_container"), + }, +} + +func TestTemplate(t *testing.T) { + expectedAppDevResourceGroup := asMap(t, `{ + "location": "`+region+`" + }`) + + expectedMlDevResourceGroup := asMap(t, `{ + "location": "`+region+`" + }`) + + expectedAppInsights := asMap(t, `{ + "application_type": "web" + }`) + + resourceDescription := unit.ResourceDescription{ + "azurerm_resource_group.app_rg": expectedAppDevResourceGroup, + "module.app_insights.azurerm_application_insights.appinsights": expectedAppInsights, + } + + resourceWorkspaceDescription := unit.ResourceDescription{ + "azurerm_resource_group.mlw_rg": expectedMlDevResourceGroup, + "module.app_insights.azurerm_application_insights.appinsights": expectedAppInsights, + } + + //appendAutoScaleTests(t, resourceDescription) + appendKeyVaultTests(t, resourceDescription) + appendStorageTests(t, resourceDescription) + appendMLWorkspaceTests(t, resourceWorkspaceDescription) + appendDataFactoryTests(t, resourceDescription) + appendFunctionAppTests(t, resourceDescription) + appendCosmosDbTests(t, resourceDescription) + + testFixture := unit.UnitTestFixture{ + GoTest: t, + TfOptions: tfOptions, + Workspace: workspace, + PlanAssertions: nil, + ExpectedResourceCount: 81, + ExpectedResourceAttributeValues: resourceDescription, + } + + unit.RunUnitTests(&testFixture) +} diff --git a/infra/templates/az-svc-data-integration-mlw/variables.tf b/infra/templates/az-svc-data-integration-mlw/variables.tf new file mode 100644 index 00000000..7ee8d973 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/variables.tf @@ -0,0 +1,286 @@ +// ---- General Configuration ---- +variable "prefix" { + description = "An identifier used to construct the names of all resources in this template." + type = string +} + +variable "randomization_level" { + description = "Number of additional random characters to include in resource names to insulate against unexpected resource name collisions." + type = number + default = 8 +} + +variable "resource_group_location" { + description = "The Azure region where all resources in this template should be created." + type = string +} + +variable "app_service_settings" { + description = "Map of app settings that will be applied across all provisioned app services." + type = map(string) + default = {} +} + +variable "app_services" { + description = "Metadata about the app services to be created." + type = list(object({ + app_name = string + image = string + linux_fx_version = string + app_command_line = string + app_settings = map(string) + })) +} + +// ---- App Service Environment Configuration ---- +variable "ase_name" { + description = "The name of the App Service Environment in which to deploy the app" + type = string + default = "" +} + +variable "address_space" { + description = "The address space that is used the virtual network. You can supply more than one address space. Changing this forces a new resource to be created" + type = list(string) + default = ["10.2.0.0/16"] +} + + +variable "subnet_address_prefix" { + description = "The subnet address prefix to use for the subnet" + type = string + default = "10.2.1.0/24" +} + +variable "function_subnet_address_prefix" { + description = "The subnet address prefix to use for the subnet" + type = string + default = "10.2.2.0/24" +} + +variable "subnet_service_endpoints" { + description = "A list of the service endpoints for the subnet" + type = list(string) + default = ["Microsoft.Web", "Microsoft.ContainerRegistry", "Microsoft.AzureCosmosDB"] +} + + +variable "func_subnet_service_endpoints" { + description = "A list of the service endpoints for the subnet" + type = list(string) + default = ["Microsoft.Web", "Microsoft.ContainerRegistry"] +} + +variable "container_registry_sku" { + description = "(Optional) The SKU name of the the container registry. Possible values are Basic, Standard and Premium." + type = string + default = "Premium" +} + + +// ----Function App Service Plan Configuration ---- + +variable "monitoring_dimension_values" { + description = "Dimensions used to determine service plan scaling" + type = list(string) + default = ["*"] +} + +variable "func_app_service_plan_kind" { + description = "The kind of Service Plan to be created. Possible values are Windows/Linux/FunctionApp/App" + type = string + default = "FunctionApp" +} + + +variable "scaling_rules" { + description = "The scaling rules for the app service plan. Schema defined here: https://www.terraform.io/docs/providers/azurerm/r/monitor_autoscale_setting.html#rule. Note, the appropriate resource ID will be auto-inflated by the template" + type = list(object({ + metric_trigger = object({ + metric_name = string + time_grain = string + statistic = string + time_window = string + time_aggregation = string + operator = string + threshold = number + }) + scale_action = object({ + direction = string + type = string + cooldown = string + value = number + }) + })) + default = [ + { + metric_trigger = { + metric_name = "CpuPercentage" + time_grain = "PT1M" + statistic = "Average" + time_window = "PT5M" + time_aggregation = "Average" + operator = "GreaterThan" + threshold = 70 + } + scale_action = { + direction = "Increase" + type = "ChangeCount" + value = 1 + cooldown = "PT10M" + } + } + ] +} + +variable "func_app_service_plan_size" { + description = "The size of the service plan instance." + type = string + default = "Y1" +} + +variable "func_app_service_plan_tier" { + description = "The tier under which the service plan is created." + type = string + default = "Dynamic" +} + +variable "func_app_service_plan_reserved" { + description = "Is the Service Plan to be created reserved. Possible values are true/false" + type = bool + default = true +} + +// ----Function App Service Plan Configuration Ends---- + +variable "sys_storage_containers" { + description = "The list of storage container names to create. Names must be unique per storage account." + type = list(string) +} + +variable "app_storage_containers" { + description = "The list of storage container names to create. Names must be unique per storage account." + type = list(string) +} + + +// ---- ML Workspace Configuration ---- + +variable "sku_name" { + description = "SKU/edition of the Machine Learning Workspace" + type = string + default = "Enterprise" +} + +// ---- Monitoring Service Configuration ---- + +variable "action_group_name" { + description = "The name of the action group." + type = string + default = "Simple Default Action Group" +} + +variable "action_group_email_receiver" { + description = "The e-mail receiver for an alert rule resource." + type = string + default = "" +} + +variable "metric_alert_name" { + description = "The display name of a group of metric alert criteria." + type = string + default = "smpl Metric Alerts" +} + +variable "metric_alert_frequency" { + description = "The frequency with which the metric alert checks if the conditions are met." + type = string + default = "PT1M" +} + +variable "metric_alert_period" { + description = "The look back window over which metric values are checked. Value must be greater than 'frequency'." + type = string + default = "PT5M" +} + +variable "metric_alert_criteria_namespace" { + description = "A monitored resource namespace with configurable metric alert criteria." + type = string + default = "Microsoft.Web/serverfarms" +} + +variable "metric_alert_criteria_name" { + description = "A predefined Azure resource alert monitoring rule name." + type = string + default = "CpuPercentage" +} + +variable "metric_alert_criteria_aggregation" { + description = "The calculation used for building metric alert criteria." + type = string + default = "Average" +} + +variable "metric_alert_criteria_operator" { + description = "A logical operator used for building metric alert criteria." + type = string + default = "GreaterThan" +} + +variable "metric_alert_criteria_threshold" { + description = "The criteria threshold value that activates the metric alert." + type = number + default = 50 +} + +// ---- Function App Service Configuration ---- + +variable "fn_name_prefix" { + description = "The function app prefix name" + type = string + default = "smpl-test" +} + +variable "fn_app_config" { + description = "Metadata about the app services to be created" + type = map(object({ + image = string, + zip = string, + hash = string + })) + default = {} +} + +// ---- Azure Data Factory Configuration ---- + +variable "adf_number_of_nodes" { + description = "Number of nodes for the Managed Integration Runtime. Max is 10. Defaults to 1." + type = number + default = 1 +} + +variable "adf_max_parallel_executions_per_node" { + description = " Defines the maximum parallel executions per node. Defaults to 1. Max is 16." + type = number + default = 1 +} + +variable "adf_trigger_interval" { + description = "The interval for how often the trigger occurs. This defaults to 1." + type = number + default = 1 +} + +variable "adf_trigger_frequency" { + description = "The trigger freqency. Valid values include Minute, Hour, Day, Week, Month. Defaults to Minute." + type = string + default = "Minute" +} + + +// ---- Cosmos Database Configuration ---- +variable "primary_replica_location" { + description = "The primary replica location for the cosmos database" + type = string +} diff --git a/infra/templates/az-svc-data-integration-mlw/version.tf b/infra/templates/az-svc-data-integration-mlw/version.tf new file mode 100644 index 00000000..d9b6f790 --- /dev/null +++ b/infra/templates/az-svc-data-integration-mlw/version.tf @@ -0,0 +1,3 @@ +terraform { + required_version = ">= 0.12" +}