From 4ab0759e2deddce38c7af1b51c8752570cc9635d Mon Sep 17 00:00:00 2001
From: Matthew Baggett <matthew@baggett.me>
Date: Mon, 20 Jan 2025 15:59:49 +0100
Subject: [PATCH] Fix lifecycle policy to include archival policy.

---
 cloud/aws/efs_file_system/efs.tf    |  3 +++
 cloud/aws/efs_file_system/inputs.tf | 10 +++++++++-
 docker/efs-volume/efs.tf            |  2 +-
 docker/efs-volume/inputs.tf         |  9 +++++++++
 4 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/cloud/aws/efs_file_system/efs.tf b/cloud/aws/efs_file_system/efs.tf
index 2c12c41..391e3cf 100644
--- a/cloud/aws/efs_file_system/efs.tf
+++ b/cloud/aws/efs_file_system/efs.tf
@@ -3,6 +3,9 @@ resource "aws_efs_file_system" "volume" {
   lifecycle_policy {
     transition_to_ia = var.ia_lifecycle_policy
   }
+  lifecycle_policy {
+    transition_to_archive = var.archive_lifecycle_policy
+  }
   tags            = local.efs_tags
   encrypted       = true
   throughput_mode = "elastic"
diff --git a/cloud/aws/efs_file_system/inputs.tf b/cloud/aws/efs_file_system/inputs.tf
index 6575ab8..e2a312d 100644
--- a/cloud/aws/efs_file_system/inputs.tf
+++ b/cloud/aws/efs_file_system/inputs.tf
@@ -43,7 +43,15 @@ variable "ia_lifecycle_policy" {
     condition     = can(regex("AFTER_(1|7|14|30|60|90|180|270|365)_DAY[S]?", var.ia_lifecycle_policy))
   }
 }
-
+variable "archive_lifecycle_policy" {
+  default     = "AFTER_60_DAYS"
+  description = "The lifecycle policy for transitioning to Archive storage"
+  type        = string
+  validation {
+    error_message = "Must be one of AFTER_7_DAYS, AFTER_14_DAYS, AFTER_30_DAYS, AFTER_60_DAYS, AFTER_90_DAYS, AFTER_180_DAYS, AFTER_270_DAYS, AFTER_365_DAYS."
+    condition     = can(regex("AFTER_(7|14|30|60|90|180|270|365)_DAY[S]?", var.archive_lifecycle_policy))
+  }
+}
 variable "subnet_ids" {
   type        = list(string)
   description = "The subnet IDs in which the EFS file system will be available."
diff --git a/docker/efs-volume/efs.tf b/docker/efs-volume/efs.tf
index 8d33a0a..1910e33 100644
--- a/docker/efs-volume/efs.tf
+++ b/docker/efs-volume/efs.tf
@@ -4,12 +4,12 @@ module "efs_file_system" {
   users                    = local.users
   tags                     = merge(var.tags, { Name = local.display_name_ascii }, coalesce(var.application.application_tag, {}))
   ia_lifecycle_policy      = var.ia_lifecycle_policy
+  archive_lifecycle_policy = var.archive_lifecycle_policy
   application              = var.application
   origin_security_group_id = var.origin_security_group_id
   vpc_id                   = data.aws_vpc.vpc.id
   subnet_ids               = var.subnet_ids
 }
-
 data "aws_vpc" "vpc" {
   id = var.vpc_id
   lifecycle {
diff --git a/docker/efs-volume/inputs.tf b/docker/efs-volume/inputs.tf
index c3235ab..276cf66 100644
--- a/docker/efs-volume/inputs.tf
+++ b/docker/efs-volume/inputs.tf
@@ -30,6 +30,15 @@ variable "ia_lifecycle_policy" {
     condition     = can(regex("AFTER_(1|7|14|30|60|90|180|270|365)_DAY[S]?", var.ia_lifecycle_policy))
   }
 }
+variable "archive_lifecycle_policy" {
+  default     = "AFTER_60_DAYS"
+  description = "The lifecycle policy for transitioning to Archive storage"
+  type        = string
+  validation {
+    error_message = "Must be one of AFTER_7_DAYS, AFTER_14_DAYS, AFTER_30_DAYS, AFTER_60_DAYS, AFTER_90_DAYS, AFTER_180_DAYS, AFTER_270_DAYS, AFTER_365_DAYS."
+    condition     = can(regex("AFTER_(7|14|30|60|90|180|270|365)_DAY[S]?", var.archive_lifecycle_policy))
+  }
+}
 variable "origin_security_group_id" {
   description = "The security group ID to allow NFS traffic from"
 }