Módulo Terraform CORE para la creación y gestión de múltiples buckets S3 con funcionalidades empresariales. Diseñado para proporcionar una base sólida y reutilizable para el almacenamiento en S3 con todas las características de seguridad, compliance y optimización de costos necesarias para entornos empresariales.
┌─────────────────────────────────────────────────────────────────┐
│ S3 Buckets CORE Module │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Bucket 1 │ │ Bucket 2 │ │ Bucket N │ │
│ │ │ │ │ │ │ │
│ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │
│ │ │Encryption│ │ │ │Encryption│ │ │ │Encryption│ │ │
│ │ │AES256/KMS│ │ │ │AES256/KMS│ │ │ │AES256/KMS│ │ │
│ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │
│ │ │ │ │ │ │ │
│ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │
│ │ │Versioning│ │ │ │Versioning│ │ │ │Versioning│ │ │
│ │ │+ MFA Del │ │ │ │+ MFA Del │ │ │ │+ MFA Del │ │ │
│ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │
│ │ │ │ │ │ │ │
│ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │
│ │ │Public │ │ │ │Public │ │ │ │Public │ │ │
│ │ │Access │ │ │ │Access │ │ │ │Access │ │ │
│ │ │Block │ │ │ │Block │ │ │ │Block │ │ │
│ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Advanced Features (Optional) │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │Object Lock │ │Intelligent │ │Transfer │ │ │
│ │ │(WORM) │ │Tiering │ │Acceleration │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │Lifecycle │ │Access │ │Dynamic │ │ │
│ │ │Management │ │Logging │ │Policies │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
- ✅ Múltiples buckets S3 con naming automático y consistente
- ✅ Cifrado configurable (AES256/KMS/DSSE-KMS) con validaciones obligatorias
- ✅ Versionado granular con soporte para MFA Delete opcional
- ✅ Public Access Block configurable (habilitado por defecto por seguridad)
- ✅ Políticas dinámicas con force SSL automático y políticas personalizadas
- ✅ Lifecycle Management básico con transiciones IA/Glacier/Deep Archive
- ✅ Access Logging configurable con prefijos personalizados
- ✅ Transfer Acceleration opcional para uploads grandes
- ✅ Ownership Controls configurables (BucketOwnerEnforced/BucketOwnerPreferred/ObjectWriter)
- ✅ Object Lock (WORM compliance) opcional con modos GOVERNANCE/COMPLIANCE
- ✅ Intelligent Tiering automático opcional con configuración avanzada
- ✅ Bucket Key optimization para reducir costos de KMS
- ✅ Tags obligatorios y additional_tags personalizables por bucket
- ✅ Validaciones de seguridad obligatorias para prevenir configuraciones inseguras
terraform-aws-s3-buckets-core/
├── .gitignore # Archivos a ignorar
├── CHANGELOG.md # Historial de cambios
├── README.md # Documentación principal
├── data.tf # Recursos de datos
├── locals.tf # Variables locales y transformaciones
├── main.tf # Recursos principales
├── outputs.tf # Salidas del módulo
├── providers.tf # Configuración de providers
├── variables.tf # Variables de entrada
└── sample/ # Directorio ejemplo
├── README.md # Documentación ejemplo
├── data.tf # Datos del ejemplo
├── main.tf # Configuración ejemplo
├── outputs.tf # Salidas ejemplo
├── providers.tf # Providers ejemplo
├── variables.tf # Variables ejemplo
└── terraform.tfvars.sample # Variables ejemplo
| Requisito | Versión |
|---|---|
| Terraform | >= 1.0 |
| AWS Provider | >= 5.0 |
provider "aws" {
region = "us-east-1"
default_tags {
tags = {
environment = var.environment
project = var.project
owner = "cloudops"
client = var.client
area = "infrastructure"
provisioned = "terraform"
datatype = "operational"
}
}
}{client}-{project}-{environment}-s3-{identifier}
Ejemplos:
pragma-webapp-dev-s3-uploadspragma-api-prod-s3-backupspragma-logs-staging-s3-access-logs
| Nombre | Descripción | Tipo | Requerido | Validación |
|---|---|---|---|---|
| client | Nombre del cliente | string | ✅ | Alfanumérico, 3-20 chars |
| project | Nombre del proyecto | string | ✅ | Alfanumérico, 3-30 chars |
| environment | Entorno (dev/staging/prod) | string | ✅ | Valores permitidos |
| Nombre | Descripción | Tipo | Requerido | Default |
|---|---|---|---|---|
| s3_buckets_config | Configuración de buckets S3 | map(object()) | ✅ | - |
s3_buckets_config = {
"bucket-key" = {
# Configuración básica
force_destroy = false
# Cifrado (OBLIGATORIO por seguridad)
encryption_enabled = true
encryption_type = "AES256" # AES256, KMS, DSSE-KMS
kms_key_id = null # Requerido para KMS/DSSE-KMS
bucket_key_enabled = true # Optimización de costos KMS
# Versionado
versioning_enabled = true
mfa_delete_enabled = false
# Seguridad (OBLIGATORIO)
block_public_access = true
force_ssl = true
# Políticas personalizadas
policy_statements = [
{
sid = "CustomPolicy"
effect = "Allow"
actions = ["s3:GetObject"]
principals = {
type = "AWS"
identifiers = ["arn:aws:iam::123456789012:root"]
}
condition = [
{
test = "StringEquals"
variable = "s3:x-amz-server-side-encryption"
values = ["AES256"]
}
]
}
]
# Lifecycle Management
lifecycle_rules = [
{
id = "lifecycle-rule"
status = "Enabled"
# Filtros
prefix = "documents/"
tags = { "tier" = "standard" }
# Transiciones
transition_ia_days = 30
transition_glacier_days = 90
transition_deep_archive_days = 180
# Expiración
expiration_days = 2555 # 7 años
# Versiones no actuales
noncurrent_version_transition_ia_days = 30
noncurrent_version_transition_glacier_days = 60
noncurrent_version_expiration_days = 365
# Multipart uploads
abort_incomplete_multipart_upload_days = 7
}
]
# Access Logging
enable_logging = true
log_bucket = "my-log-bucket"
log_prefix = "access-logs/"
# Transfer Acceleration
transfer_acceleration_enabled = false
# Ownership Controls
object_ownership = "BucketOwnerEnforced"
# Object Lock (WORM compliance)
object_lock_enabled = false
object_lock_configuration = {
mode = "GOVERNANCE" # GOVERNANCE, COMPLIANCE
days = 30
years = null
}
# Intelligent Tiering
intelligent_tiering_enabled = false
intelligent_tiering_config = {
name = "intelligent-tiering"
status = "Enabled"
prefix = ""
tags = {}
# Campos opcionales para análisis
optional_fields = ["BucketKeyStatus", "EncryptionStatus"]
# Tiers avanzados
deep_archive_access_tier = false
archive_access_tier = false
}
# Etiquetas adicionales específicas
additional_tags = {
purpose = "document-storage"
tier = "standard"
}
}
}| Nombre | Descripción | Tipo |
|---|---|---|
| bucket_ids | IDs de buckets creados | map(string) |
| bucket_arns | ARNs de buckets creados | map(string) |
| bucket_names | Nombres completos de buckets | map(string) |
| bucket_domain_names | Nombres de dominio de buckets | map(string) |
| bucket_regional_domain_names | Nombres de dominio regionales | map(string) |
| encryption_configuration | Configuración de cifrado | map(object) |
| versioning_status | Estado de versionado | map(string) |
| public_access_block_status | Estado de bloqueo público | map(object) |
| ownership_controls | Controles de propiedad | map(string) |
| buckets_with_object_lock | Buckets con Object Lock | map(string) |
| buckets_with_intelligent_tiering | Buckets con Intelligent Tiering | map(string) |
| buckets_with_acceleration | Buckets con Transfer Acceleration | map(string) |
| buckets_with_logging | Buckets con Access Logging | map(object) |
| module_summary | Resumen de configuración | object |
| account_id | ID de cuenta AWS | string |
| region | Región AWS | string |
module "s3_buckets_core" {
source = "git::https://github.com/somospragma/terraform-aws-s3-buckets-core.git?ref=v1.0.0"
client = "pragma"
project = "webapp"
environment = "dev"
s3_buckets_config = {
"uploads" = {
# Configuración mínima con seguridad por defecto
encryption_enabled = true
encryption_type = "AES256"
versioning_enabled = true
# Lifecycle básico
lifecycle_rules = [
{
id = "basic-lifecycle"
status = "Enabled"
transition_ia_days = 30
abort_incomplete_multipart_upload_days = 7
}
]
additional_tags = {
purpose = "user-uploads"
}
}
}
providers = {
aws.project = aws.project
}
}module "s3_buckets_core" {
source = "git::https://github.com/somospragma/terraform-aws-s3-buckets-core.git?ref=v1.0.0"
client = "pragma"
project = "webapp"
environment = "prod"
s3_buckets_config = {
# Bucket para uploads con características básicas
"uploads" = {
encryption_type = "AES256"
versioning_enabled = true
lifecycle_rules = [
{
id = "uploads-lifecycle"
status = "Enabled"
transition_ia_days = 30
transition_glacier_days = 90
noncurrent_version_expiration_days = 365
abort_incomplete_multipart_upload_days = 7
}
]
additional_tags = {
purpose = "user-uploads"
tier = "standard"
}
}
# Bucket para backups con todas las características
"backups" = {
# Cifrado avanzado con KMS
encryption_type = "KMS"
kms_key_id = "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012"
bucket_key_enabled = true
# Versionado con protección
versioning_enabled = true
# Object Lock para compliance
object_lock_enabled = true
object_lock_configuration = {
mode = "GOVERNANCE"
days = 30
}
# Intelligent Tiering para optimización automática
intelligent_tiering_enabled = true
intelligent_tiering_config = {
name = "backup-tiering"
status = "Enabled"
prefix = "backups/"
deep_archive_access_tier = true
archive_access_tier = true
optional_fields = ["BucketKeyStatus", "EncryptionStatus"]
}
# Transfer Acceleration para uploads grandes
transfer_acceleration_enabled = true
# Lifecycle completo
lifecycle_rules = [
{
id = "comprehensive-lifecycle"
status = "Enabled"
prefix = "backups/"
transition_ia_days = 30
transition_glacier_days = 90
transition_deep_archive_days = 180
noncurrent_version_transition_ia_days = 30
noncurrent_version_transition_glacier_days = 60
noncurrent_version_expiration_days = 2555 # 7 años
abort_incomplete_multipart_upload_days = 1
}
]
# Políticas personalizadas
policy_statements = [
{
sid = "AllowCloudTrailAccess"
effect = "Allow"
actions = [
"s3:PutObject",
"s3:GetBucketAcl"
]
principals = {
type = "Service"
identifiers = ["cloudtrail.amazonaws.com"]
}
condition = [
{
test = "StringEquals"
variable = "s3:x-amz-acl"
values = ["bucket-owner-full-control"]
}
]
}
]
additional_tags = {
purpose = "backup-storage"
tier = "premium"
compliance = "required"
retention = "7-years"
}
}
# Bucket para logs con configuración específica
"logs" = {
encryption_type = "AES256"
versioning_enabled = false # Los logs no necesitan versionado
lifecycle_rules = [
{
id = "log-retention"
status = "Enabled"
transition_ia_days = 7 # Transición rápida para logs
expiration_days = 90 # Retención de 90 días
abort_incomplete_multipart_upload_days = 1
}
]
object_ownership = "BucketOwnerPreferred" # Para logs de servicios
additional_tags = {
purpose = "access-logs"
tier = "logs"
}
}
}
providers = {
aws.project = aws.project
}
}- ✅ Cifrado habilitado por defecto para todos los buckets
- ✅ Acceso público bloqueado por defecto para prevenir exposición accidental
- ✅ Conexiones SSL/TLS obligatorias mediante políticas automáticas
- ✅ Políticas de menor privilegio aplicadas por defecto
- ✅ Validaciones de configuración para prevenir configuraciones inseguras
- ✅ Logging y auditoría configurables para compliance
- ✅ Object Lock disponible para requisitos WORM
- ✅ Versionado para recuperación y auditoría
- ✅ Tags obligatorios para governance y seguimiento
- Bucket Key optimization: Reduce costos de KMS hasta 99%
- Intelligent Tiering: Optimización automática de costos de almacenamiento
- Lifecycle Management: Transiciones automáticas a clases de almacenamiento más económicas
- Abort incomplete multipart uploads: Previene costos por uploads abandonados
- Transfer Acceleration: Solo habilitar cuando sea necesario (tiene costos adicionales)
- Object Lock (WORM): Para requisitos de retención inmutable
- Versionado: Para auditoría y recuperación de datos
- Access Logging: Para compliance y auditoría de acceso
- Tags obligatorios: Para governance y seguimiento de costos
- Políticas dinámicas: Para control de acceso granular
Este módulo sigue las convenciones de Pragma CloudOps. Para contribuir:
- Fork del repositorio
- Crear rama feature/
- Seguir las reglas de commit conventional
- Abrir Pull Request
Proprietary - Pragma S.A.S.
Para soporte técnico, contactar al equipo CloudOps de Pragma.