Amazon S3

¿Qué es AWS S3?

Amazon S3 (Simple Storage Service) es un servicio de almacenamiento de objetos diseñado para almacenar y recuperar cualquier cantidad de datos desde cualquier lugar en Internet. Es uno de los servicios fundamentales de AWS.

Características principales

1. Durabilidad y Disponibilidad

  • Durabilidad: 99.999999999% (11 nueves)
  • Disponibilidad: 99.99%
  • Replicación automática entre múltiples zonas de disponibilidad

2. Escalabilidad

  • Capacidad virtualmente ilimitada
  • Sin necesidad de provisionar capacidad
  • Escala automáticamente según demanda

3. Seguridad

  • Cifrado en tránsito (SSL/TLS)
  • Cifrado en reposo (SSE-S3, SSE-KMS)
  • Control de acceso granular (IAM, Bucket Policies, ACLs)
  • Versionado de objetos

Conceptos clave

Buckets

Contenedor para objetos almacenados en S3:

1
2
3
4
5
# Crear bucket
aws s3 mb s3://mi-bucket --region us-east-1

# Listar buckets
aws s3 ls

Objetos

Archivos y sus metadatos almacenados en S3:

1
2
3
4
5
6
7
8
# Subir archivo
aws s3 cp archivo.txt s3://mi-bucket/

# Descargar archivo
aws s3 cp s3://mi-bucket/archivo.txt ./

# Sincronizar directorio
aws s3 sync ./directorio/ s3://mi-bucket/

Clases de almacenamiento

ClaseUsoCostoDisponibilidad
StandardDatos frecuentesAlto99.99%
Intelligent-TieringAcceso variableVariable99.9%
Standard-IAAcceso poco frecuenteMedio99.9%
One Zone-IADatos no críticosBajo99.5%
GlacierArchivo largo plazoMuy bajo99.99%
Glacier Deep ArchiveArchivo muy largo plazoMínimo99.99%

Casos de uso

1. Hosting de sitios web estáticos

Perfecto para sitios generados con Hugo, Jekyll, etc:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Configurar bucket para hosting web
aws s3 website s3://mi-sitio-web/ \
    --index-document index.html \
    --error-document 404.html

# Política para acceso público
cat > policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "PublicReadGetObject",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::mi-sitio-web/*"
  }]
}
EOF

aws s3api put-bucket-policy \
    --bucket mi-sitio-web \
    --policy file://policy.json

2. Backup y archivo

1
2
3
4
# Backup con reglas de lifecycle
aws s3api put-bucket-lifecycle-configuration \
    --bucket mi-backup \
    --lifecycle-configuration file://lifecycle.json

3. Data Lake

Almacenamiento centralizado para analytics:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Configurar para uso con Athena
aws s3api put-bucket-encryption \
    --bucket mi-datalake \
    --server-side-encryption-configuration '{
      "Rules": [{
        "ApplyServerSideEncryptionByDefault": {
          "SSEAlgorithm": "AES256"
        }
      }]
    }'

4. Distribución de contenido

Combinado con CloudFront:

  • Imágenes
  • Videos
  • Descargas de software
  • Actualizaciones de aplicaciones

Seguridad y permisos

IAM Policies

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::mi-bucket/*"
    }
  ]
}

Bucket Policy

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowSSLRequestsOnly",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::mi-bucket",
        "arn:aws:s3:::mi-bucket/*"
      ],
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "false"
        }
      }
    }
  ]
}

Versionado

Protección contra eliminación accidental:

1
2
3
4
5
6
7
# Habilitar versionado
aws s3api put-bucket-versioning \
    --bucket mi-bucket \
    --versioning-configuration Status=Enabled

# Listar versiones
aws s3api list-object-versions --bucket mi-bucket

Lifecycle Policies

Automatizar transiciones entre clases de almacenamiento:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
  "Rules": [
    {
      "Id": "Archive-old-logs",
      "Status": "Enabled",
      "Filter": {
        "Prefix": "logs/"
      },
      "Transitions": [
        {
          "Days": 30,
          "StorageClass": "STANDARD_IA"
        },
        {
          "Days": 90,
          "StorageClass": "GLACIER"
        }
      ],
      "Expiration": {
        "Days": 365
      }
    }
  ]
}

Replicación

Cross-Region Replication (CRR)

1
2
3
4
# Configurar replicación entre regiones
aws s3api put-bucket-replication \
    --bucket mi-bucket-origen \
    --replication-configuration file://replication.json

Eventos y notificaciones

Trigger acciones basadas en eventos S3:

1
2
3
4
# Configurar notificación a Lambda
aws s3api put-bucket-notification-configuration \
    --bucket mi-bucket \
    --notification-configuration file://notification.json

Eventos disponibles:

  • s3:ObjectCreated:*
  • s3:ObjectRemoved:*
  • s3:ObjectRestore:*
  • s3:Replication:*

Monitoreo y logs

Server Access Logs

1
2
3
4
5
6
7
8
9
# Habilitar logs de acceso
aws s3api put-bucket-logging \
    --bucket mi-bucket \
    --bucket-logging-status '{
      "LoggingEnabled": {
        "TargetBucket": "mi-bucket-logs",
        "TargetPrefix": "access-logs/"
      }
    }'

Métricas de CloudWatch

Métricas automáticas:

  • BucketSizeBytes
  • NumberOfObjects
  • AllRequests
  • GetRequests
  • PutRequests

Optimización de costos

1. Usar clases de almacenamiento apropiadas

1
2
3
4
# Cambiar clase de storage
aws s3 cp s3://mi-bucket/archivo.txt \
    s3://mi-bucket/archivo.txt \
    --storage-class INTELLIGENT_TIERING

2. Implementar Lifecycle Policies

Mover automáticamente objetos antiguos a clases más baratas.

3. Eliminar versiones antiguas

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Regla para eliminar versiones no actuales después de 30 días
{
  "Rules": [{
    "Id": "DeleteOldVersions",
    "Status": "Enabled",
    "NoncurrentVersionExpiration": {
      "NoncurrentDays": 30
    }
  }]
}

4. Comprimir archivos

Reducir tamaño de datos almacenados:

1
2
tar -czf backup.tar.gz /datos/
aws s3 cp backup.tar.gz s3://mi-bucket/backups/

Mejores prácticas

  1. ✅ Habilitar versionado para datos críticos
  2. ✅ Usar cifrado (SSE-S3 o SSE-KMS)
  3. ✅ Implementar Lifecycle Policies para optimizar costos
  4. ✅ Configurar replicación para disaster recovery
  5. ✅ Habilitar MFA Delete para buckets críticos
  6. ✅ Usar IAM roles en lugar de access keys
  7. ✅ Monitorear con CloudWatch y CloudTrail
  8. ✅ Bloquear acceso público por defecto

Integración con CloudFront

Mejorar performance y seguridad:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# Crear OAI (Origin Access Identity)
aws cloudfront create-cloud-front-origin-access-identity \
    --cloud-front-origin-access-identity-config '{
      "CallerReference": "mi-sitio-'$(date +%s)'",
      "Comment": "OAI para mi-sitio-web"
    }'

# Actualizar bucket policy para permitir solo CloudFront
{
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E1234567890ABC"
    },
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::mi-sitio-web/*"
  }]
}

Comandos útiles

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Calcular tamaño de bucket
aws s3 ls s3://mi-bucket --recursive --human-readable --summarize

# Copiar bucket completo
aws s3 sync s3://bucket-origen s3://bucket-destino

# Eliminar todos los objetos (¡cuidado!)
aws s3 rm s3://mi-bucket --recursive

# Hacer objeto público temporalmente (presigned URL)
aws s3 presign s3://mi-bucket/archivo.txt --expires-in 3600

Límites

  • Tamaño máximo de objeto: 5 TB
  • Tamaño máximo PUT: 5 GB (usar multipart upload para archivos mayores)
  • Número de buckets por cuenta: 100 (soft limit, se puede aumentar)
  • Sin límite de objetos por bucket

Comparación con otros servicios

ServicioUsoAccesoCosto
S3Object storageHTTP/API$$
EBSBlock storage para EC2Attached$$$
EFSFile system compartidoNFS$$$$
GlacierArchive a largo plazoRetrieval time$

Conceptos Relacionados

Referencias

Herramientas útiles

  • AWS CLI: Cliente de línea de comandos
  • s3cmd: Cliente alternativo
  • CloudBerry: Cliente GUI
  • Cyberduck: Cliente FTP/SFTP/S3
  • Terraform: IaC para S3