diff --git a/terraform/modules/01.ecr/main.tf b/terraform/modules/01.ecr/main.tf index 11ee26f..bc8be3f 100644 --- a/terraform/modules/01.ecr/main.tf +++ b/terraform/modules/01.ecr/main.tf @@ -55,19 +55,19 @@ resource "aws_ecr_repository" "notification_repository" { } -# Política de ciclo de vida para manter apenas as últimas 1 imagens +# Política de ciclo de vida otimizada para manter apenas 1 imagem por tag resource "aws_ecr_lifecycle_policy" "api_repository_policy" { repository = aws_ecr_repository.api_repository.name policy = jsonencode({ rules = [ { - rulePriority = 1 - description = "Manter apenas as últimas 1 imagens para otimizar custos" + rulePriority = 1 + description = "Remove imagens não-taggeadas imediatamente (exceto a mais recente)" selection = { - tagStatus = "untagged" - countType = "imageCountMoreThan" - countNumber = 1 + tagStatus = "untagged" + countType = "imageCountMoreThan" + countNumber = 1 } action = { type = "expire" @@ -75,16 +75,29 @@ resource "aws_ecr_lifecycle_policy" "api_repository_policy" { }, { rulePriority = 2 - description = "Manter apenas as últimas 1 imagens taggeadas" + description = "Mantém apenas 1 imagem por tag específica - remove versões antigas" selection = { tagStatus = "tagged" - tagPrefixList = ["latest", "v", "dev", "prod", "staging"] + tagPrefixList = ["latest", "v", "dev", "prod", "staging", "main"] countType = "imageCountMoreThan" countNumber = 1 } action = { type = "expire" } + }, + { + rulePriority = 3 + description = "Remove qualquer imagem taggeada com mais de 1 dias (fallback de segurança)" + selection = { + tagStatus = "tagged" + countType = "sinceImagePushed" + countUnit = "days" + countNumber = 1 + } + action = { + type = "expire" + } } ] }) @@ -96,12 +109,12 @@ resource "aws_ecr_lifecycle_policy" "builder_repository_policy" { policy = jsonencode({ rules = [ { - rulePriority = 1 - description = "Manter apenas as últimas 1 imagens para otimizar custos" + rulePriority = 1 + description = "Remove imagens não-taggeadas imediatamente (exceto a mais recente)" selection = { - tagStatus = "untagged" - countType = "imageCountMoreThan" - countNumber = 1 + tagStatus = "untagged" + countType = "imageCountMoreThan" + countNumber = 1 } action = { type = "expire" @@ -109,16 +122,29 @@ resource "aws_ecr_lifecycle_policy" "builder_repository_policy" { }, { rulePriority = 2 - description = "Manter apenas as últimas 1 imagens taggeadas" + description = "Mantém apenas 1 imagem por tag específica - remove versões antigas" selection = { tagStatus = "tagged" - tagPrefixList = ["latest", "v", "dev", "prod", "staging"] + tagPrefixList = ["latest", "v", "dev", "prod", "staging", "main"] countType = "imageCountMoreThan" countNumber = 1 } action = { type = "expire" } + }, + { + rulePriority = 3 + description = "Remove qualquer imagem taggeada com mais de 1 dias (fallback de segurança)" + selection = { + tagStatus = "tagged" + countType = "sinceImagePushed" + countUnit = "days" + countNumber = 1 + } + action = { + type = "expire" + } } ] }) @@ -128,15 +154,15 @@ resource "aws_ecr_lifecycle_policy" "builder_repository_policy" { resource "aws_ecr_lifecycle_policy" "notification_repository_policy" { repository = aws_ecr_repository.notification_repository.name - policy = jsonencode({ + policy = jsonencode({ rules = [ { - rulePriority = 1 - description = "Manter apenas as últimas 1 imagens para otimizar custos" + rulePriority = 1 + description = "Remove imagens não-taggeadas imediatamente (exceto a mais recente)" selection = { - tagStatus = "untagged" - countType = "imageCountMoreThan" - countNumber = 1 + tagStatus = "untagged" + countType = "imageCountMoreThan" + countNumber = 1 } action = { type = "expire" @@ -144,16 +170,29 @@ resource "aws_ecr_lifecycle_policy" "notification_repository_policy" { }, { rulePriority = 2 - description = "Manter apenas as últimas 1 imagens taggeadas" + description = "Mantém apenas 1 imagem por tag específica - remove versões antigas" selection = { tagStatus = "tagged" - tagPrefixList = ["latest", "v", "dev", "prod", "staging"] + tagPrefixList = ["latest", "v", "dev", "prod", "staging", "main"] countType = "imageCountMoreThan" countNumber = 1 } action = { type = "expire" } + }, + { + rulePriority = 3 + description = "Remove qualquer imagem taggeada com mais de 1 dias (fallback de segurança)" + selection = { + tagStatus = "tagged" + countType = "sinceImagePushed" + countUnit = "days" + countNumber = 1 + } + action = { + type = "expire" + } } ] })