main.tf (300 lines of code) (raw):

resource "azurerm_storage_account" "this" { account_replication_type = var.account_replication_type account_tier = var.account_tier location = var.location name = var.name resource_group_name = var.resource_group_name access_tier = var.account_kind == "BlockBlobStorage" && var.account_tier == "Premium" ? null : var.access_tier account_kind = var.account_kind allow_nested_items_to_be_public = var.allow_nested_items_to_be_public allowed_copy_scope = var.allowed_copy_scope cross_tenant_replication_enabled = var.cross_tenant_replication_enabled default_to_oauth_authentication = var.default_to_oauth_authentication edge_zone = var.edge_zone https_traffic_only_enabled = var.https_traffic_only_enabled infrastructure_encryption_enabled = var.infrastructure_encryption_enabled is_hns_enabled = var.is_hns_enabled large_file_share_enabled = var.large_file_share_enabled min_tls_version = var.min_tls_version nfsv3_enabled = var.nfsv3_enabled public_network_access_enabled = var.public_network_access_enabled queue_encryption_key_type = var.queue_encryption_key_type sftp_enabled = var.sftp_enabled shared_access_key_enabled = var.shared_access_key_enabled table_encryption_key_type = var.table_encryption_key_type tags = var.tags dynamic "azure_files_authentication" { for_each = var.azure_files_authentication == null ? [] : [ var.azure_files_authentication ] content { directory_type = azure_files_authentication.value.directory_type default_share_level_permission = azure_files_authentication.value.default_share_level_permission dynamic "active_directory" { for_each = azure_files_authentication.value.active_directory == null ? [] : [ azure_files_authentication.value.active_directory ] content { domain_guid = active_directory.value.domain_guid domain_name = active_directory.value.domain_name domain_sid = active_directory.value.domain_sid forest_name = active_directory.value.forest_name netbios_domain_name = active_directory.value.netbios_domain_name storage_sid = active_directory.value.storage_sid } } } } dynamic "blob_properties" { for_each = var.blob_properties == null ? [] : [var.blob_properties] content { change_feed_enabled = blob_properties.value.change_feed_enabled change_feed_retention_in_days = blob_properties.value.change_feed_retention_in_days default_service_version = blob_properties.value.default_service_version last_access_time_enabled = blob_properties.value.last_access_time_enabled versioning_enabled = blob_properties.value.versioning_enabled dynamic "container_delete_retention_policy" { for_each = blob_properties.value.container_delete_retention_policy == null ? [] : [ blob_properties.value.container_delete_retention_policy ] content { days = container_delete_retention_policy.value.days } } dynamic "cors_rule" { for_each = blob_properties.value.cors_rule == null ? [] : blob_properties.value.cors_rule content { allowed_headers = cors_rule.value.allowed_headers allowed_methods = cors_rule.value.allowed_methods allowed_origins = cors_rule.value.allowed_origins exposed_headers = cors_rule.value.exposed_headers max_age_in_seconds = cors_rule.value.max_age_in_seconds } } dynamic "delete_retention_policy" { for_each = blob_properties.value.delete_retention_policy == null ? [] : [ blob_properties.value.delete_retention_policy ] content { days = delete_retention_policy.value.days } } dynamic "restore_policy" { for_each = blob_properties.value.restore_policy == null ? [] : [blob_properties.value.restore_policy] content { days = restore_policy.value.days } } } } dynamic "custom_domain" { for_each = var.custom_domain == null ? [] : [var.custom_domain] content { name = custom_domain.value.name use_subdomain = custom_domain.value.use_subdomain } } dynamic "identity" { for_each = (var.managed_identities.system_assigned || length(var.managed_identities.user_assigned_resource_ids) > 0) ? { this = var.managed_identities } : {} content { type = identity.value.system_assigned && length(identity.value.user_assigned_resource_ids) > 0 ? "SystemAssigned, UserAssigned" : length(identity.value.user_assigned_resource_ids) > 0 ? "UserAssigned" : "SystemAssigned" identity_ids = identity.value.user_assigned_resource_ids } } dynamic "immutability_policy" { for_each = var.immutability_policy == null ? [] : [var.immutability_policy] content { allow_protected_append_writes = immutability_policy.value.allow_protected_append_writes period_since_creation_in_days = immutability_policy.value.period_since_creation_in_days state = immutability_policy.value.state } } dynamic "network_rules" { for_each = var.network_rules == null ? [] : [var.network_rules] content { default_action = network_rules.value.default_action bypass = network_rules.value.bypass ip_rules = network_rules.value.ip_rules virtual_network_subnet_ids = network_rules.value.virtual_network_subnet_ids dynamic "private_link_access" { for_each = var.network_rules.private_link_access == null ? [] : var.network_rules.private_link_access content { endpoint_resource_id = private_link_access.value.endpoint_resource_id endpoint_tenant_id = private_link_access.value.endpoint_tenant_id } } } } dynamic "routing" { for_each = var.routing == null ? [] : [var.routing] content { choice = routing.value.choice publish_internet_endpoints = routing.value.publish_internet_endpoints publish_microsoft_endpoints = routing.value.publish_microsoft_endpoints } } dynamic "sas_policy" { for_each = var.sas_policy == null ? [] : [var.sas_policy] content { expiration_period = sas_policy.value.expiration_period expiration_action = sas_policy.value.expiration_action } } dynamic "share_properties" { for_each = var.share_properties == null ? [] : [var.share_properties] content { dynamic "cors_rule" { for_each = share_properties.value.cors_rule == null ? [] : share_properties.value.cors_rule content { allowed_headers = cors_rule.value.allowed_headers allowed_methods = cors_rule.value.allowed_methods allowed_origins = cors_rule.value.allowed_origins exposed_headers = cors_rule.value.exposed_headers max_age_in_seconds = cors_rule.value.max_age_in_seconds } } dynamic "retention_policy" { for_each = share_properties.value.retention_policy == null ? [] : [share_properties.value.retention_policy] content { days = retention_policy.value.days } } dynamic "smb" { for_each = share_properties.value.smb == null ? [] : [share_properties.value.smb] content { authentication_types = smb.value.authentication_types channel_encryption_type = smb.value.channel_encryption_type kerberos_ticket_encryption_type = smb.value.kerberos_ticket_encryption_type multichannel_enabled = smb.value.multichannel_enabled versions = smb.value.versions } } } } dynamic "timeouts" { for_each = var.timeouts == null ? [] : [var.timeouts] content { create = timeouts.value.create delete = timeouts.value.delete read = timeouts.value.read update = timeouts.value.update } } lifecycle { ignore_changes = [ customer_managed_key, queue_properties, static_website ] } } resource "azurerm_storage_account_local_user" "this" { for_each = var.local_user name = each.value.name storage_account_id = azurerm_storage_account.this.id home_directory = each.value.home_directory ssh_key_enabled = each.value.ssh_key_enabled ssh_password_enabled = each.value.ssh_password_enabled dynamic "permission_scope" { for_each = each.value.permission_scope == null ? [] : each.value.permission_scope content { resource_name = permission_scope.value.resource_name service = permission_scope.value.service dynamic "permissions" { for_each = [permission_scope.value.permissions] content { create = permissions.value.create delete = permissions.value.delete list = permissions.value.list read = permissions.value.read write = permissions.value.write } } } } dynamic "ssh_authorized_key" { for_each = each.value.ssh_authorized_key == null ? [] : each.value.ssh_authorized_key content { key = ssh_authorized_key.value.key description = ssh_authorized_key.value.description } } dynamic "timeouts" { for_each = each.value.timeouts == null ? [] : [each.value.timeouts] content { create = timeouts.value.create delete = timeouts.value.delete read = timeouts.value.read update = timeouts.value.update } } } resource "azurerm_storage_account_customer_managed_key" "this" { count = var.customer_managed_key != null ? 1 : 0 key_name = var.customer_managed_key.key_name storage_account_id = azurerm_storage_account.this.id key_vault_id = var.customer_managed_key.key_vault_resource_id key_version = var.customer_managed_key.key_version user_assigned_identity_id = try(var.customer_managed_key.user_assigned_identity.resource_id, null) lifecycle { precondition { condition = (var.account_kind == "StorageV2" || var.account_tier == "Premium") error_message = "`var.customer_managed_key` can only be set when the `account_kind` is set to `StorageV2` or `account_tier` set to `Premium`, and the identity type is `UserAssigned`." } } } resource "azurerm_role_assignment" "storage_account" { for_each = var.role_assignments principal_id = each.value.principal_id scope = azurerm_storage_account.this.id condition = each.value.condition condition_version = each.value.condition_version delegated_managed_identity_resource_id = each.value.delegated_managed_identity_resource_id role_definition_id = strcontains(lower(each.value.role_definition_id_or_name), lower(local.role_definition_resource_substring)) ? each.value.role_definition_id_or_name : null role_definition_name = strcontains(lower(each.value.role_definition_id_or_name), lower(local.role_definition_resource_substring)) ? null : each.value.role_definition_id_or_name skip_service_principal_aad_check = each.value.skip_service_principal_aad_check } resource "azurerm_storage_account_static_website" "this" { for_each = var.static_website == null ? {} : var.static_website storage_account_id = azurerm_storage_account.this.id error_404_document = each.value.error_404_document index_document = each.value.index_document } resource "azurerm_storage_account_queue_properties" "this" { for_each = var.queue_properties storage_account_id = azurerm_storage_account.this.id dynamic "cors_rule" { for_each = each.value.cors_rule content { allowed_headers = cors_rule.value.allowed_headers allowed_methods = cors_rule.value.allowed_methods allowed_origins = cors_rule.value.allowed_origins exposed_headers = cors_rule.value.exposed_headers max_age_in_seconds = cors_rule.value.max_age_in_seconds } } dynamic "hour_metrics" { for_each = each.value.hour_metrics == null ? [] : ["1"] content { version = each.value.hour_metrics.version include_apis = each.value.hour_metrics.include_apis retention_policy_days = each.value.hour_metrics.retention_policy_days } } dynamic "logging" { for_each = each.value.logging == null ? [] : ["1"] content { delete = each.value.logging.delete read = each.value.logging.read version = each.value.logging.version write = each.value.logging.write retention_policy_days = each.value.logging.retention_policy_days } } dynamic "minute_metrics" { for_each = each.value.minute_metrics == null ? [] : ["1"] content { version = each.value.minute_metrics.version include_apis = each.value.minute_metrics.include_apis retention_policy_days = each.value.minute_metrics.retention_policy_days } } }