1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
# 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
}
}
}
}
|