diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..8d7a895 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @kentik/bd diff --git a/README.md b/README.md index ae70ec0..fbd185e 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ #### Single VPC, Single Region * [single-vpc](https://github.com/kentik/config-snippets-cloud/tree/master/cloud_AWS/terraform/module/examples/single-vpc) #### All VPC, Single Region -* [all-vpc-from-region](https://github.com/kentik/config-snippets-cloud/tree/master/cloud_AWS/terraform/module/examples/all-vpc-from-region) +* [all-vpc-from-region](https://github.com/kentik/config-snippets-cloud/tree/master/cloud_AWS/terraform/module/examples/all-vpc-from-region) #### Deploy Sock Shop as an example micro-service architecture * [sock-shop-eks](https://github.com/kentik/config-snippets-cloud/tree/master/cloud_AWS/terraform/module/examples/sock-shop-eks) @@ -28,8 +28,6 @@ # Stage 2 - Automate GCP ## Terraform * [Terraform](https://github.com/kentik/config-snippets-cloud/tree/master/cloud_GCP/terraform) -### Demo -* [Terraform Demo](https://github.com/kentik/config-snippets-cloud/tree/master/cloud_GCP/terraform/module/demo) (TODO) ### Examples #### Subnet-list, Single region * [subnet-list](https://github.com/kentik/config-snippets-cloud/tree/master/cloud_GCP/terraform/module/examples/subnet-list) @@ -38,17 +36,13 @@ ## Ansible * [Ansible](https://github.com/kentik/config-snippets-cloud/tree/master/cloud_GCP/terraform) -### Demo -* [Ansible Demo](https://github.com/kentik/config-snippets-cloud/tree/master/cloud_GCP/terraform/module/demo)(TODO) # Stage 3 - Automate Azure ## Terraform * [Tearraform](https://github.com/kentik/config-snippets-cloud/tree/master/cloud_Azure/terraform) -### Demo -* [Terraform Demo](https://github.com/kentik/config-snippets-cloud/tree/master/cloud_Azure/terraform/module/demo) (TODO) ### Examples -#### Subnet-list, Single region -* [all_nsg](https://github.com/kentik/config-snippets-cloud/tree/master/cloud_Azure/terraform/module/examples/all_nsg) +#### All Virtual Networks from multiple Resource Groups +* [single_account_multiple_resource_groups](https://github.com/kentik/config-snippets-cloud/tree/master/cloud_Azure/terraform/module/examples/single_account_multiple_resource_groups) ## Ansible * [Ansible](cloud_Azure/ansible/roles/kentik_az) @@ -56,9 +50,6 @@ #### All NSG from resource group * [all_nsg](cloud_Azure/ansible/examples/all_nsg) -# Stage 4 - Automate IBM Cloud -## Timing TBD - # General needs for automation ## Identity and Access Management ## Creation of Storage location diff --git a/cloud_Azure/terraform/module/README.md b/cloud_Azure/terraform/module/README.md index 9b12a38..dc9b7de 100644 --- a/cloud_Azure/terraform/module/README.md +++ b/cloud_Azure/terraform/module/README.md @@ -3,23 +3,23 @@ Module supporting management of Azure and Kentik resources required for flow log export from Azure to Kentik. Module enables: -* Flow logs in all Network Security Groups (NSG) found in requested Resource Groups +* Flow logs in all Virtual Networks (VNets) found in requested Resource Groups Module creates: -* Service Principal for Kentik NSG Flow Exporter application +* Service Principal for Kentik VNet Flow Exporter application * Reader and Contributor Roles for above mentioned Service Principal * One Storage Account for flow logs per requested Resource Group * Registers flow in Kentik platform per requested Resource Group All resources created in Azure are tagged, see variable "resource_tag" in [variables.tf](./variables.tf) -Module assumes that NetworkWatcher resource exists in NetworkWatcherRG resource group in specified Azure location (see variable "location" in [variables.tf](./variables.tf)). -For example, in location "eastus" there should be "NetworkWatcher_eastus" in "NetworkWatcherRG" resource group. +Module assumes that NetworkWatcher resource exists in NetworkWatcherRG resource group in specified Azure location (see variable "location" in [variables.tf](./variables.tf)). +For example, in location "eastus" there should be "NetworkWatcher_eastus" in "NetworkWatcherRG" resource group. NetworkWatcher is automatically created by Azure when VirtualNetwork is created or updated, [as per documentation.](https://docs.microsoft.com/en-us/azure/network-watcher/network-watcher-create). This happens eg. when launching a new virtual machine. ## Usage examples -* [All Network Security Groups in requested Resource Groups in single Azure Account](examples/single_account_multiple_resource_groups) +* [All Virtual Networks in requested Resource Groups in single Azure Account](examples/single_account_multiple_resource_groups) * [All Network Security Groups in requested Resource Groups in multiple Azure Accounts](examples/multiple_accounts_multiple_resource_group) ## Requirements @@ -40,27 +40,6 @@ NetworkWatcher is automatically created by Azure when VirtualNetwork is created | null | >= 2.1.2 | | external | >= 2.0.0 | -## Python and dependencies - -This module uses Python script to list all Network Security Groups in specified Resource Groups and exposes the list to Terraform as external data source. -To install Python and required packages: -* [Install Python and PIP](https://docs.python.org/3/using/index.html) -* Install packages - in module directory, execute: - PowerShell: - ```powershell - pip install virtualenv - virtualenv venv - .\venv\Scripts\activate - pip install -r requirements.txt - ``` - - or Bash: - ```bash - pip install virtualenv - virtualenv venv - source venv/bin/activate - pip install -r requirements.txt - ``` ## Inputs | Name | Description | Type | Default | Required | @@ -71,20 +50,20 @@ To install Python and required packages: | email | Kentik account email | `string` | none | yes | | token | Kentik account token | `string` | none | yes | | plan_id | Kentik billing plan ID | `string` | none | yes | -| name | Cloudexport entry name in Kentik | `string` | none | yes | +| name | Cloudexport entry name in Kentik will be appended with: resource_group_names and subscription_id to ensure uniqueness | `string` | none | yes | | enabled | Defines if cloud export to Kentik is enabled | `bool` | true | no | | description | Cloudexport entry description in Kentik | `string` | `Created using Terraform` | no | | resource_tag | Azure Tag value to apply to created resources | `string` | `flow_log_exporter` | no | -| flow_exporter_application_id | Kentik NSG Flow Exporter application ID | `string` | `a20ce222-63c0-46db-86d5-58551eeee89f` | no | -| storage_account_names | Names of Storage Accounts for storing flow logs. Names must meet Azure Storage Account naming restrictions.
The list should either contain 1 Storage Account name for each Resource Group, or be empty, in which case names will be generated automatically. | `list of strings` | `[]` | no | +| flow_exporter_application_id | Kentik VNet Flow Exporter application ID | `string` | `a20ce222-63c0-46db-86d5-58551eeee89f` | no | +| storage_account_names | Names of Storage Accounts to be created for storing flow logs. Names must meet Azure Storage Account naming restrictions.
The list should either contain 1 Storage Account name for each Resource Group, or be empty, in which case names will be generated automatically. Auto-generated names will use the first 12 characters of the `var.name` for the Cloudexport as a prefix appended with a random id of 12 characters for global uniqueness. | `list of strings` | `[]` | no | ## Outputs | Name | Description | |------|-------------| -| network_security_groups | Id's of the Network Security Groups which flow logs will be collected | +| vnet_ids | Id's of the Virtual Networks which to collect flow logs | | subscription_id | Azure subscription ID | | resource_group_names | Names of Resource Groups from which to collect flow logs | | storage_accounts | Storage Account names where flow logs will be collected | -| principal_id | Service Principal ID created for Kentik NSG Flow Exporter application | +| principal_id | Service Principal ID created for Kentik VNet Flow Exporter application | diff --git a/cloud_Azure/terraform/module/cloudexport.tf b/cloud_Azure/terraform/module/cloudexport.tf index c531284..8b8ef73 100644 --- a/cloud_Azure/terraform/module/cloudexport.tf +++ b/cloud_Azure/terraform/module/cloudexport.tf @@ -14,9 +14,9 @@ provider "kentik-cloudexport" { # Creates one Kentik CloudExport for every requested Resource Group resource "kentik-cloudexport_item" "azure_export" { - count = length(var.resource_group_names) + for_each = { for rg in var.resource_group_names : rg => rg } - name = "${var.name}-${var.resource_group_names[count.index]}-${var.subscription_id}" # resource group name + subscription id make the name unique + name = "${var.name}-${each.key}-${var.subscription_id}" # resource group name + subscription id make the name unique type = "CLOUD_EXPORT_TYPE_KENTIK_MANAGED" enabled = var.enabled description = var.description @@ -25,8 +25,8 @@ resource "kentik-cloudexport_item" "azure_export" { azure { subscription_id = var.subscription_id location = var.location - resource_group = var.resource_group_names[count.index] - storage_account = azurerm_storage_account.logs_storage_account[count.index].name # storage accounts are mapped to resource groups 1:1 + resource_group = each.key + storage_account = azurerm_storage_account.logs_storage_account[each.key].name # storage accounts are mapped to resource groups 1:1 security_principal_enabled = true } -} \ No newline at end of file +} diff --git a/cloud_Azure/terraform/module/examples/single_account_multiple_resource_groups/README.md b/cloud_Azure/terraform/module/examples/single_account_multiple_resource_groups/README.md index d724701..9113486 100644 --- a/cloud_Azure/terraform/module/examples/single_account_multiple_resource_groups/README.md +++ b/cloud_Azure/terraform/module/examples/single_account_multiple_resource_groups/README.md @@ -15,7 +15,7 @@ None. location = "eastus" resource_group_names = ["resource-group-1", "resource-group-2", "resource-group-3"] # groups must exist in selected location storage_account_names = [] - + # Kentik email = "dummy@test.mail" token = "dummy_token" @@ -29,8 +29,6 @@ None. 1. Execute: ```bash - virtualenv venv && source venv/bin/activate - pip install -r ../../requirements.txt terraform init ``` diff --git a/cloud_Azure/terraform/module/examples/single_account_multiple_resource_groups/main.tf b/cloud_Azure/terraform/module/examples/single_account_multiple_resource_groups/main.tf index c96cc1b..725f162 100644 --- a/cloud_Azure/terraform/module/examples/single_account_multiple_resource_groups/main.tf +++ b/cloud_Azure/terraform/module/examples/single_account_multiple_resource_groups/main.tf @@ -3,11 +3,11 @@ terraform { required_providers { azurerm = { source = "hashicorp/azurerm" - version = "~> 3.10" + version = "~> 4.15" } azuread = { source = "hashicorp/azuread" - version = "~> 2.24" + version = "~> 3.0" } kentik-cloudexport = { source = "kentik/kentik-cloudexport" diff --git a/cloud_Azure/terraform/module/examples/single_account_multiple_resource_groups/output.tf b/cloud_Azure/terraform/module/examples/single_account_multiple_resource_groups/output.tf index 69348b1..665f42b 100644 --- a/cloud_Azure/terraform/module/examples/single_account_multiple_resource_groups/output.tf +++ b/cloud_Azure/terraform/module/examples/single_account_multiple_resource_groups/output.tf @@ -1,7 +1,7 @@ -output "network_security_groups" { - value = module.kentik_azure_integration.network_security_groups - description = "Id's of the Network Security Groups which flow logs will be collected" +output "vnet_ids" { + value = module.kentik_azure_integration.vnet_ids + description = "Id's of the Virtual Networks from which to collect flow logs" } output "subscription_id" { @@ -22,4 +22,4 @@ output "storage_accounts" { output "principal_id" { value = module.kentik_azure_integration.principal_id description = "Service Principal ID created for Kentik NSG Flow Exporter application" -} \ No newline at end of file +} diff --git a/cloud_Azure/terraform/module/get_nsg.py b/cloud_Azure/terraform/module/get_nsg.py deleted file mode 100755 index 4b31455..0000000 --- a/cloud_Azure/terraform/module/get_nsg.py +++ /dev/null @@ -1,34 +0,0 @@ -import sys -from typing import Dict, List - -from az.cli import az -from terraform_external_data import terraform_external_data - - -@terraform_external_data -def get_nsg_from_rg(query: Dict[str, str]) -> Dict[str, str]: - """ - Gather all Network Security Groups for each requested Resource Group - """ - - if query["resource_group_names"] == "": - return {} - - resource_group_names: List[str] = query["resource_group_names"].split(",") - result: Dict[str, str] = {} - - for rg in resource_group_names: - exit_code, result_dict, logs = az(f"network nsg list --resource-group {rg} --query '[].id' -o json") - if exit_code == 0: - network_security_group_ids = str(result_dict).strip("[]").replace("'", "").replace(" ", "") - result[rg] = network_security_group_ids - else: - # Terraform-Python communication protocol: on error, print message to stderr and exit with non-zero code - print(logs, file=sys.stderr) - exit(1) - - return result # result is consumed by function decorator - - -if __name__ == "__main__": - get_nsg_from_rg() # pylint: disable=no-value-for-parameter diff --git a/cloud_Azure/terraform/module/network_watcher.tf b/cloud_Azure/terraform/module/network_watcher.tf index b2dbca0..c75674e 100644 --- a/cloud_Azure/terraform/module/network_watcher.tf +++ b/cloud_Azure/terraform/module/network_watcher.tf @@ -5,55 +5,42 @@ data "azurerm_network_watcher" "network_watcher" { resource_group_name = "NetworkWatcherRG" } -# Runs python script to gather network security groups from each requested resource group -# This is required because no Terraform provider exposes such functionality -# Resulting "data.external.nsg_data_source.results" is a map of string -> string, eg. -# { -# "ResourceGroupName1" -> "NetworkSercurityGroupId1,NetworkSecurityGroupId2", -# "ResourceGroupName2" -> "NetworkSercurityGroupId3,NetworkSecurityGroupId4" -# } -data "external" "nsg_data_source" { - program = ["python3", "${path.module}/get_nsg.py"] - query = { - resource_group_names = join(",", var.resource_group_names) - } +# Fetch all VNets for each resource group +data "azurerm_resources" "vnet" { + for_each = toset(var.resource_group_names) + type = "Microsoft.Network/virtualNetworks" + resource_group_name = each.key } -# Convert map of string -> string: -# { -# "ResourceGroupName1" -> "NetworkSercurityGroupId1,NetworkSecurityGroupId2", -# "ResourceGroupName2" -> "NetworkSercurityGroupId3,NetworkSecurityGroupId4" -# } -# to list of objects: -# [ -# {rg = "ResourceGroupName1", nsg = "NetworkSercurityGroupId1"}, -# {rg = "ResourceGroupName1", nsg = "NetworkSercurityGroupId2"}, -# {rg = "ResourceGroupName2", nsg = "NetworkSercurityGroupId3"}, -# {rg = "ResourceGroupName2", nsg = "NetworkSercurityGroupId4"} -# ] +# Map resource group names to their corresponding VNets +# Flatten map to list of objects locals { - flat_nsgs = flatten([ - for rg, nsg_list in data.external.nsg_data_source.result : [ - for nsg in split(",", nsg_list) : { - rg = rg # Resource Group name - nsg = nsg # Network Security Group ID + flat_vnets = flatten([ + for rg in var.resource_group_names : [ + for vnet in data.azurerm_resources.vnet[rg].resources : { + key = "${rg}-${vnet.name}" + value = { + rg = rg + name = vnet.name + id = vnet.id + } } - ] if length(nsg_list) > 0 # filter out Resource Groups that have no Network Security Groups + ] if length(data.azurerm_resources.vnet[rg].resources) > 0 # filter out resource groups without VNets ]) } -# Turns on flow logs for all network security groups in requested resource groups +# Turns on vnet flow logs for all vnets in requested resource groups resource "azurerm_network_watcher_flow_log" "kentik_network_flow_log" { - count = length(local.flat_nsgs) + for_each = { for vnet in local.flat_vnets : vnet.key => vnet.value } - name = "${var.name}_flow_log_${count.index}" + name = "${var.name}-flowLog-${each.value.name}" network_watcher_name = data.azurerm_network_watcher.network_watcher.name - resource_group_name = data.azurerm_network_watcher.network_watcher.resource_group_name + resource_group_name = "NetworkWatcherRG" - network_security_group_id = local.flat_nsgs[count.index].nsg - storage_account_id = azurerm_storage_account.logs_storage_account[index(var.resource_group_names, local.flat_nsgs[count.index].rg)].id - enabled = true - version = 2 + target_resource_id = each.value.id + storage_account_id = azurerm_storage_account.logs_storage_account[each.value.rg].id + enabled = true + version = 2 retention_policy { enabled = true days = 7 diff --git a/cloud_Azure/terraform/module/output.tf b/cloud_Azure/terraform/module/output.tf index 743b480..70053e9 100644 --- a/cloud_Azure/terraform/module/output.tf +++ b/cloud_Azure/terraform/module/output.tf @@ -1,6 +1,6 @@ -output "network_security_groups" { - value = [for v in local.flat_nsgs : v.nsg] - description = "Id's of the Network Security Groups which flow logs will be collected" +output "vnet_ids" { + value = [for vnet in local.flat_vnets : vnet.value.id] + description = "Id's of the Virtual Networks from which to collect flow logs" } output "subscription_id" { @@ -14,11 +14,11 @@ output "resource_group_names" { } output "storage_accounts" { - value = azurerm_storage_account.logs_storage_account[*].name + value = [for sa in azurerm_storage_account.logs_storage_account : sa.name] description = "Storage Account names where flow logs will be collected" } output "principal_id" { - value = local.kentik_nsg_flow_exporter_id - description = "Service Principal ID created for Kentik NSG Flow Exporter application" -} \ No newline at end of file + value = local.kentik_vnet_flow_exporter_id + description = "Service Principal ID created for Kentik VNet Flow Exporter application" +} diff --git a/cloud_Azure/terraform/module/providers.tf b/cloud_Azure/terraform/module/providers.tf deleted file mode 100644 index 1cc54b2..0000000 --- a/cloud_Azure/terraform/module/providers.tf +++ /dev/null @@ -1,17 +0,0 @@ -# Enable network watcher feature -resource "null_resource" "feature_allow_watcher" { - provisioner "local-exec" { - command = "az feature register --namespace Microsoft.Network --name AllowNetworkWatcher" - } - - provisioner "local-exec" { - command = "az provider register -n Microsoft.Network" - } -} - -# Enable Microsoft Insights -resource "null_resource" "feature_insights_register" { - provisioner "local-exec" { - command = "az provider register -n Microsoft.Insights" - } -} diff --git a/cloud_Azure/terraform/module/requirements.txt b/cloud_Azure/terraform/module/requirements.txt deleted file mode 100644 index a547788..0000000 --- a/cloud_Azure/terraform/module/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -az.cli>=0.4 -virtualenv>=20.4.0 -terraform-external-data>=1.0.3 \ No newline at end of file diff --git a/cloud_Azure/terraform/module/roles.tf b/cloud_Azure/terraform/module/roles.tf index 79b018d..73b5e2b 100644 --- a/cloud_Azure/terraform/module/roles.tf +++ b/cloud_Azure/terraform/module/roles.tf @@ -1,17 +1,17 @@ # Provide service principal Contributor role to each storage account -resource "azurerm_role_assignment" "kentic_role_contributor" { - count = length(azurerm_storage_account.logs_storage_account) +resource "azurerm_role_assignment" "kentik_role_contributor" { + for_each = azurerm_storage_account.logs_storage_account - scope = azurerm_storage_account.logs_storage_account[count.index].id + scope = each.value.id role_definition_name = "Contributor" - principal_id = local.kentik_nsg_flow_exporter_id + principal_id = local.kentik_vnet_flow_exporter_id } # Provide service principal Reader role to each Resource Group -resource "azurerm_role_assignment" "kentic_role_reader" { - count = length(var.resource_group_names) +resource "azurerm_role_assignment" "kentik_role_reader" { + for_each = toset(var.resource_group_names) - scope = "/subscriptions/${var.subscription_id}/resourceGroups/${var.resource_group_names[count.index]}" + scope = "/subscriptions/${var.subscription_id}/resourceGroups/${each.value}" role_definition_name = "Reader" - principal_id = local.kentik_nsg_flow_exporter_id + principal_id = local.kentik_vnet_flow_exporter_id } diff --git a/cloud_Azure/terraform/module/service_principal.tf b/cloud_Azure/terraform/module/service_principal.tf index d625e84..f5e0bc7 100644 --- a/cloud_Azure/terraform/module/service_principal.tf +++ b/cloud_Azure/terraform/module/service_principal.tf @@ -1,20 +1,20 @@ data "azuread_client_config" "current" {} -data "azuread_service_principals" "existing_nsg_flow_exporter" { - client_ids = [var.flow_exporter_application_id] +data "azuread_service_principals" "existing_vnet_flow_exporter" { + client_ids = [var.flow_exporter_application_id] ignore_missing = true } locals { - nsg_flow_exporter_already_exists = length(data.azuread_service_principals.existing_nsg_flow_exporter.object_ids) == 1 ? true : false + vnet_flow_exporter_already_exists = length(data.azuread_service_principals.existing_vnet_flow_exporter.object_ids) == 1 } -# Creates Service Principal for pre-existing "Kentik NSG Flow Exporter" app, so the app can access flow logs in Azure cloud +# Creates Service Principal for pre-existing "Kentik VNet Flow Exporter" app, so the app can access flow logs in Azure cloud # This resource is shared across Azure Account, so only create it if doesn't exist yet -resource "azuread_service_principal" "new_nsg_flow_exporter" { - count = local.nsg_flow_exporter_already_exists ? 0 : 1 +resource "azuread_service_principal" "new_vnet_flow_exporter" { + count = local.vnet_flow_exporter_already_exists ? 0 : 1 - client_id = var.flow_exporter_application_id + client_id = var.flow_exporter_application_id app_role_assignment_required = false owners = [data.azuread_client_config.current.object_id] @@ -24,5 +24,5 @@ resource "azuread_service_principal" "new_nsg_flow_exporter" { } locals { - kentik_nsg_flow_exporter_id = local.nsg_flow_exporter_already_exists ? data.azuread_service_principals.existing_nsg_flow_exporter.object_ids[0] : azuread_service_principal.new_nsg_flow_exporter[0].object_id -} \ No newline at end of file + kentik_vnet_flow_exporter_id = local.vnet_flow_exporter_already_exists ? data.azuread_service_principals.existing_vnet_flow_exporter.object_ids[0] : azuread_service_principal.new_vnet_flow_exporter[0].object_id +} diff --git a/cloud_Azure/terraform/module/storage_account.tf b/cloud_Azure/terraform/module/storage_account.tf index 1b57d24..0552652 100644 --- a/cloud_Azure/terraform/module/storage_account.tf +++ b/cloud_Azure/terraform/module/storage_account.tf @@ -1,20 +1,36 @@ # Prepare names that meet Azure Storage Account naming restrictions (only alphanum letters, max 24 length, Azure-wide unique) -# Each output name is concatenation of Resource Group name and Subscription ID, adjusted to naming restrictions +resource "random_id" "storage_account_id" { + count = length(var.resource_group_names) + byte_length = 6 # 6 bytes = 12 characters when base64 encoded +} + +# Each output name is concatenation of the exporter name truncated to 12 chars and a random id of 12 chars, adjusted to naming restrictions locals { - _names = [for name in var.resource_group_names : "${name}${var.subscription_id}"] + truncated_name = substr(var.name, 0, 12) + _names = [for idx in range(length(var.resource_group_names)) : "${local.truncated_name}${random_id.storage_account_id[idx].hex}"] _lowercase_names = [for name in local._names : lower(name)] _alphanum_lowercase_names = [for name in local._lowercase_names : join("", regexall("[[:alnum:]]+", name))] generated_storage_account_names = [for name in local._alphanum_lowercase_names : substr(name, 0, 24)] } +# Create a map of resource group names to storage account names +locals { + resource_group_to_storage_account = { + for idx, rg in var.resource_group_names : rg => ( + length(var.storage_account_names) == length(var.resource_group_names) ? + var.storage_account_names[idx] : + local.generated_storage_account_names[idx] + ) + } +} + # Creates one storage account per resource group to store flow logs -# StorageAccounts are mapped 1:1 to resource_group_names and this fact is used to get storage account id for given resource group name +# StorageAccounts are mapped 1:1 to resource_group_names and this fact is used to get storage account id for given resource group name resource "azurerm_storage_account" "logs_storage_account" { - count = length(var.resource_group_names) + for_each = local.resource_group_to_storage_account - # use either custom name if one is provided, or generated one - name = length(var.storage_account_names) == length(var.resource_group_names) ? var.storage_account_names[count.index] : local.generated_storage_account_names[count.index] - resource_group_name = var.resource_group_names[count.index] + name = each.value + resource_group_name = each.key location = var.location account_tier = "Standard" account_replication_type = "GRS" @@ -22,4 +38,4 @@ resource "azurerm_storage_account" "logs_storage_account" { tags = { app = var.resource_tag } -} \ No newline at end of file +} diff --git a/cloud_Azure/terraform/module/tests/main.tf b/cloud_Azure/terraform/module/tests/main.tf index 6737976..f8e4bd4 100644 --- a/cloud_Azure/terraform/module/tests/main.tf +++ b/cloud_Azure/terraform/module/tests/main.tf @@ -3,11 +3,11 @@ terraform { required_providers { azurerm = { source = "hashicorp/azurerm" - version = "~> 3.10" + version = "~> 4.15" } azuread = { source = "hashicorp/azuread" - version = "~> 2.24" + version = "~> 3.0" } kentik-cloudexport = { source = "kentik/kentik-cloudexport" diff --git a/cloud_Azure/terraform/module/variables.tf b/cloud_Azure/terraform/module/variables.tf index 8a589ef..2988dcb 100644 --- a/cloud_Azure/terraform/module/variables.tf +++ b/cloud_Azure/terraform/module/variables.tf @@ -1,4 +1,4 @@ -# provideres: azurerm & azuread +# providers: azurerm & azuread variable "subscription_id" { type = string description = "Azure subscription ID" @@ -62,5 +62,5 @@ variable "enabled" { variable "flow_exporter_application_id" { type = string default = "a20ce222-63c0-46db-86d5-58551eeee89f" - description = "Kentik NSG Flow Exporter application ID" -} \ No newline at end of file + description = "Kentik VNet Flow Exporter application ID" +} diff --git a/cloud_IBM/README.md b/cloud_IBM/README.md deleted file mode 100644 index 55f985c..0000000 --- a/cloud_IBM/README.md +++ /dev/null @@ -1 +0,0 @@ -place holder