# Redshift subnet groups ====================================================== resource "aws_redshift_subnet_group" "this" { for_each = var.subnet_groups name = each.value.name description = each.value.description subnet_ids = each.value.subnet_ids tags = local.tags } # Redshift parameter groups =================================================== resource "aws_redshift_parameter_group" "this" { for_each = var.parameter_groups name = each.value.name family = each.value.family description = each.value.description dynamic "parameter" { for_each = each.value.parameters content { name = parameter.key value = parameter.value } } tags = local.tags } # Redshift clusters =========================================================== resource "aws_redshift_cluster" "this" { for_each = var.clusters cluster_identifier = each.value.cluster_identifier database_name = each.value.database_name master_username = each.value.master_username manage_master_password = true node_type = each.value.node_type cluster_type = each.value.cluster_type number_of_nodes = each.value.cluster_type == "single-node" ? null : each.value.number_of_nodes port = each.value.port allow_version_upgrade = each.value.allow_version_upgrade publicly_accessible = each.value.publicly_accessible encrypted = each.value.encrypted kms_key_id = each.value.kms_key_id enhanced_vpc_routing = each.value.enhanced_vpc_routing availability_zone = each.value.availability_zone availability_zone_relocation_enabled = each.value.availability_zone_relocation_enabled automated_snapshot_retention_period = each.value.automated_snapshot_retention_period preferred_maintenance_window = each.value.preferred_maintenance_window skip_final_snapshot = each.value.skip_final_snapshot final_snapshot_identifier = each.value.skip_final_snapshot ? null : coalesce(each.value.final_snapshot_identifier, "${each.value.cluster_identifier}-final") snapshot_cluster_identifier = each.value.snapshot_cluster_identifier snapshot_identifier = each.value.snapshot_identifier iam_roles = each.value.iam_roles cluster_subnet_group_name = each.value.subnet_group_name != null ? each.value.subnet_group_name : (length(var.subnet_groups) > 0 ? aws_redshift_subnet_group.this[keys(var.subnet_groups)[0]].name : null) cluster_parameter_group_name = each.value.parameter_group_name != null ? each.value.parameter_group_name : (length(var.parameter_groups) > 0 ? aws_redshift_parameter_group.this[keys(var.parameter_groups)[0]].name : null) vpc_security_group_ids = each.value.vpc_security_group_ids tags = local.tags } # Redshift cluster logging ==================================================== resource "aws_redshift_logging" "this" { for_each = { for k, v in var.clusters : k => v if v.logging != null && v.logging.enable } cluster_identifier = aws_redshift_cluster.this[each.key].id log_destination_type = "s3" bucket_name = each.value.logging.bucket_name s3_key_prefix = each.value.logging.s3_key_prefix } # Redshift scheduled actions ================================================== resource "aws_redshift_scheduled_action" "this" { for_each = var.scheduled_actions name = each.value.name schedule = each.value.schedule iam_role = each.value.iam_role_arn target_action { dynamic "pause_cluster" { for_each = each.value.action_type == "pause" ? [true] : [] content { cluster_identifier = aws_redshift_cluster.this[each.value.cluster_key].cluster_identifier } } dynamic "resume_cluster" { for_each = each.value.action_type == "resume" ? [true] : [] content { cluster_identifier = aws_redshift_cluster.this[each.value.cluster_key].cluster_identifier } } dynamic "resize_cluster" { for_each = each.value.action_type == "resize" && each.value.resize != null ? [each.value.resize] : [] content { cluster_identifier = aws_redshift_cluster.this[each.value.cluster_key].cluster_identifier node_type = resize_cluster.value.node_type number_of_nodes = resize_cluster.value.number_of_nodes cluster_type = resize_cluster.value.cluster_type } } } }