Skip to content

Commit 2ffb4fa

Browse files
committed
Allows S3 Lifecycle for RDS Dump Bucket
1 parent 0b8366c commit 2ffb4fa

File tree

4 files changed

+143
-2
lines changed

4 files changed

+143
-2
lines changed

README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1312,6 +1312,32 @@ Type: `string`
13121312

13131313
Default: `""`
13141314

1315+
### <a name="input_rds_s3_dump_lifecycle_rules"></a> [rds\_s3\_dump\_lifecycle\_rules](#input\_rds\_s3\_dump\_lifecycle\_rules)
1316+
1317+
Description: RDS S3 Dump Lifecycle rules
1318+
1319+
Type:
1320+
1321+
```hcl
1322+
list(object({
1323+
id = string
1324+
status = optional(string, "Enabled")
1325+
prefix = string
1326+
expiration = optional(list(object({
1327+
days = optional(number)
1328+
date = optional(string)
1329+
expired_object_delete_marker = optional(bool)
1330+
})), [])
1331+
transition = optional(list(object({
1332+
days = optional(number)
1333+
date = optional(string)
1334+
storage_class = string
1335+
})), [])
1336+
}))
1337+
```
1338+
1339+
Default: `[]`
1340+
13151341
### <a name="input_rds_identifier_override"></a> [rds\_identifier\_override](#input\_rds\_identifier\_override)
13161342

13171343
Description: RDS identifier override. Use only lowercase, numbers and -, \_., only use when it needs to be different from var.name

examples/rds/main.tf

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,36 @@ module "ms_sample_rds" {
2020
# rds_enabled enables RDS
2121
rds_enabled = true
2222

23+
rds_s3_dump_lifecycle_rules = [
24+
{
25+
id = "all-cleanup"
26+
status = "Enabled"
27+
prefix = ""
28+
expiration = [{
29+
days = 90
30+
}]
31+
},
32+
{
33+
id = "tmp"
34+
status = "Enabled"
35+
prefix = "tmp/"
36+
expiration = [{
37+
days = 1
38+
}]
39+
},
40+
{
41+
id = "MoveAllToGlacierAfterTwoWeeks"
42+
status = "Enabled"
43+
prefix = ""
44+
transition = [
45+
{
46+
days = 28
47+
storage_class = "GLACIER"
48+
}
49+
]
50+
}
51+
]
52+
2353
# rds_allowed_subnet_cidrs specifices the allowed subnets
2454
#rds_allowed_subnet_cidrs = ["127.0.0.1/32"]
2555

rds-s3-dumps.tf

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,3 +182,41 @@ resource "aws_db_instance_role_association" "this" {
182182
feature_name = "S3_INTEGRATION"
183183
role_arn = var.rds_s3_dump_role_arn == "" ? aws_iam_role.rds_dumps[0].arn : var.rds_s3_dump_role_arn
184184
}
185+
186+
resource "aws_s3_bucket_lifecycle_configuration" "rds_dumps" {
187+
depends_on = [aws_s3_bucket_versioning.rds_dumps]
188+
189+
count = local.rds_dumps_enabled && length(var.rds_s3_dump_lifecycle_rules) > 0 ? 1 : 0
190+
bucket = aws_s3_bucket.rds_dumps[count.index].id
191+
192+
dynamic "rule" {
193+
for_each = var.rds_s3_dump_lifecycle_rules
194+
195+
content {
196+
id = rule.value.id
197+
status = rule.value.status
198+
filter {
199+
prefix = rule.value.prefix
200+
}
201+
202+
dynamic "expiration" {
203+
for_each = rule.value.expiration
204+
205+
content {
206+
date = expiration.value.date
207+
days = expiration.value.days
208+
expired_object_delete_marker = expiration.value.expired_object_delete_marker
209+
}
210+
}
211+
212+
dynamic "transition" {
213+
for_each = rule.value.transition
214+
content {
215+
date = transition.value.date
216+
days = transition.value.days
217+
storage_class = transition.value.storage_class
218+
}
219+
}
220+
}
221+
}
222+
}

variables.tf

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,51 @@ variable "rds_s3_dump_role_arn" {
787787
default = ""
788788
}
789789

790+
variable "rds_s3_dump_lifecycle_rules" {
791+
description = "RDS S3 Dump Lifecycle rules"
792+
default = []
793+
type = list(object({
794+
id = string
795+
status = optional(string, "Enabled")
796+
prefix = string
797+
expiration = optional(list(object({
798+
days = optional(number)
799+
date = optional(string)
800+
expired_object_delete_marker = optional(bool)
801+
})), [])
802+
transition = optional(list(object({
803+
days = optional(number)
804+
date = optional(string)
805+
storage_class = string
806+
})), [])
807+
}))
808+
809+
validation {
810+
condition = length(var.rds_s3_dump_lifecycle_rules) > 0 ? alltrue([
811+
for k, v in var.rds_s3_dump_lifecycle_rules : (length(v["expiration"]) <= 1)
812+
]) : true
813+
error_message = "Only one `expiration` block is allowed."
814+
}
815+
816+
validation {
817+
condition = length(var.rds_s3_dump_lifecycle_rules) > 0 ? alltrue(flatten([
818+
for k, v in var.rds_s3_dump_lifecycle_rules : [
819+
for bk, bv in v["expiration"] : (bv["days"] == null || bv["date"] == null)
820+
]
821+
])) : true
822+
error_message = "Either `days` or `date` value should be set for `expiration`, but not both."
823+
}
824+
825+
validation {
826+
condition = length(var.rds_s3_dump_lifecycle_rules) > 0 ? alltrue(flatten([
827+
for k, v in var.rds_s3_dump_lifecycle_rules : [
828+
for bk, bv in v["transition"] : (bv["days"] == null || bv["date"] == null)
829+
]
830+
])) : true
831+
error_message = "Either `days` or `date` value should be set for `transition`, but not both."
832+
}
833+
}
834+
790835
variable "rds_identifier_override" {
791836
description = "RDS identifier override. Use only lowercase, numbers and -, _., only use when it needs to be different from var.name"
792837
default = ""
@@ -1164,15 +1209,17 @@ variable "s3_lifecycle_rules" {
11641209
condition = length(var.s3_lifecycle_rules) > 0 ? alltrue(flatten([
11651210
for k, v in var.s3_lifecycle_rules : [
11661211
for bk, bv in v["expiration"] : (bv["days"] == null || bv["date"] == null)
1167-
]])) : true
1212+
]
1213+
])) : true
11681214
error_message = "Either `days` or `date` value should be set for `expiration`, but not both."
11691215
}
11701216

11711217
validation {
11721218
condition = length(var.s3_lifecycle_rules) > 0 ? alltrue(flatten([
11731219
for k, v in var.s3_lifecycle_rules : [
11741220
for bk, bv in v["transition"] : (bv["days"] == null || bv["date"] == null)
1175-
]])) : true
1221+
]
1222+
])) : true
11761223
error_message = "Either `days` or `date` value should be set for `transition`, but not both."
11771224
}
11781225
}

0 commit comments

Comments
 (0)