diff --git a/terraform/azure_billing/finops.tf b/terraform/azure_billing/finops.tf index b03dea66..62a953fc 100644 --- a/terraform/azure_billing/finops.tf +++ b/terraform/azure_billing/finops.tf @@ -7,7 +7,12 @@ locals { mozilla_billing_profile_id = "GRUW-TLBL-BG7-PGB" # Invoice sections under mozilla billing profile - anonym_invoice_section_id = "RUDC-GV4R-PJA-PGB" + anonym_invoice_section_id = "RUDC-GV4R-PJA-PGB" + mozilla_invoice_section_id = "VVEC-AWWS-PJA-PGB" + + # US Corp Card billing profile + uscorpcard_billing_profile_id = "F6IO-6MX2-BG7-PGB" + uscorpcard_invoice_section_id = "C7BX-N2MV-PJA-PGB" } # Storage account for cost exports (managed in azure_fxci) @@ -111,3 +116,273 @@ resource "azapi_resource" "anonym_cost_export_amortized" { } } } + +module "anonym_focusCost" { + source = "../azure_modules/costExport" + + columns = [] + compression_mode = "None" + container_name = "cost-management" + cost_type = "FocusCost" + data_overwrite_behavior = "CreateNewReport" + data_version = "1.0r2" + export_description = "Anonym Focus Cost Export. https://mozilla-hub.atlassian.net/browse/RELOPS-2174" + export_name = "anonym_focuscost_daily" + format = "Csv" + granularity = "Daily" + parent_id = "/providers/Microsoft.Billing/billingAccounts/${local.billing_account_id}/billingProfiles/${local.mozilla_billing_profile_id}/invoiceSections/${local.anonym_invoice_section_id}" + partition_data = true + recurrence = "Daily" + recurrence_period_from = "2026-02-05T00:00:00Z" + recurrence_period_to = "2050-02-05T00:00:00Z" + root_folder_path = "anonym_focuscost" + status = "Active" + storage_account_id = data.azurerm_storage_account.finops.id + timeframe = "MonthToDate" +} + +module "mozilla_reservationDetails" { + source = "../azure_modules/costExport" + + columns = [] + compression_mode = "None" + container_name = "cost-management" + cost_type = "ReservationDetails" + data_overwrite_behavior = "CreateNewReport" + data_version = "2023-03-01" + export_description = "Mozilla Reservation Details Export. https://mozilla-hub.atlassian.net/browse/RELOPS-2174" + export_name = "mozilla_reservation_details_daily" + format = "Csv" + granularity = "Daily" + parent_id = "/providers/Microsoft.Billing/billingAccounts/${local.billing_account_id}/billingProfiles/${local.mozilla_billing_profile_id}" + partition_data = true + recurrence = "Daily" + recurrence_period_from = "2026-02-05T00:00:00Z" + recurrence_period_to = "2050-02-05T00:00:00Z" + root_folder_path = "mozilla_reservation_details" + status = "Active" + storage_account_id = data.azurerm_storage_account.finops.id + timeframe = "MonthToDate" +} + +module "mozilla_reservationRecommendations" { + source = "../azure_modules/costExport" + + columns = [] + compression_mode = "None" + container_name = "cost-management" + cost_type = "ReservationRecommendations" + data_overwrite_behavior = "CreateNewReport" + data_version = "2023-05-01" + export_description = "Mozilla Reservation Recommendations Export. https://mozilla-hub.atlassian.net/browse/RELOPS-2174" + export_name = "mozilla_reservation_recommendations_daily" + format = "Csv" + granularity = null + parent_id = "/providers/Microsoft.Billing/billingAccounts/${local.billing_account_id}/billingProfiles/${local.mozilla_billing_profile_id}" + partition_data = true + recurrence = "Daily" + recurrence_period_from = "2026-02-05T00:00:00Z" + recurrence_period_to = "2050-02-05T00:00:00Z" + root_folder_path = "mozilla_reservation_recommendations" + status = "Active" + storage_account_id = data.azurerm_storage_account.finops.id + timeframe = "MonthToDate" +} + +module "mozilla_reservationTransactions" { + source = "../azure_modules/costExport" + + columns = [] + compression_mode = "None" + container_name = "cost-management" + cost_type = "ReservationTransactions" + data_overwrite_behavior = "CreateNewReport" + data_version = "2023-05-01" + export_description = "Mozilla Reservation Transactions Export. https://mozilla-hub.atlassian.net/browse/RELOPS-2174" + export_name = "mozilla_reservation_transactions_daily" + format = "Csv" + granularity = null + parent_id = "/providers/Microsoft.Billing/billingAccounts/${local.billing_account_id}/billingProfiles/${local.mozilla_billing_profile_id}" + partition_data = true + recurrence = "Daily" + recurrence_period_from = "2026-02-05T00:00:00Z" + recurrence_period_to = "2050-02-05T00:00:00Z" + root_folder_path = "mozilla_reservation_transactions" + status = "Active" + storage_account_id = data.azurerm_storage_account.finops.id + timeframe = "MonthToDate" +} + +module "mozilla_focusCost" { + source = "../azure_modules/costExport" + + columns = [] + compression_mode = "None" + container_name = "cost-management" + cost_type = "FocusCost" + data_overwrite_behavior = "CreateNewReport" + data_version = "1.0r2" + export_description = "Mozilla Focus Cost Export. https://mozilla-hub.atlassian.net/browse/RELOPS-2174" + export_name = "mozilla_focus_cost_daily" + format = "Csv" + granularity = "Daily" + parent_id = "/providers/Microsoft.Billing/billingAccounts/${local.billing_account_id}/billingProfiles/${local.mozilla_billing_profile_id}/invoiceSections/${local.mozilla_invoice_section_id}" + partition_data = true + recurrence = "Daily" + recurrence_period_from = "2026-02-05T00:00:00Z" + recurrence_period_to = "2050-02-05T00:00:00Z" + root_folder_path = "mozilla_focus_cost" + status = "Active" + storage_account_id = data.azurerm_storage_account.finops.id + timeframe = "MonthToDate" +} + +# US Corp Card invoice section - Actual Cost export +module "uscorpcard_actualCost" { + source = "../azure_modules/costExport" + + columns = [] + compression_mode = "None" + container_name = "cost-management" + cost_type = "ActualCost" + data_overwrite_behavior = "CreateNewReport" + data_version = "2021-10-01" + export_description = "US Corp Card Actual Cost Export. https://mozilla-hub.atlassian.net/browse/RELOPS-2174" + export_name = "uscorpcard_actual_cost_daily" + format = "Csv" + granularity = "Daily" + parent_id = "/providers/Microsoft.Billing/billingAccounts/${local.billing_account_id}/billingProfiles/${local.uscorpcard_billing_profile_id}/invoiceSections/${local.uscorpcard_invoice_section_id}" + partition_data = true + recurrence = "Daily" + recurrence_period_from = "2026-02-05T00:00:00Z" + recurrence_period_to = "2050-02-05T00:00:00Z" + root_folder_path = "uscorpcard_actual_cost" + status = "Active" + storage_account_id = data.azurerm_storage_account.finops.id + timeframe = "MonthToDate" +} + +# US Corp Card invoice section - Amortized Cost export +module "uscorpcard_amortizedCost" { + source = "../azure_modules/costExport" + + columns = [] + compression_mode = "None" + container_name = "cost-management" + cost_type = "AmortizedCost" + data_overwrite_behavior = "CreateNewReport" + data_version = "2021-10-01" + export_description = "US Corp Card Amortized Cost Export. https://mozilla-hub.atlassian.net/browse/RELOPS-2174" + export_name = "uscorpcard_amortized_cost_daily" + format = "Csv" + granularity = "Daily" + parent_id = "/providers/Microsoft.Billing/billingAccounts/${local.billing_account_id}/billingProfiles/${local.uscorpcard_billing_profile_id}/invoiceSections/${local.uscorpcard_invoice_section_id}" + partition_data = true + recurrence = "Daily" + recurrence_period_from = "2026-02-05T00:00:00Z" + recurrence_period_to = "2050-02-05T00:00:00Z" + root_folder_path = "uscorpcard_amortized_cost" + status = "Active" + storage_account_id = data.azurerm_storage_account.finops.id + timeframe = "MonthToDate" +} + +# US Corp Card invoice section - Focus Cost export +module "uscorpcard_focusCost" { + source = "../azure_modules/costExport" + + columns = [] + compression_mode = "None" + container_name = "cost-management" + cost_type = "FocusCost" + data_overwrite_behavior = "CreateNewReport" + data_version = "1.0r2" + export_description = "US Corp Card Focus Cost Export. https://mozilla-hub.atlassian.net/browse/RELOPS-2174" + export_name = "uscorpcard_focus_cost_daily" + format = "Csv" + granularity = "Daily" + parent_id = "/providers/Microsoft.Billing/billingAccounts/${local.billing_account_id}/billingProfiles/${local.uscorpcard_billing_profile_id}/invoiceSections/${local.uscorpcard_invoice_section_id}" + partition_data = true + recurrence = "Daily" + recurrence_period_from = "2026-02-05T00:00:00Z" + recurrence_period_to = "2050-02-05T00:00:00Z" + root_folder_path = "uscorpcard_focus_cost" + status = "Active" + storage_account_id = data.azurerm_storage_account.finops.id + timeframe = "MonthToDate" +} + +# US Corp Card billing profile - Reservation Details export +module "uscorpcard_reservationDetails" { + source = "../azure_modules/costExport" + + columns = [] + compression_mode = "None" + container_name = "cost-management" + cost_type = "ReservationDetails" + data_overwrite_behavior = "CreateNewReport" + data_version = "2023-03-01" + export_description = "US Corp Card Reservation Details Export. https://mozilla-hub.atlassian.net/browse/RELOPS-2174" + export_name = "uscorpcard_reservation_details_daily" + format = "Csv" + granularity = "Daily" + parent_id = "/providers/Microsoft.Billing/billingAccounts/${local.billing_account_id}/billingProfiles/${local.uscorpcard_billing_profile_id}" + partition_data = true + recurrence = "Daily" + recurrence_period_from = "2026-02-05T00:00:00Z" + recurrence_period_to = "2050-02-05T00:00:00Z" + root_folder_path = "uscorpcard_reservation_details" + status = "Active" + storage_account_id = data.azurerm_storage_account.finops.id + timeframe = "MonthToDate" +} + +# US Corp Card billing profile - Reservation Recommendations export +module "uscorpcard_reservationRecommendations" { + source = "../azure_modules/costExport" + + columns = [] + compression_mode = "None" + container_name = "cost-management" + cost_type = "ReservationRecommendations" + data_overwrite_behavior = "CreateNewReport" + data_version = "2023-05-01" + export_description = "US Corp Card Reservation Recommendations Export. https://mozilla-hub.atlassian.net/browse/RELOPS-2174" + export_name = "uscorpcard_reservation_recommendations_daily" + format = "Csv" + granularity = null + parent_id = "/providers/Microsoft.Billing/billingAccounts/${local.billing_account_id}/billingProfiles/${local.uscorpcard_billing_profile_id}" + partition_data = true + recurrence = "Daily" + recurrence_period_from = "2026-02-05T00:00:00Z" + recurrence_period_to = "2050-02-05T00:00:00Z" + root_folder_path = "uscorpcard_reservation_recommendations" + status = "Active" + storage_account_id = data.azurerm_storage_account.finops.id + timeframe = "MonthToDate" +} + +# US Corp Card billing profile - Reservation Transactions export +module "uscorpcard_reservationTransactions" { + source = "../azure_modules/costExport" + + columns = [] + compression_mode = "None" + container_name = "cost-management" + cost_type = "ReservationTransactions" + data_overwrite_behavior = "CreateNewReport" + data_version = "2023-05-01" + export_description = "US Corp Card Reservation Transactions Export. https://mozilla-hub.atlassian.net/browse/RELOPS-2174" + export_name = "uscorpcard_reservation_transactions_daily" + format = "Csv" + granularity = null + parent_id = "/providers/Microsoft.Billing/billingAccounts/${local.billing_account_id}/billingProfiles/${local.uscorpcard_billing_profile_id}" + partition_data = true + recurrence = "Daily" + recurrence_period_from = "2026-02-05T00:00:00Z" + recurrence_period_to = "2050-02-05T00:00:00Z" + root_folder_path = "uscorpcard_reservation_transactions" + status = "Active" + storage_account_id = data.azurerm_storage_account.finops.id + timeframe = "MonthToDate" +} diff --git a/terraform/azure_modules/costExport/.gitignore b/terraform/azure_modules/costExport/.gitignore new file mode 100644 index 00000000..208a18b4 --- /dev/null +++ b/terraform/azure_modules/costExport/.gitignore @@ -0,0 +1,37 @@ +# Local .terraform directories +.terraform/ + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sensitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +*.tfvars +*.tfvars.json + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Ignore transient lock info files created by terraform apply +.terraform.tfstate.lock.info + +# Include override files you do wish to add to version control using negated pattern +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc diff --git a/terraform/azure_modules/costExport/README.md b/terraform/azure_modules/costExport/README.md new file mode 100644 index 00000000..425a073c --- /dev/null +++ b/terraform/azure_modules/costExport/README.md @@ -0,0 +1,241 @@ +# Azure Cost Export Module + +This Terraform module creates Azure Cost Management exports for billing accounts, subscriptions, resource groups, or other scopes. + +## Features + +- Support for all export types: ActualCost, AmortizedCost, and Usage +- Configurable schedule (Daily, Weekly, Monthly, Annually) +- Flexible export destination (Azure Blob Storage) +- Support for data partitioning +- Configurable granularity (Daily or Monthly) +- System-assigned managed identity + +## Usage + +### Basic Example (using defaults) + +```hcl +module "cost_export" { + source = "../../azure_modules/costExport" + + export_name = "my-daily-cost-export" + parent_id = "/subscriptions/12345678-1234-1234-1234-123456789012" + + delivery_info = { + storage_account_id = azurerm_storage_account.example.id + container = "cost-management" + root_folder_path = "exports/daily" + } +} +``` + +### Billing-Scoped Export Example + +```hcl +locals { + billing_account_id = "05ef9068-c74c-54a9-5b8f-82f7fb8b32cd:6e104178-9e3c-470c-9787-8ef53f372665_2019-05-31" + billing_profile_id = "GRUW-TLBL-BG7-PGB" + invoice_section_id = "RUDC-GV4R-PJA-PGB" + parent_id = "/providers/Microsoft.Billing/billingAccounts/${local.billing_account_id}/billingProfiles/${local.billing_profile_id}/invoiceSections/${local.invoice_section_id}" +} + +data "azurerm_storage_account" "finops" { + name = "safinopsdata" + resource_group_name = "rg-azure-cost-mgmt" +} + +# Actual Cost Export +module "actual_cost_export" { + source = "../../azure_modules/costExport" + + export_name = "daily-actual-cost" + parent_id = local.parent_id + + delivery_info = { + storage_account_id = data.azurerm_storage_account.finops.id + container = "cost-management" + root_folder_path = "actual_daily" + } + + definition = { + type = "ActualCost" + timeframe = "MonthToDate" + data_set = { + granularity = "Daily" + configuration = { + columns = [] + data_version = "2023-05-01" + } + } + } +} + +# Amortized Cost Export +module "amortized_cost_export" { + source = "../../azure_modules/costExport" + + export_name = "daily-amortized-cost" + parent_id = local.parent_id + + delivery_info = { + storage_account_id = data.azurerm_storage_account.finops.id + container = "cost-management" + root_folder_path = "amortized_daily" + } + + definition = { + type = "AmortizedCost" + timeframe = "MonthToDate" + data_set = { + granularity = "Daily" + configuration = { + columns = [] + data_version = "2023-05-01" + } + } + } +} +``` + +### Advanced Example with Custom Configuration + +```hcl +module "custom_export" { + source = "../../azure_modules/costExport" + + export_name = "weekly-export-compressed" + parent_id = "/subscriptions/12345678-1234-1234-1234-123456789012" + format = "Csv" + compression_mode = "GZip" + partition_data = true + data_overwrite_behavior = "OverwritePreviousReport" + + schedule = { + status = "Active" + recurrence = "Weekly" + recurrence_period = { + from = "2024-01-01T00:00:00Z" + to = "2030-12-31T00:00:00Z" + } + } + + delivery_info = { + storage_account_id = azurerm_storage_account.example.id + container = "cost-exports" + root_folder_path = "weekly" + } + + definition = { + type = "ActualCost" + timeframe = "MonthToDate" + data_set = { + granularity = "Daily" + configuration = { + columns = [] + data_version = "2023-05-01" + } + } + } +} +``` + +## Requirements + +| Name | Version | +|------|---------| +| terraform | >= 1.0 | +| azapi | ~> 2.0 | + +## Inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| +| export_name | Name of the cost export | `string` | n/a | yes | +| parent_id | Parent ID for the cost export scope | `string` | n/a | yes | +| delivery_info | Delivery destination configuration | `object` | n/a | yes | +| export_description | Description of the cost export | `string` | `"Azure Cost Export"` | no | +| format | Export format: Csv or Parquet | `string` | `"Csv"` | no | +| compression_mode | Compression mode: None, GZip | `string` | `"None"` | no | +| data_overwrite_behavior | CreateNewReport or OverwritePreviousReport | `string` | `"CreateNewReport"` | no | +| partition_data | Whether to partition the exported data | `bool` | `true` | no | +| schedule | Schedule configuration (status, recurrence, recurrence_period) | `object` | See below | no | +| definition | Export definition (type, timeframe, data_set) | `object` | See below | no | + +### `schedule` object + +```hcl +{ + status = "Active" # Active or Inactive + recurrence = "Daily" # Daily, Weekly, Monthly, or Annually + recurrence_period = { + from = "2024-10-01T00:00:00Z" + to = "2050-02-01T00:00:00Z" + } +} +``` + +### `delivery_info` object + +```hcl +{ + storage_account_id = "..." # Resource ID of the storage account + container = "..." # Blob container name + root_folder_path = "..." # Folder path within the container +} +``` + +### `definition` object + +```hcl +{ + type = "ActualCost" # ActualCost, AmortizedCost, or Usage + timeframe = "MonthToDate" # MonthToDate, WeekToDate, Custom, etc. + data_set = { + granularity = "Daily" # Daily or Monthly + configuration = { + columns = [] # List of columns to include (empty = all) + data_version = "2023-05-01" + } + } +} +``` + +## Outputs + +| Name | Description | +|------|-------------| +| id | The ID of the cost export | +| name | The name of the cost export | +| identity | The identity of the cost export (including principal_id for RBAC assignments) | +| output | The full output of the cost export resource | + +## Export Types + +The module supports three export types via `definition.type`: + +- **ActualCost**: Actual costs incurred, including on-demand usage and reservations at the prices you paid +- **AmortizedCost**: Costs with reservation purchases amortized over the reservation term +- **Usage**: Raw usage data without cost information + +## Parent ID Formats + +The `parent_id` variable accepts different scope formats: + +- **Billing Account**: `/providers/Microsoft.Billing/billingAccounts/{billingAccountId}` +- **Billing Profile**: `/providers/Microsoft.Billing/billingAccounts/{billingAccountId}/billingProfiles/{billingProfileId}` +- **Invoice Section**: `/providers/Microsoft.Billing/billingAccounts/{billingAccountId}/billingProfiles/{billingProfileId}/invoiceSections/{invoiceSectionId}` +- **Subscription**: `/subscriptions/{subscriptionId}` +- **Resource Group**: `/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}` +- **Management Group**: `/providers/Microsoft.Management/managementGroups/{managementGroupId}` + +## Notes + +- The module creates a cost export with a system-assigned managed identity +- The managed identity will need appropriate permissions to write to the storage account +- Data version `2023-05-01` is recommended for the latest schema +- For billing-scoped exports, ensure you have the correct billing account, profile, and invoice section IDs + +## License + +This module is maintained by Mozilla RelOps. diff --git a/terraform/azure_modules/costExport/main.tf b/terraform/azure_modules/costExport/main.tf new file mode 100644 index 00000000..849aa365 --- /dev/null +++ b/terraform/azure_modules/costExport/main.tf @@ -0,0 +1,47 @@ +resource "azapi_resource" "cost_export" { + type = "Microsoft.CostManagement/exports@2025-03-01" + name = var.export_name + parent_id = var.parent_id + location = "global" + + identity { + type = "SystemAssigned" + } + + body = { + properties = { + schedule = { + status = var.status + recurrence = var.recurrence + recurrencePeriod = { + from = var.recurrence_period_from + to = var.recurrence_period_to + } + } + exportDescription = var.export_description + format = var.format + compressionMode = var.compression_mode + dataOverwriteBehavior = var.data_overwrite_behavior + deliveryInfo = { + destination = { + type = "AzureBlob" + resourceId = var.storage_account_id + container = var.container_name + rootFolderPath = var.root_folder_path + } + } + partitionData = var.partition_data + definition = { + type = var.cost_type + timeframe = var.timeframe + dataSet = { + granularity = var.granularity + configuration = { + columns = var.columns + dataVersion = var.data_version + } + } + } + } + } +} diff --git a/terraform/azure_modules/costExport/outputs.tf b/terraform/azure_modules/costExport/outputs.tf new file mode 100644 index 00000000..2a446045 --- /dev/null +++ b/terraform/azure_modules/costExport/outputs.tf @@ -0,0 +1,19 @@ +output "id" { + description = "The ID of the cost export" + value = azapi_resource.cost_export.id +} + +output "name" { + description = "The name of the cost export" + value = azapi_resource.cost_export.name +} + +output "identity" { + description = "The identity of the cost export (including principal_id for RBAC assignments)" + value = azapi_resource.cost_export.identity +} + +output "output" { + description = "The full output of the cost export resource" + value = azapi_resource.cost_export.output +} diff --git a/terraform/azure_modules/costExport/providers.tf b/terraform/azure_modules/costExport/providers.tf new file mode 100644 index 00000000..18e2a9b9 --- /dev/null +++ b/terraform/azure_modules/costExport/providers.tf @@ -0,0 +1,8 @@ +terraform { + required_providers { + azapi = { + source = "Azure/azapi" + version = "~> 2.0" + } + } +} diff --git a/terraform/azure_modules/costExport/variables.tf b/terraform/azure_modules/costExport/variables.tf new file mode 100644 index 00000000..5be8b620 --- /dev/null +++ b/terraform/azure_modules/costExport/variables.tf @@ -0,0 +1,109 @@ +variable "columns" { + description = "List of columns to include in the export" + type = list(string) + default = [] +} + +variable "compression_mode" { + description = "Compression mode: None, GZip" + type = string + default = "None" +} + +variable "container_name" { + description = "Storage container name for cost exports" + type = string + default = "cost-management" +} + +variable "cost_type" { + description = "Type of cost export: ActualCost, AmortizedCost, or Usage" + type = string + default = "ActualCost" +} + +variable "data_overwrite_behavior" { + description = "Data overwrite behavior: CreateNewReport, OverwritePreviousReport" + type = string + default = "CreateNewReport" +} + +variable "data_version" { + description = "Data version for the export configuration" + type = string + default = "2023-05-01" +} + +variable "export_description" { + description = "Description of the cost export" + type = string + default = "Azure Cost Export" +} + +variable "export_name" { + description = "Name of the cost export" + type = string +} + +variable "format" { + description = "Export format: Csv or Parquet" + type = string + default = "Csv" +} + +variable "granularity" { + description = "Granularity of the export data: Daily, Monthly. Set to null to omit (required for some reservation export types)." + type = string + default = "Daily" +} + +variable "parent_id" { + description = "Parent ID for the cost export (billing account, subscription, resource group, etc.)" + type = string +} + +variable "partition_data" { + description = "Whether to partition the exported data" + type = bool + default = true +} + +variable "recurrence" { + description = "Recurrence pattern: Daily, Weekly, Monthly, or Annually" + type = string + default = "Daily" +} + +variable "recurrence_period_from" { + description = "Start date for recurrence period (ISO 8601 format)" + type = string + default = "2024-10-01T00:00:00Z" +} + +variable "recurrence_period_to" { + description = "End date for recurrence period (ISO 8601 format)" + type = string + default = "2050-02-01T00:00:00Z" +} + +variable "root_folder_path" { + description = "Root folder path within the container" + type = string +} + +variable "status" { + description = "Status of the export schedule: Active or Inactive" + type = string + default = "Active" +} + +variable "storage_account_id" { + description = "Resource ID of the storage account for export destination" + type = string +} + +variable "timeframe" { + description = "Timeframe for the export: MonthToDate, WeekToDate, Custom, etc." + type = string + default = "MonthToDate" +}